Một số kỹ thuật dịch ngược cơ bản được sử dụng trong mã độc
Trong những năm gần đây, sự phát triển của mã độc đang ngày càng gia tăng nhanh chóng. Hơn 350.000 mã độc đang phát hiện bởi phần mềm phòng chống virus mỗi ngày. Để có thể phân tích và phát hiện mã độc một cách hiệu quả, những nhà phân tích mã độc thường sử dụng phương pháp trích xuất hành vi độc hại của mã độc, hay còn gọi là kỹ thuật dịch ngược (reverse engineering).
Kỹ thuật dịch ngược là quá trình lấy một biên dịch nhị phân và cố gắng tái tạo lại cách chương trình ban đầu hoạt động, từ đó hiểu được bản chất, hành vi và phương thức chương trình đó hoạt động [1]. Đây là một cách tiếp cận có cấu trúc để phân tích mã độc. Hành vi và chức năng của mã độc có thể được phát hiện thông qua các phương pháp dịch ngược.
Tuy nhiên, để tránh phát hiện ra mã độc thông qua phân tích tĩnh và phân tích động, các tác giả của mã độc đang sử dụng các kỹ thuật chống dịch ngược. Ban đầu, kỹ thuật chống dịch ngược được ứng dụng trong việc chống tin tặc dịch ngược mã nguồn, chống ăn cắp mã nguồn để xây dựng bản phá khóa cho các chương trình với chi phí cao. Sau đó kỹ thuật chống dịch ngược đã được tin tặc sử dụng đối với mã độc nhằm mục đích cản trở và gây khó khăn trong việc phân tích chúng. Những kỹ thuật này khiến mã độc trở nên tinh vi hơn, do đó để một nhà phân tích phát hiện ra mã độc sử dụng chống dịch ngược đang hoạt động trong hệ thống là rất khó khăn [2].
KỸ THUẬT CHỐNG DỊCH NGƯỢC
Các kỹ thuật phân tích được sử dụng trong các kỹ thuật phát hiện mã độc là: phân tích tĩnh (static), phân tích động (dynamic) và phân tích lai (hybrid) kết hợp giữa phân tích động và tĩnh. Tương tự như kỹ thuật dịch ngược, kỹ thuật chống dịch ngược cũng được chia làm ba loại, là kỹ thuật chống dịch ngược tĩnh, kỹ thuật chống dịch ngược động hoặc kết hợp cả hai phương pháp trên.
Như đã nói ở trên, trong kỹ thuật phân tích mã độc hay dịch ngược mã độc, các chuyên gia phân tích mã độc sẽ chạy các mẫu mã độc đó trong trình debug, sandbox hay môi trường máy ảo để phân tích chức năng và hành vi của mã độc đó [4]. Biết được điều đó, tin tặc sử dụng kỹ thuật chống dịch ngược mã độc nhằm mục đích cản trở và gây khó khăn trong việc phân tích mã độc bằng cách sử dụng một số kỹ thuật như trong Hình 1.
Hình 1. Các kỹ thuật chống dịch ngược mã độc
ANTI-DEBUGER
Anti-Debuger là kỹ thuật chống phân tích được sử dụng phổ biến trong mã độc. Khi bị phân tích bởi một trình Debuger nào đó, mã độc sử dụng kỹ thuật này có thể phát hiện ra sự có mặt của trình Debuger, sau đó làm thay đổi hướng thực thi của mã độc (rẽ sang hướng khác hoặc dừng hoạt động…) gây cản trở quá trình phân tích.
Hiện nay, với sự phát triển của các chương trình antivirus, tin tặc luôn thay đổi và xây dựng các kỹ thuật mới để vượt qua được các chương trình Antivirus. Một số kỹ thuật Anti-Debuger đơn giản và phổ biến bao gồm: sử dụng các hàm API, kiểm tra cấu trúc, Timing Check, ngắt [5].
Sử dụng các hàm API
Hệ điều hành Windows cung cấp một số hàm API có chức năng xác định trình Debuger. Các hàm API sẽ dò quét các dấu hiệu của trình Debuger khi hoạt động, bao gồm:
- Hàm IsDebuggerPresent: Đây là hàm API đơn giản nhất để phát hiện sự có mặt của một trình Debuger. Hàm này tìm kiếm cấu trúc Process Environment Block (PEB). Kết quả trả về sẽ là giá trị 0 nếu như chương trình chạy trong ngữ cảnh của một trình Debuger. Nếu không thì kết quả trả về là một giá trị khác 0.
- Hàm CheckRemoteDebuggerPresent: Hàm API này gần như giống với hàm IsDebuggerPresent. Hai hàm này đều nhằm phát hiện sự có mặt của một trình Debuger, nhưng hàm CheckRemoteDebuggerPresent có khả năng thực hiện quá trình kiểm tra thông qua một tiến trình xử lý khác.
- Hàm NtQueryInformationProcess: Đây là hàm Native API trong NTdll.dll có chức năng lấy thông tin về một quá trình nhất định.
Kiểm tra cấu trúc
Khi một trình Debuger chạy sẽ tạo ra các vùng nhớ heap khác nhau. Những thông tin mà hệ thống sử dụng để xác định một vị trí “không xác định” trong PEB tại offset 0x68. Nếu giá trị ở vị trí này là 0x70 thì có nghĩa là một trình Debuger đang hoạt động. Giá trị 0x70 là sự tổ hợp của các bit cờ.
Timing Check
Timing Check là một trong những kỹ thuật phổ biến để phát hiện sự có mặt của trình Debuger. Nguyên lý của kỹ thuật này là so sánh sự sai khác về độ trễ khi có mặt và không có mặt của trình Debuger. Các ngoại lệ sẽ được xử lý rất nhanh nếu như không có mặt của trình Debuger. Ngược lại, ngoại lệ sẽ xử lý chậm hơn khi có mặt của trình Debuger do đòi hỏi sự can thiệp của con người.
Ngắt
Bằng việc chèn các mã lệnh ngắt trong chương trình, trình Debuger sẽ gặp phiền phức và có thể bị chuyển hướng nếu như sử dụng lệnh ngắt và xử lý ngoại lệ đồng thời. Đây là một kỹ thuật cổ điển nhưng vẫn hiệu quả trong việc gây phiền toái và khó khăn trong quá trình phân tích chương trình.
Int3
Ngắt Int3 có mã opcode là 0xCC. Trình Debuger sẽ hiểu mã lệnh 0xCC là một điểm ngắt hoặc một bẫy ngắt. Vì vậy, trình Debuger sẽ dừng thực thi để tránh rơi vào bẫy này. Thực chất, lúc này, trình Debuger đã thực sự rơi vào một cái bẫy. Với ngắt Int3, người lập trình mã độc có thể điều hướng chương trình thực thi hoặc làm nhiễu quá trình phân tích của người phân tích hoặc chương trình Antivirus.
Int2D
Ngắt Int2D cũng là một loại ngắt tương tự Int3. Ngắt Int2D được sử dụng để truy cập nhân Debugger, và cũng có thể được sử dụng ở mức User mode. Khi ngắt Int2D được gọi, hệ thống sẽ giữ lại 1 byte sau lệnh ngắt. Các chương trình thực thi sẽ sử dụng chính điều này để chỉnh sửa nội dung của nó.
ANTI VMWARE
VMware là phần mềm ảo hóa thường được các chuyên gia phân tích mã độc sử dụng để tạo ra môi trường ảo nhằm mục đích phân tích hành vi và chức năng của các mẫu mã độc. Tuy nhiên, có một số cách để mã độc có thể phát hiện đang được chạy trong môi trường ảo hay môi trường thật. Các phương pháp phổ biến mà tin tặc hay sử dụng được miêu tả trong Hình 2 [6].
Hình 2. Kỹ thuật chống dịch ngược mã độc trên môi trường ảo hóa
Kiểm tra Registry Keys
Khi môi trường ảo hóa được khởi tạo, trong Registry sẽ xuất hiện các thư mục có liên quan đến Vmware. Như vậy, mã độc trước khi khởi động chỉ cần kiểm tra trong Registry có thư mục đó hay không, là biết được nó có đang chạy trong môi trường ảo hóa hay không. Đường dẫn của thư mục đó như sau:
HKLM\SOFTWARE\VmwareInc.\Vmware Tools
HKEY_LOCAL_MACHINE\HARDWARE\ DEVICEMAP\Scsi\ScsiPort2\ScsiBus 0\Target Id 0\Logical Unit Id 0\Identifier
Kiểm tra sự tồn tại của file
Tương tự như vậy, mã độc trước khi chạy sẽ kiểm tra trong các thư mục có chứa file của VMware hay không rồi mới bắt đầu các hành vi khác. Đường dẫn của các file như sau:
1) C:\windows\System32\Drivers\ Vmmouse.sys
2) C:\windows\System32\Drivers\ vm3dgl.dll
Kiểm tra địa chỉ MAC
Địa chỉ MAC của các máy ảo thường sẽ được cung cấp cố định một vài địa chỉ. Chính vì vậy mã độc hoàn toàn có thể biết được môi trường bên ngoài đang là ảo hay thật bằng cách kiểm tra địa chỉ MAC của máy [7]: 00:05:69; 00:0C:29; 00:1C:14; 00:50:56.
Tương tự như kỹ thuật Anti VMWare, một số kỹ thuật khác mà các tin tặc thường hay sử dụng là: Anti-Virtual Box, Anti Sandboxie, Generic Sandbox và Wine Detection, … [8].
Hình 3. Cấu trúc file PE
KỸ THUẬT PACKER APPLICATION
File thực thi .exe trong hệ điều hành Windows thường có cấu trúc PE file, định dạng file riêng của Win32 (Hình 3). PE file được chia làm 2 phần Header và Section, trong đó Header dùng để lưu các giá trị định dạng file và các offset của các section trong phần Section.
Kỹ thuật Packer Application sử dụng phương pháp nén, mã hóa, lưu hoặc giấu mã gốc của chương trình, tự động bổ sung một hoặc nhiều section, sau đó sẽ thêm đoạn mã Unpacking Stub và chuyển hướng Entry Point (EP) tới vùng mã này. Bình thường một file không đóng gói (Nonpacked) sẽ được tải bởi OS. Với file đã đóng gói thì Unpacking Stub sẽ được tải bởi OS, sau đó chương trình gốc sẽ tải Unpacking Stub. Lúc này mã EP của file thực thi sẽ trỏ tới Unpacking Stub thay vì trỏ vào mã gốc.
KẾT LUẬN
Có rất nhiều kỹ thuật chống dịch ngược đã được tin tặc sử dụng nhằm mục đích gây khó khăn cho các chuyên gia phân tích mã độc, điều đó giúp cho mã độc có thêm thời gian để hoạt động và phá hoại máy tính của người dùng. Bài báo đã đưa ra được các kỹ thuật chống dịch ngược phổ biến hiện nay, từ đó các chuyên gia phân tích mã độc hay an toàn thông tin có thể hiểu được những kỹ thuật đó và đưa ra được các cách thức phân tích mã độc hiệu quả, đảm bảo an toàn thông tin cho các hệ thống máy tính.
TÀI LIỆU THAM KHẢO 1. R. Goyda, S. Sharma, and S. Bevinakoppa, “Obfuscation of stuxnet and flame malware,” In. Proc. of the 3rd international conference on applied informatics and computing theory(AICT'12), 150--154, 2012. 2. J. W. Kim, J. Bang, Y.S. Moon, and M. J. Choi, “Disabling anti-debugging techniques for unpacking system in user-level debugger,” in 2019 International Conference on Information and Communication Technology Convergence(ICTC), Jeju Island, South Korea, 2019. 3. M. N. Gagnon, S. Taylor, and A. K. Ghosh, “Software protection through antidebugging,” IEEE Security & Privacy, 5(3), 82--84, 2007. 4. R. Vinayakumar, M. Alazab, K. P. Soman, P. Poornachandram, and S. Venkatran man, “Robust intelligent malware detection using deep learning,” IEEE Access, 7, 46717--46738, 2019. 5. M. J. Choi, J. Bang, J. W. Kim, H. Kim, and Y. S. Moon, “Allin-one framework for detection, unpacking, and verification for malware analysis,” Security and Communication Network 2019, 2019(5278137), 1--16, 2019. 6. S. Choi, T. Chang, S. Yoon, and Y. Park, “Hybrid emulation for bypassing anti-reversing techniques and analyzing malware,” The Journal of Supercomputing, 1--27, 2020. 7. D. P. Pham, D. L. Vu, and F. Massacci, “Mac-A-Mal: macOS malware analysis framework resistant to anti evasion techniques,” Journal of Computer Virology and Hacking Techniques, 15(4), 249--257, 2019. 8. J. K. Lee, B. J. Kang, and E. G. Im, “Rule-based antianti-debugging system,” In Proc. of the 2013 Research in Adaptive and Convergent Systems, 353--354, 2013. |
TS. Phạm Văn Tới, Hà Thị Thu Trang, Phan Trọng Duy, Phòng Thí nghiệm trọng điểm an toàn thông tin, Bộ Tư lệnh 86