Phân tích mã độc
Windows Internals
1. Kiến trúc Windows
Windows OS chạy trong 2 mode chính là User Mode và Kernel Mode:
-
User Mode: ứng dụng chạy trong user mode có quyền truy cập giới hạn đến tài nguyên hệ thống và phải giao tiếp với OS thông qua APIs. Các process isolated với nhau và không có quyền truy cập trực tiếp vào phần cứng và các thành phần hệ thống quan trọng. Các thành phần của User Mode bao gồm:
- System Support Processes: cung cấp chức năng và dịch vụ quan trọng cho hệ thống như winlogon.exe, smss.exe, services.exe,...
- Service Processes: các process chạy liên tục dưới nền, thực hiện task theo cấu hình và tham số của nó như Windows Update Service, Task Scheduler,...
- User Applications: process được tạo bởi user program, bao gồm cả 32-bit và 64-bit, giao tiếp với OS qua API, API call chuyển tiếp
NTDLL.DLL, kích hoạt chuyển đổi từ user mode sang kernel mode - nơi system call thực thi. Kết quả được trả về user mode. - Environment Subsystems: cung cấp môi trường thực thi cho một số ứng dụng và process bao gồm Win32 Subsystem, POSIX và OS/2.
- Subsystem DLLs: dynamic-link binaries biên dịch function thành system call thông qua NTDLL.DLL.
-
Kernel Mode: có quyền cao nhất và không giới hạn vào mọi nguồn tài nguyên. Device driver cũng chạy trong kernel mode.
- Executive: chứa các thành phần quản lý như
I/O Manager,Object Manager,Security Reference Monitor,Process Manager,... sau đó chuyển cuộc gọi đến kernel hoặc device driver. - Kernel: quản lý tài nguyên bao gồm
hread scheduling,interruptvàexception dispatching, vàmultiprocessor synchronization. - Device Drivers: cho phép OS giao tiếp với phần cứng.
- Hardware Abstraction Layer (HAL): abstraction layer giữ phần cứng và OS.
- Windowing and Graphics System (Win32k.sys): chịu trách nhiệm GUI.
- Executive: chứa các thành phần quản lý như

2. Windows API Call Flow
Xem xét ví dụ với hàm ReadProcessMemory
BOOL ReadProcessMemory(
[in] HANDLE hProcess,
[in] LPCVOID lpBaseAddress,
[out] LPVOID lpBuffer,
[in] SIZE_T nSize,
[out] SIZE_T *lpNumberOfBytesRead
);
ReadProcessMemory nằm trong thư viện kernel32.dll, hàm này gọi Native API call là NtReadVirtualMemory

NtReadVirtualMemory nằm trong NTDLL.DLL, khởi tạo một lênh system call (syscalls) có số 3F. Kernel duy trì một bảng gọi là System Service Descriptor Table (SSDT) hay syscall table (System Call Table) là data structure, mỗi entry bao gồm syscall number và pointer trỏ đến vị trí tương ứng của kernel function.

Syscall function được thực thi trong kernel, nơi Windows memory management và process isolation được tận dụng. Kernel thực hiện các kiểm tra cần thiết, kiểm tra quyền truy cập và đọc bộ nhớ từ process mục tiêu, trích xuất physical memory pages tương ứng với virtual address được yêu cầu và sao chép vào buffer được cung cấp.
Sau khi kernel đọc bộ nhớ xong, nó chuyển thread trở lại user mode và ứng dụng ban đầu.

3. Portable Executable
Windows OS sử dụng PE format để đóng gói chương trình thực thi và DLLs, được tổ chức dưới dạng các section như sau:
- Text Section (.text): nơi chứa executable code
- Data Section (.data): lưu trữ biến toàn cục và biến tĩnh đã được khởi tạo (assign giá trị).
- Read-only initialized data (.rdata): lưu trữ const value, string literals, biến toàn cục và biến tĩnh dưới mode read-only.
- Exception information (.pdata): A collection of function table entries utilized for exception handling.
- BSS Section (.bss): lưu trữ biến tĩnh và biến toàn cục chưa được khởi tạo.
- Resource Section (.rsrc): các tài nguyên như hình ảnh, icons, chuỗi và thông tin version.
- Import Section (.idata): chi tiết về import function từ các thư viện DLL khác.
- Export Section (.edata): chi tiết về export function.
- Relocation Section (.reloc): trong PE file chứa thông tin về cách điều chỉnh địa chỉ khi chương trình được nạp vào bộ nhớ.

4. Processes

Mỗi process bao gồm:
- A unique PID (Process Identifier): PID duy nhất của process.
- Virtual Address Space (VAS): mỗi process có bộ nhớ ảo của riêng nó, được chia thành các phân đoạn bao gồm code, data và stack segment, cho phép quá trình truy cập bộ nhớ của mỗi process được cách ly với process khác.
- Executable Code (Image File on Disk): executable code
- Table of Handles to System Objects: bảng tham chiếu đến các system object như file, device, registry,...
- Security Context (Access Token): mỗi process có security context đi kèm, được thể hiện thông qua Access Token. Thông tin trong Acess Token bao gồm user chạy process và các quyền truy cập được cấp cho process.
- One or More Threads Running in its Context: process bao gồm một hoặc nhiều thread, mỗi thread là một đơn vị thực thi của process, sử dụng thread cho phép multitasking.
5. Dynamic-link library (DLL)
DLL là một loại PE cho phép chia sẻ các function của nó.
- Import Functions: là các function chứa trong thư viện ngoài được sử dụng trong code, có thể được sử dụng để quan sát hành vi của mã độc và trở thành IOC, signature để phát hiện.
- Export Function: là function trong thư viện được sử dụng bởi module hay application khác.
Ví dụ, shell.exe là một malware process thực hiện hành vi process injection để inject code đến process notepad.exe sử dụng các import function từ kernel32.exe:
OpenProcess: Mở một handle đến processnotepad.exe, cung cấp quyền để thao túng bộ nhớ của process.VirtualAllocEx: Phân bổ một khối bộ nhớ trong không gian địa chỉ củanotepad.exeđể lưu trữ mã được đưa vào.WriteProcessMemory: Ghi code mong muốn vào khối bộ nhớ được phân bổ trên.CreateRemoteThread: Tạo remote thread đếnnotepad.exe, định nghĩa entry point cảu inject code là điểm bắt đầu.

Static Analysis
Thông qua quá trình phân tích tĩnh, các thông tin quan trọng cần trích xuất bao gồm:
- File type, File hash
- Strings
- Embedded elements
- Packer information
- Imports, Exports
- Assembly code

1. Identifying The File Type
Xác định file type: sử dụng command file hoặc hexdump. Với hexdump cần có kiến thức về signature của các loại file type, thông thường file PE sẽ bắt đầu bằng ký tự MZtương ứng mã hex là 4D 5A.
file /home/htb-student/Samples/MalwareAnalysis/Ransomware.wannacry.exe
hexdump -C /home/htb-student/Samples/MalwareAnalysis/Ransomware.wannacry.exe | more
Trên Windows, có thể sử dụng CFF Explorer để xác định File type.

2. Malware Fingerprinting
Tạo malware fingerprinting bằng các thuật toán hashing như MD5, SHA1 hoặc SHA256. Mục đích của việc này bao gồm:
- Phân loại và theo dõi malware sample
- Sử dụng IOC hash để rà quét hệ thống
- Xác nhận xem các mẫu malware đã từng phân tích có cùng một loại hay không?
- Chia sẻ IOC cho threat intelligence.
md5sum /home/htb-student/Samples/MalwareAnalysis/Ransomware.wannacry.exe
sha256sum /home/htb-student/Samples/MalwareAnalysis/Ransomware.wannacry.exe
Do chỉ cần thay đổi một vài bytes cũng dẫn đến sự thay đổi của chuỗi hash nên nếu như chỉ sử dụng MD5, SHA1 hay SHA256 sẽ không hiểu quả để phát hiện các mẫu malware giống nhau nhưng khác tên. Nên có vài thuật toán hashing khác cải thiện độ chính xác trong việc tìm kiếm các mẫu malware tương tự như sau:
-
IMPHASH: thuật toán này trích xuất tất cả các import function, chuyển về lowercase, sau đó kết hợp với tên của file DLL tương ứng, rồi sắp xếp các chuỗi theo thứ tự bảng chữ cái và tiến hành MD5 hash.
import sys import pefile import peutils pe_file = sys.argv[1] pe = pefile.PE(pe_file) imphash = pe.get_imphash() print(imphash) -
Fuzzy Hashing (SSDEEP): còn được gọi là
CTPH(context-triggered piecewise hashing), dùng để so sánh mức độ tương đồng giữa 2 malware samples. Kỹ thuật hashing này bao gồm việc chia file thành từng block nhỏ và tính toán mã hash của các block. Nhưng việc tính toán thường cần tiêu tốn tài nguyên.ssdeep /home/htb-student/Samples/MalwareAnalysis/Ransomware.wannacry.exessdeep -pb * -
Section Hashing (Hashing PE Sections): tính toán hash của từng section trong PE file để phát hiện section nào đã được sửa đổi. Tuy nhiên, trong thực tế, người thiết kế malware có thể làm tối mã hoặc tạo tên tự động để trốn tránh sự phát hiện.
import sys import pefile pe_file = sys.argv[1] pe = pefile.PE(pe_file) for section in pe.sections: print (section.Name, "MD5 hash:", section.get_hash_md5()) print (section.Name, "SHA256 hash:", section.get_hash_sha256())
Trên Windows, có thể sử dụng PowerShell Get-FileHassh để tính toán MD5, SHA1 hay SHA256 hash.
Get-FileHash -Algorithm MD5 C:\Samples\MalwareAnalysis\Ransomware.wannacry.exe
Get-FileHash -Algorithm SHA256 C:\Samples\MalwareAnalysis\Ransomware.wannacry.exe
3. String Analysis
Phân tích strings, có thể phát hiện được các thông tin như các file liên quan khác, địa chỉ IP hay domain, registry, Windows API function, tham số command-line và các thông tin khác liên quan đến threat actor.
strings -n 15 /home/htb-student/Samples/MalwareAnalysis/dharma_sample.exe
Một công cụ khác ngoài strings để trích xuất string trong file khác là floss - FireEye Labs Obfuscated String Solver được thiết kế bởi FLARE team của Fireeye nhằm tự động gỡ rối (deobfuscate) string.
floss /home/htb-student/Samples/MalwareAnalysis/dharma_sample.exe
4. Unpacking UPX-packed Malware
Unpacking, một số file malware sử dụng các kỹ thuật làm rối mã hoặc nén, giảm kích thước của tệp thực thi gây khó khăn trong việc phân tích tĩnh. Một công cụ packer phổ biến sử dụng trong nhiều loại malware là Ultimate Packer for Executables (UPX). Có thể phát hiện file được packing bằng packer này bằng các string signature.

upx -d -o unpacked_credential_stealer.exe credential_stealer.exe

Dynamic Analysis
Các bước phân tích động malware bao gồm:
- Environment Setup: thiết lập một môi trường an toàn và cách ly hoàn toàn đến môi trường mạng, thường là VM.
- Baseline Capture: tạo snapshot của môi trường trong trạng thái ban đầu, bao gồm system file, registry, process đang chạy, cấu hình network,... Việc này tạo cơ sở để phát hiện những thay đổi sau khi malware chạy (post-execution).
- Tool Deployment (Pre-Execution): triển khai các công cụ monitoring và logging như Process Monitor (
Procmon) từ Sysinternals Suite để ghi lại system call, file system activity, registry operation,... Sử dụng các công cụ nhưWireshark,tcpdumpvàFiddlerđể capture network traffic vàRegshotđể tạo snapshot registry trước và sau khi chạy malware. Cuối cùng là các công cụ nhưINetSim,FakeDNSvàFakeNet-NGđể mô phỏng dịch vụ Internet. - Malware Execution: chạy malware trong môi trường đã cài đặt.
- Analysis of Collected Data: dừng malware và các công cụ monitoring để phân tích dữ liệu.
Trong một số trường hợp, khi malware có các phương pháp lẩn tránh và phức tạp, có thể sử dụng các sanbox enviroment như Cuckoo Sanbox, Joe Sandbox và FireEye's Dynamic Threat Intelligence cloud, cung cấp một môi trường an toàn, nằm trong kiểm soát chặt chẽ và tự động phân tích, tự động tạo report về hành vi của malware.
Noriben là công cụ phân tích động được viết bằng Python, sử dụng ProcMon làm nền tảng. Vì nếu chỉ sử dụng ProcMon sẽ cho nhiều thông tin nhiễu, Noriben được phát triển để lọc và cho phép tạo report .csv hiển thị cụ thể được thông tin về Malware.

Code Analysis
1. Code Analysis
Lab đọc code với IDA: https://academy.hackthebox.com/module/227/section/2499
2. Debugging
Xây dựng môi trường để test malware bao gồm 2 máy ảo dựng trên VMWare như sau:
-
Ubuntu 22.04: cài đặt iNetSim để giả lập mạng
sudo apt-get update sudo apt-get upgrade echo "deb http://www.inetsim.org/debian/ binary/" >> /etc/apt/sources.list wget -O — http://www.inetsim.org/inetsim-archive-signing-key.asc | apt-key add - sudo apt-get update sudo apt-get install inetsim sudo nano /etc/inetsim/inetsim.confCấu hình file
inetsim.confnhư sau (domain là bất kỳ):service_bind_address <your servers IP> dns_default_ip <your servers IP> dns_default_hostname www dns_default_domainname malware.lab -
Windows 11: cài đặt các công cụ để phân tích malware bao gồm Wireshark, IDA, x64dbg, CFF Browser, Hex dump... và trỏ DNS server đến máy cài
iNetSim.

Cả 2 máy đều có card mạng là host-only, giúp cách ly với Internet.