Cơ chế lây file của virus sử dụng kỹ thuật delta

Cơ chế lây file của virus sử dụng kỹ thuật delta


I. Mục đích của bài viết:


- Giúp người đọc hiểu được sâu hơn về cơ chế cũng như kỹ thuật lây file của virus lây file để phục vụ trong quá trình phân tích, bóc tách và gỡ bỏ virus.

1. Các kiến thức yêu cầu khi đọc bài viết:

- Kiến thức về kiến trúc máy tính.
- Ngôn ngữ assembly. 
- Cấu trúc file PE.
- Windows API

2. Các thuật ngữ sử dụng trong bài viết

- File host: là file sạch chưa bị nhiễm virus
- Code virus: đoạn chương trình của virus.
- EntryPoint: là câu lệnh đầu tiên được thực thi của 1 chương trình.
- API: là các hàm trong các thư viện chuẩn của windows

II. Giới thiệu về PE file.
1. Định nghĩa:
- PE (Portable Executable) là định dạng riêng của hệ điều hành windows. Hầu hết các file thực thi trên Windows đều thuộc dạng PE (Trừ các tập tin VxDs và các file DLL 16 bits).
- Các file thực thi phổ biến nhất là trên hệ điều hành Windows có đuôi mở rộng: .com, .exe, .dll, .pif, .sys...

2. Cấu trúc file PE
- Cấu trúc file PE khá phức tạp. Để tìm hiểu chi tiết về cấu trúc của PE file, các bạn có thể tìm đọc tài liệu tại: “http://win32assembly.programminghori...m/pe-tut1.html

III. Nguyên lý cơ bản để viết virus lây file.

1. Định nghĩa Virus lây file:
- Định nghĩa: là những file chứa mã độc có hành vi chèn mã thực thi vào các file PE.
- Đặc điểm: Virus lây file không tồn tại ở một file độc lập mà gắn vào chương trình khác trên máy, khiến người dùng khó phát hiện ra chúng và kể cả khi phát hiện cũng không thể xóa file virus đi được vì như thế là xóa luôn chương trình gốc ban đầu.
- Khó khăn khi xử lý: Khi bị nhiễm virus, người dùng thường nghĩ cài lại win sẽ hết nhưng khi gặp virus file, dù có cài lại win xong (thường sẽ format ổ cài win) khi ta chạy file bị nhiễm ở ổ khác virus sẽ lại lây lại vào toàn bộ hệ thống.

2. Các nguyên lý cơ bản 
- Đây là các bước cơ bản mà virus cần phải thực hiện khi muốn lây nhiễm vào một chương trình khác.
- Chèn code virus vào file muốn lây nhiễm.
- Chuyển EntryPoint (địa chỉ lệnh đầu tiên của file được thực hiện) đến vùng code thực thi của virus.
- Sau khi thực thi code virus xong sẽ trả quyền điều khiển về cho host (file gốc).



3. Các kỹ thuật liên quan:

Đây là các kỹ thuật cơ bản mà virus lây file sẽ sử dụng trong quá trình thực thi:
- Sửa header của file host:
Sau khi thêm mã thực thi của mình vào file host thì lúc này các thông tin trong header vẫn là của file host, virus sẽ sửa lại một số giá trị trong header cho phù hợp với file sau khi được chèn thêm đoạn mã của virus. - Kỹ thuật delta:
Khi mã virus được chèn vào file host, các thông tin về địa chỉ của mã virus sai lệch một khoảng nào đó tùy từng file host. Kỹ thuật delta là kỹ thuật dùng để xác định độ sai lệch đó. 
- Kỹ thuật lấy địa chỉ các hàm API:
Các thư viện và các hàm API mà virus muốn dùng chưa chắc đã có trong bảng import của file host. Trong trường hợp đó, trình loader sẽ không load sẵn các thư viện đó lên bộ nhớ, do đó virus sẽ phải tự mình đi load các thư viện và tìm các hàm API mà mình muốn dùng.
- Kỹ thuật trả lại quyền điều khiển chương trình về cho host:
Sau khi thực hiện xong các đoạn code của mình thì virus sẽ phải trả lại quyền thực thi cho các file host để tránh bị người dùng nghi ngờ. 

IV. Hướng dẫn chi tiết các kỹ thuật.


1. Kỹ thuật delta.
- Kỹ thuật delta mục đích là tính ra khoảng cách từ code virus tới đầu file và lưu trữ lại khoảng cách đó. Sau đó tất cả các câu lệnh truy suất tới các địa chỉ trong code virus chỉ cần dùng khoảng cách đó cộng với địa chỉ tương đối của bộ nhớ cần truy suất tới đầu code virus thêm vào là có thể tính ra địa chỉ thực sự trên bộ nhớ.


Kỹ thuật delta được thực hiện rất đơn giản như sau:



- Sau khi thực hiện đoạn code trên thì thanh ghi ebp đã lưu được địa chỉ tương đối so với đầu file của đoạn code virus (chính là giá trị 7 hay 10 trong hình vẽ).
- Từ bây giờ muốn truy suất tới một biến trong vùng nhớ ta chỉ việc cộng địa chỉ biến với ebp.

2. Kỹ thuật lấy địa chỉ hàm API.

- Khi bắt đầu được thực thi, gần như virus chưa có trong tay bất kỳ thư viện hay hàm API nào đi cùng. Công việc khó khăn là nó sẽ phải load được các thư viện mình cần lên bộ nhớ và tìm được địa chỉ các hàm API cần thiết sẽ sử dụng.
- Để thực hiện được mục đích trên, virus thường sử dụng 2 hàm đó là: LoadLibrary để load thư viện và GetProcAddress để lấy địa chỉ các hàm trong thư viện đó.
- Câu hỏi khác lại đặt ra: Làm sao để gọi được 2 hàm trên? Có một điều may mắn là cả 2 hàm trên đều nằm trong thư viện kernel32.dll. Thư viện này luôn được load lên cùng file do đó có thể đi tìm địa chỉ của kernel32.dll trên bộ nhớ sau đó sẽ đi tìm 2 hàm quan trọng kia.
- Lý thuyết là vậy nhưng thực tế ta chỉ tìm hàm GetProcAddress là có thể lấy được hàm LoadLibrary.

Cụ thể ta có thể làm như sau:



- Lúc này ta đã có được Handle của kernel32.dll và địa chỉ hàm GetProcAddress. Các công việc còn lại có vẻ đã đơn giả đi nhiều. 
Giờ đây muốn lấy thư viện hay thêm hàm nào thì phụ thuộc vào mục đích của virus.

Chú ý: trong đoạn code trên có sử dụng kỹ thuật tìm địa chỉ kernel32.dll dựa trên cấu trúc PEB (Process Environment Block), cấu trúc PE file và cấu trúc bảng Export của PE file.
- Bạn có thể tìm hiểu về PEB tại địa chỉ: http://en.wikipedia.org/wiki/Process_Environment_Block
- Ngoài ra bạn cũng có thể tìm địa chỉ thư viện kernel32.dll dựa vào địa chỉ trả về của Windows loader - đỉnh stack lúc đó chính là một vùng nhớ trong kernel32.dll.




3. Sửa lại Header của file.

Chúng ta sẽ nhìn nhận lại xem các trường nào của PE header sẽ cần phải được sửa lại.
- Đầu tiên sẽ là SizeOfImage : Kích thước của file đã tăng lên do đó trường này cũng sẽ phải thay đổi cho phù hợp.
- Số lượng section: Nếu virus thêm một section vào cuối file thì phải thêm vào bảng section table một section tương ứng và tăng số lượng section trong trường NumberOfSections.
- Sửa lại EntryPoint: Sửa lại Entrypoint trỏ đến lệnh đầu tiên của virus, để virus có thể thực thi mỗi khi phải host được thực thi. Trước khi sửa virus phải lưu lại giá trị Entrypoint gốc của trường trình để khi virus thực thi xong sẽ trả lại quyền điều khiển cho chương trình host.




Đoạn code sửa lại một số trường trong PE Header.
4. Các điểm cần chú ý khác:



Duyệt tìm file để lây nhiễm sử dụng hai API: FindFirstFile và FindNextFile



Trả quyền điều khiển cho chương trình host
V. Cách diệt và xử lý.

Với cớ chế lây của virus đã nêu ở trên. Chúng ta có thể rút ra được cơ chế để viết 1 chương trình diệt virus lây file như sau:
- B1: Khôi phục lại code gốc của file host nếu bị virus mã hóa
- B2: Khôi phục lại Entrypoint trỏ vể chương trình của file host
- B3: Cắt bỏ phần virus.
- B4: Khôi phục lại các trường quan trọng của PE Header.

VI.Tổng kết
- Trên đây là kỹ thuật của virus khi lây file. Bài viết chỉ mang tính chất giới thiệu cơ chế cũng như các kỹ thuật của virus lây file để giúp người đọc hiểu hơn về virus và có thể tự phân tích và viết chương trình gỡ bỏ virus khi máy bị lây nhiễm. 
- Các trường hợp nếu người đọc sử dụng kiến thức trong bài viết vào mục đích xấu phải chịu hoàn toàn trách nhiệm và thiệt hại đã gây ra.