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 đều quan tâm.
Mục lục:
Code:
A. Nhận dạng chính xác:
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 :
I. Heuristic
I.1. String đơn
I.2. Sử dụng các string với các toán tử logic
II. Các cơ chế nhận dạng theo hành vi
II.1. Cơ chế nhận dạng theo hành vi thời gian thực
II.2. Cơ chế mô phỏng máy thật (Tạo máy ảo)
I - Signature based detection - Nhận dạng chính xác mẫu
- Là công việc nhận dạng chính xác virus khi các AV đã có mẫu (file) của virus đó.
- Là công việc thường xuyên, hàng ngày của các AV, đơn giản nhưng ko thể thiếu thậm chí đóng vai trò quyết định tới chất lượng của một AV.
- Là thành phần chính của mọi AV. Số mã nhận dạng càng lớn thì khả năng của AV đó càng được đánh giá cao.
- Tất cả các kỹ thuật nhận dạng khác ra đời đều với mục đích bổ trợ cho những thiếu sót của kỹ thuật nhận dạng theo mẫu này. Vì thế ngoài cách phân loại trên người ta có thể phân các kỹ thuật nhận dạng virus thành hai loại: "nhận dạng chính xác" (Signature based detection) và "nhận dạng tương đối" (các kỹ thuật còn lại).
Ưu điểm:
- Độ chính xác cao, ít nhầm lẫn.
- Kết quả diệt virus tốt hơn. Các kỹ thuật nhận diện "tương đối" chỉ cho phép nghi ngờ 1 file có phải là virus hay không. Nhận diện "chính xác" cho phép loại bỏ các triệu chứng đi kèm với virus, khôi phục lại hệ thống.
Nhược điểm:
- Khuyết điểm lớn nhất đó là kỹ thuật nhận dạng chính xác không thể đối phó được với các virus mới hoặc chưa xuất hiện khi chưa có mẫu để nhận diện.
- Khả năng nhận diện các biến thể của virus theo họ không cao.
- Khối lượng database để lưu trữ lớn. Kích thước chủ yếu của một AV phụ thuộc vào lượng mã nhận diện này.
- Phải cập nhật liên tục, đòi hỏi nhiều chi phí về thời gian, tiền bạc, công sức ...
I.1 Hash Signature Detection - Nhận dạng theo mã hash (MD5, SHA, CRC..)
Đọc thêm các bài viết sau để hiểu rõ Hash là gì?
Ưu điểm:
- Việc xây dựng bảng mã nhận diện đơn giản, dễ dàng, có thể tiến hành tự động, do đó giúp các AV nhanh chóng cập nhật các mẫu virus mới.
- Tổ chức bảng mã nhận dạng đơn giản.
- So với các kiểu nhận dạng chính xác khác, nhận diện theo mã hash cần tương đối ít bộ nhớ hơn để lưu trữ mã nhận diện (với 32 byte đối với MD5, chúng ta cần khoảng 45Mb để nhận diện 3 triệu mẫu virus).
Nhược điểm:
- 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). Hoàn toàn bất lực trước các virus đa hình.
- Không có (cực yếu) khả năng nhận dạng các biến thể của họ virus.
- Có xác xuất trùng lặp
I.1.a - Hash toàn bộ file
- Cách đơn giản nhất để tạo signature nhận diện đặc chưng cho một mẫu virus là tính hash đặc chưng cho cho toàn bộ file mẫu. Các thuật toán hash thường được sử dụng trong trường hợp này là MD5, SHA1, SHA256 ... có xác xuất trùng lặp đủ thấp để có thể sử dụng làm signature đặc chưng cho một file.
Ví dụ khi quét virus online trên virustotal mã hash được xem là thông số đại diện của file:
Ưu điểm:
- Cách thực hiện đơn giản.
- Mã nhận dạng MD5 của virus được cung cấp miễn phí trên mạng tại nhiều website chuyên ngành.
Nhược điểm:
- Chi phí tính toán cao. Thời gian tính hash chậm, nhất là với file có kích thước lớn. Nhược điểm này bộc lộ rõ khi quét virus cho tất cả các file trong toàn bộ hệ thống.
I.1.b. Lấy hash theo 1 phần thông tin quan trọng
- Để khắc phục nhược điểm trên người ta đã cải tiến bằng cách chỉ tính hash của một vùng nhỏ chứa thông tin quan trọng nào đó.
Ví dụ đối với file thực thi(.exe, .com, .dll, .ocx, .sys ...):
Phần thông tin quan trọng có thể là:
+ PE header (Portable executable)
+ Vùng nhớ xung quan Entry Point của chương trình
...
- Việc lựa chọn vùng thông tin nào là quan trọng phụ thuộc vào chiến lược riêng của từng hãng AV.
Ưu điểm:
- Đã cải tiến được tốc độ lấy hash đáng kể so với phương pháp lấy hash toàn file.
Nhược điểm:
- Cài đặt phức tạp hơn.
- Không phải tất cả các định dạng file đều có thể lựa chọn được vùng chứa thông tin quan trọng, đặc trưng do đó, chỉ có thể áp dụng với một số định dạng nhất định.
I.2 - String Signature Detection
Đây là cách cổ điển nhất và vẫn được sử dụng phổ biến trong hầu hết các AV hiện nay.
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à :
Mã nhận dạng w32.funnyIM.worm
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 :
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).Addres sEntries(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 :
Nếu 1 file
.vbs có string :
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).Addres sEntries(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
Và trong file đó còn có string
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).
Sau đây sẽ là ví dụ cụ thể hơn nữa về kỹ thuật nhận dạng này ở phần mềm một phần mềm rất nổi tiếng là Avira AntiVir, cũng là một trong những AntiVirus có scan engine và database mạnh nhất thế giới (Theo kết quả các bài kiểm nghiệm của Virus Bulletin và AV-Comparative)
Chúng ta sẽ sử dụng code trên ngôn ngữ VB6 để theo dõi. Avira sẽ được cấu hình ở chế độ Scan Heuristic cao nhất để tiện quan sát.
1. Khởi tạo 1 dự án mới có code như sau :
Code:
Private Sub Form_Load()
Dim strKey As String
strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
End Sub
Biên dịch ra và quét :

Xem xét :
Xét trong cấu trúc tập tin ta sẽ thấy xuất hiện string sau :

Dễ nhận ra đây cũng chính là string mà trong code chúng ta có nhập vào.
Đây có thể tính là một string nhạy cảm, do nó là đường dẫn khóa tạo khởi động trong registry.
Việc hiện quá lộ liễu đã làm Avira nhận ra đây là virus. Vậy chúng ta hãy thử dung cách khai báo string này khác đi, xem có đúng chúng ta có nghĩ đứng hướng hay không.
2. Code như sau :
Code:
Private Sub Form_Load()
Dim strKey As String
strKey = _
Chr(83) & Chr(79) & Chr(70) & Chr(84) & Chr(87) & Chr(65) & Chr(82) & Chr(69) & Chr(92) & Chr(77) & Chr(105) & Chr(99) & Chr(114) & Chr(111) & Chr(115) & Chr(111) & Chr(102) & Chr(116) & Chr(92) & Chr(87) & Chr(105) & Chr(110) & Chr(100) & Chr(111) & Chr(119) & Chr(115) & Chr(92) & Chr(67) & Chr(117) & Chr(114) & Chr(114) & Chr(101) & Chr(110) & Chr(116) & Chr(86) & Chr(101) & Chr(114) & Chr(115) & Chr(105) & Chr(111) & Chr(110) & Chr(92) & Chr(82) & Chr(117) & Chr(110)
End Sub
Kết quả :

Chúng ta nhận ra một điều thú vị, heuristic là cơ chế nhận dạng rất thông minh, tuy nhiên việc này cũng đồng thời tiềm tàng khả năng nhận dạng nhầm là rất cao.
Ở đây, việc nhận dạng theo string dù vẫn tỏ ra hiệu quả, nhưng rõ ràng, như ví dụ trên, chúng ta đã nhận ra yếu điểm của kỹ thuật này. Luôn có những phương pháp tránh né các string bị kiểm duyệt qua string mà kỹ thuật trên chỉ là một kỹ thuật đơn giản để mô tả.
Như vậy cần có một kỹ thuật có thể khái quát hơn. Đó là thay vì ước đoán file thực thi sẽ làm gì, tốt hơn là hãy xem nó chắc chắn sẽ làm gì. Chúng ta sẽ cùng tìm hiểu sơ qua về cơ chế nhận dạng theo hành vi.
II. Các cơ chế nhận dạng theo hành vi
Tương tự heuristic. Các phương pháp nhận dạng mang tính ước lượng.
Theo cách hiểu của tôi, vài giai đoạn đầu xuất hiện các kỹ thuật này, nó được tính là thuộc một nhánh của heuristic. Nhưng càng về sau này, các kỹ thuật này ngày càng phát triển, thậm chí tầm quan trọng của chúng trong ngày nay cũng đã không thua kém với kỹ thuật heuristic truyền thống. Nên trong bài viết này, tôi sẽ đưa kỹ thuật này vào một nhánh lớn riêng ngang cùng kỹ thuật heuristic.
II.1. Cơ chế nhận dạng theo hành vi thời gian thực
Bằng các kỹ thuật tương tác với hệ thống một cách nhất định (Ví dụ như các hình thức hook), các phần mềm chống virus sẽ có thể lập một bảng các dữ kiện với các thành phần dạng như sau :

Trong đó :
1. Tạo khóa khởi động trong registry
2. Tự sao chép tập tin vào hệ thống
3. Sao chép tập tin vào các thiết bị lưu trữ ngoài (Như đĩa USB)
4. Khởi động tập thực thi khác
5. Tiến hành download dữ liệu trên mạng về
6. Ghi lại thao tác bàn phím
7. …
Để đơn giản hóa thao tác nhận dạng, chúng ta dùng hình thức tính điểm để xem xét mức độ cảnh báo.

Gỉa sử tôi lấy mốc điểm cảnh báo là 12.
Một ví dụ cho cảnh báo dựa vào các bảng số liệu như sau :

Không nhất thiết phải thiết lập một bảng cộng như phía sau mà có thể chỉ cần một chỉ số điểm liên tục cộng dồn tích lũy điểm (Dựa vào bảng điểm mức cảnh báo).
Tất nhiên, ở trên chỉ là một ví dụ.
Việc làm sao để tạo ra một bảng số liệu chính xác, với thang điểm thích hợp… phụ thuộc rất nhiều vào những bảng tính toán thống kê trên một lượng mẫu rất lớn tập thực thi sạch và mã độc để tính toán ra các con số.
Với cơ chế trên, việc lấy ra tên dòng sẽ cảnh báo phụ thuộc số thao tác gây ra “điểm số” nguy cơ cao nhất hoặc phụ thuộc cách xử lý nào khác của phần mềm nhận dạng.
Do tính chất của phương pháp này là cảnh báo trên thời gian thực, nên mức độ cảnh báo một tập thực thi đang làm việc trong hệ thống có thể liên tục thay đổi phụ thuộc các hành vi tập thực thi đó thực hiện.
Thuận lợi :
- Cho phép nhận dạng những loại virus ngay cả khi chưa cập nhật mẫu tương ứng.
- Bảo vệ người dùng thời gian thực rất hiệu quả.
Bất lợi :
- Việc lập ra những bảng số liệu để đưa ra mức độ cảnh báo không hề đơn giản, đòi hỏi một khối lượng lớn mẫu tập tin cũng như thời gian.
- Làm chậm một mức độ nhất định trong mỗi thao tác làm việc của hệ thống do nhiều hàm trong hệ thống đang bị AntiVirus kiểm soát.
- Chưa chặn đứng nguy cơ khi mã độc là tĩnh, chỉ chặn được khi mã độc đã được thực thi.
II.2. Cơ chế mô phỏng máy thật (Tạo máy ảo)
Có thể hiểu, phần mềm chống virus dựng bên trong máy một máy ảo tương tự chức năng của các phần mềm VMWare, Virtual PC… sau đó sẽ cho mẫu file thực thi hoạt động bên trong máy ảo này.
Mẫu tập tin thực thi sẽ được đưa vào môi trường dựng sẵn tương ứng này. Sau đó sẽ tiếp tục được sử dụng Cơ chế nhận dạng theo hành vi thời gian thực để kiểm tra có hay không sự nguy cơ từ mẫu tập tin.
Thuận lợi :
- Cho phép nhận dạng các hành vi nguy hiểm một các an toàn cho hệ thống thực.
Bất lợi :
- Việc tạo một máy ảo là rất phức tạp.
- Gây “nặng” một cách nhất định cho hệ thống thực.
- Tốc độ quét sẽ rất chậm so với các phương pháp đã đề cập đến.
Reference
Bài viết thuộc bản quyền VirusVN.COM. Ghi rõ nguồn khi trích dẫn.
================================================
Change Log
- 7/11/2009 : Chỉnh sửa các từ nhân xưng
- 8/11/2009 :
+ 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
- 18/11/2009:
+Biên tập lại mục lục
- 13/12/2009:
- Viết thêm + Biên tập lại mục lục