Trao đổi với tôi

http://www.buidao.com

11/12/09

[Anti Virus] Các kỹ thuật nhận dạng virus

Do hiểu biết còn hạn chế rất mong nhận được ý kiến đóng góp của tất cả mọi người. Chúng ta hãy cùng thảo luận thật sôi nổi để làm sáng tỏ chủ đề này nhé!

Các bài viết liên quan

[1] Kỹ thuật nhận dạng virus đơn giản và code minh họa
[2]
Thuật toán tìm kiếm chuỗi Knuth-Morris-Pratt

Làm thế nào để nhận dạng virus? Đây dường như là câu hỏi mà tất cả những người nghiên cứu về virus nói chung và anti-virus nói riêng quan tâm.

Quote:
Mục lục:

A. Nhận dạng tuyệt đối :
Nhận dạng chính xác một mẫu virus là virus hay không
I.1. Các mã nhận dạng theo mã hash : MD5, SHA, CRC...
I.1.a. Lấy hash toàn file
I.1.b. Lấy hash theo 1 phần thông tin quan trọng

I.2. Scan theo string
I.2.a. Xét theo offset tĩnh hoàn toàn
I.2.b. Theo vị trí offset tương đối
I.2.c. [Mở rộng] Các hình thức khác nhau của 1 sign định dạng string
I.2.c.a. String đơn giản
I.2.c.b. String phức hợp

B. Nhận dạng tương đối :
Nhận dạng chính xác một mẫu có mang theo những nguy cơ là virus hay không, mang tính ước lượng.
I. Heuristic
I.1. String đơn
I.2. Sử dụng các string với các toán tử logic

II. Nhận dạng theo hành vi (Behavior)
Anh em tiếp tục bổ xung :
Sau đây em xin khơi mào phần scan

I.1 Các mã nhận dạng theo mã hash : MD5, SHA, CRC..

Bản chất của một file bất kỳ thật ra là một chuỗi binary dài, nên chúng ta có thể coi chúng là một chuỗi string và tiến hành lấy mã hash của file. Do tính chất của mình, mã hash này gần như là duy nhất (Có một xác xuất đụng, tuy nhiên tỉ lệ là rất thấp).
Khi chúng ta đã có mẫu của 1 virus chúng ta sẽ có thể lấy được từ mẫu đó một mã hash.
Khi đó việc nhận dạng một file có phải là virus hay không chính là việc tạo mã hash file đó rồi so sánh hash đó với hash mẫu virus.

I.1.a. Lấy hash toàn file

Thao cách nhận dạng này, chúng ta lấy mã hash toàn file.

Thuận lợi :
- Lấy hash dễ dàng
- Dễ dàng tăng số mã nhận dạng virus do trên nhiều trang web về bảo mật thường chia sẽ mã hash các mã độc họ có.
Bất lợi :
- Thời gian tạo hash chậm, nhất là với file có kích thước lớn
- Chỉ có thể nhận dạng các loại virus tĩnh (Không có thay đổi cấu trúc khi nhân bản)

I.1.b. Lấy hash theo 1 phần thông tin quan trọng
Một số dùng hash một vùng nhỏ chứa thông tin quan trọng nào đó.
Ví dụ như đối với định dạng file thực thi (Thường có dạng .exe) thì chúng ta lấy hash phần thông tin cơ bản của file đó như PE header (Portable executable).

Thuận lợi :
- Tốc độ lấy hash sẽ nhanh hơn các lấy hash toàn file rất nhiều.
Bất lợi :
- Chỉ có thể áp dụng với một số định dạng nhất định.

I.2 Scan theo string
Đây là cách cổ điển nhất và cũng là thông dụng nhất hiện này. Theo cá nhân tôi nghĩ phương pháp này tương ứng như sau :
I.2.1 Tại vị trí offset nhất định :
- Xét theo offset tĩnh hoàn toàn : Ở trong cách này thì chỉ đơn thuần xác định string nào, tại vị trí offset là bao nhiêu, ta sử dụng sign này để nhận dạng 1 file có phải là virus hay không.

Chúng ta có thể coi một hình ảnh minh họa về mã nhận dạng với offset tương ứng với virus FunnyIM như sau :



Thuận lợi :
- Cách thức update 1 sign và scan khá dễ thực hiện
Bất lợi :
- Cách scan này khá bị động với họ virus. Ví dụ nếu tôi tìm cách chèn thêm hay xóa 1 byte trong file binary của virus (Vẫn phải đảm bảo virus chạy được) mà byte này nằm trước phần offset sign thì tất yếu phương pháp này sẽ không thể nhận ra mẫu virus sau khi bị thay đổi.
Bạn có thể coi ví dụ ở đây : http://www.virusvn.com/forum/showthread.php?t=1161

- Theo vị trí offset tương đối : Ở cách này, địa chỉ offset sẽ được tính dựa vào một thành phần nào đó (Như Entry Point, Section thứ mấy ...)
Bạn có thể coi ví dụ scan dựa vào offset tương đối theo Entry Point tại đây : http://www.virusvn.com/forum/showthr...newpost&t=1846

Việc xét như thế này có thể mở rộng ra như offset : Entry Point + Số nào đó

Sau đây chúng ta sẽ xem xét một ví dụ với việc so sánh cấu trúc 2 biến thể khác nhau của dòng : w32.funnyIM.worm
Ban đầu chúng ta xác định địa chỉ Entry Point 2 mẫu virus :



Chúng ta quan sát hình sau :



Chúng ta sẽ có 2 string tương đồng, nhưng ở 2 offset khác nhau (Từ sau, mỗi khi nhắc đến các string từ file nhị phân, tôi sẽ viết dạng chuỗi các số hexan (Thập lục phân) để tiện quan sát) :



Nhìn 2 bảng số liệu trên chúng ta có thể tạo một mã nhận dạng chung cho cả 2 virus này là :
Quote:
Mã nhận dạng w32.funnyIM.worm
Quote:
String : 64 75 6E 67 63 6F 69 00
Offset : Địa chỉ Entry Point + 60
Thuận lợi :
- Việc mở rộng như thế này sẽ làm mở rộng dải virus có thể được nhận dạng. Ví dụ nếu bạn có chỉnh sửa một số byte như cách bên trên thực hiện nhưng nếu sau vị trí Entry Point như cũ và vẫn còn tồn tại các byte như ban đầu thì vẫn có thể bị nhận ra bằng 1 sign đã cập nhật theo cách này
Bất lợi :
- Việc cập nhật đòi hỏi nhiều thông tin hơn phương pháp offset tĩnh
- Scan engine phải có cơ chế làm việc phức tạp hơn để thích ứng với cơ chế scan này.
- Do phương pháp này lấy vị trí offset dựa vào một phần thông tin nào đó của một định dạng file thích hợp nên bị giới hạn một số định dạng file.

I.2.c. [Mở rộng] Các hình thức khác nhau của 1 sign định dạng string
I.2.c.a. String đơn giản

Bên trên chúng ta đã nói qua về phương pháp sử dụng string đơn giản để nhận dạng virus.
Sử dụng string đơn giản, tức là chúng ta chỉ lấy một đoạn string từ mẫu virus và thêm vào bảng mã nhận dạng và thêm tham số về offset.

I.2.c.b. String phức hợp
Để gia tăng khả năng nhận dạng một số virus tự biến đổi cấu trúc nhất định khi nhân bản, cũng như khả năng dùng một mã nhận dạng để nhận dạng những virus thuộc cùng một dòng (Có không nhiều thay đổi trong cấu trúc), thì người ta thường sử dụng mã nhận dạng string bằng các string phức hợp.

Các ví dụ giới đây sẽ giới thiệu một số loại phức hợp thông dụng.

Chúng ta sẽ cùng xét Mẫu 1 trong 2 mẫu virus đã xét ở bên trên để cụ thể hóa từng mã nhận dạng trong các ví dụ.


Cấu trúc sẽ xét

Chú ý :
- Cho sign1 , sign2 là 2 string đã có
Ở đây ta lấy :



- Các hình thức ký hiệu của tác giả viết để cụ thể hóa cho bạn đọc dễ hiểu, trong thực tế dữ liệu không phải luôn như vậy.

Các dạng string phức hợp sử dụng các ký hiệu đại diện cho một hình thức dữ liệu nào đó. Sau đây là các ký tự cùng ý nghĩa thông dụng như sau :



B. Nhận dạng tương đối :
I. Nhận dạng virus theo Heuristic

I.1. String đơn

- Cũng bằng nguyên tắc scan string. Tuy nhiên với nguyên tắc nhận dạng 1 đoạn string nào đó (Bản chất với file thực thi là loạt các opcode) thường virus sử dụng để nhận dạng.
Những string này là những đoạn code mà virus thường sử dụng lặp đi lặp lại nhiều lần nhằm thực hiện thao tác nào đó của virus.

Như ví dụ với một đoạn Script VBS sau :
Quote:
Set go = CreateObject(fgo)
Set St = CreateObject(“Outlook.Application”)
Set out = Wscript.CreateObject(“Outlook.Application”)
Set MAPI = out.GetNameSpace(“MAPI”)
Set a = MAPI.AddressLists(1)
For X = 1 To a.AddressEntries.Count
Set Mail = St.CreateItem(0)
Mail.To = St.GetNameSpace(“MAPI”).AddressLists(1).AddressEnt ries(X)
Mail.Subject = “Tên nội dung Mail” ‘Ví dụ : This is card Valentine
Mail.Body = “Nội dung email” ‘Ví dụ : This is my lover
Mail.Attachments.Add = AppVirus ‘Đây là phần file đính kèm
Mail.Send
Next
Chúng ta có thể nhận ra, đây là đoạn code gửi mail truyền thống.

I.2. Sử dụng các string với các toán tử logic

Rõ ràng với nguyên tắc nhận dạng mà chúng ta vừa nói bên trên khá mập mờ, không thể chỉ nhận ra một đoạn code gửi mail kia mà quy kết virus được, như vậy quá nguy hiểm, sẽ nhận nhầm rất nhiều phần mềm sạch.

Rõ ràng với nguyên tác này khá mập mờ, không thể nhìn 1 đoạn code gửi mail kia mà quy kết virus được, như vậy quá nguy hiểm.
Như vậy chúng ta có thể dùng các toán tử HỢP (VÀ) , HOẶC để gia tăng sự chính xác trong phán đoán :

Ví dụ tôi dùng sign theo câu câu văn như sau :

Quote:
Nếu 1 file .vbs có string :
Quote:
Set go = CreateObject(fgo)
Set St = CreateObject(“Outlook.Application”)
Set out = Wscript.CreateObject(“Outlook.Application”)
Set MAPI = out.GetNameSpace(“MAPI”)
Set a = MAPI.AddressLists(1)
For X = 1 To a.AddressEntries.Count
Set Mail = St.CreateItem(0)
Mail.To = St.GetNameSpace(“MAPI”).AddressLists(1).AddressEnt ries(X)
Mail.Subject = “Tên nội dung Mail” ‘Ví dụ : This is card Valentine
Mail.Body = “Nội dung email” ‘Ví dụ : This is my lover
Mail.Attachments.Add = AppVirus ‘Đây là phần file đính kèm
Mail.Send
Next
trong file đó còn có string

Quote:
Set reg = CreateObject("WScript.Shell")
reg.regwrite
"HKEY_LOCAL_MAHINE\Software\Microsoft\Windows\Curr entVersion\Run\Start
Thì file đó là virus gì gì đó
Okie, chúng ta dễ dàng nhận ra đoạn sign này sẽ chắc chắn hơn sign trên.

Thuận lợi :
- Cho phép nhận dạng những loại virus ngay cả khi chưa có mẫu virus đó (Thậm chí virus đó còn chưa xuất hiện).

Bất lợi :
- Việc cập nhật đòi hỏi rất nhiều thời gian và kiến thức của người cập nhật
- Do tính chất của cơ chế, nên việc nhận dạng nhầm là tồn tại với một tỷ lệ nhất định (Thông thường là thấp ở một mức độ chấp nhận được).


anh em tiếp tục nào


Các cập nhật :
7/11/2009 : Chỉnh sửa các từ nhân xưng theo góp ý anh Rồng
8/11/2009 :
- Theo góp ý anh Leaf : Thêm phần mở rộng thuộc nguyên tắc quét string. Thêm 1 khái niệm mới là String phức hợp
- Thêm phần minh họa ví dụ minh họa cho các phương phán scan string