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) |
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:
|
- 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 |
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:
Quote:
|
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