Chương 0: Malware Analysis Primer

Malware là gì?

Bất kỳ phần mềm nào gây hại cho người dùng, máy tính hoặc mạng đều được gọi là malware, bao gồm: virus, trojan horse, worm, rootkit, scareware, spyware.


Mục tiêu phân tích Malware

Phân tích malware nhằm cung cấp thông tin để phản hồi một vụ xâm nhập mạng:

  • Xác định chính xác điều gì đã xảy ra
  • Tìm ra tất cả máy và file bị nhiễm
  • Xác định malware có thể làm gì, cách phát hiện nó trên mạng, và cách đo lường / kiểm soát thiệt hại

Sau khi có signatures, mục tiêu cuối cùng là hiểu malware hoạt động như thế nào — câu hỏi thường được ban lãnh đạo cấp cao đặt ra nhất sau một vụ xâm nhập lớn.

Host-based vs Network Signatures

LoạiMô tả
Host-based signaturesPhát hiện mã độc trên máy nạn nhân. Tập trung vào hành vi của malware (file tạo ra, thay đổi registry), không phải đặc điểm của chính malware → hiệu quả hơn với malware thay hình hoặc đã bị xóa
Network signaturesPhát hiện mã độc qua giám sát lưu lượng mạng. Có thể tạo mà không cần phân tích malware, nhưng kết hợp phân tích cho tỉ lệ phát hiện cao hơn, false positive thấp hơn

Các kỹ thuật phân tích Malware

Static Analysis  ──► Không chạy malware
Dynamic Analysis ──► Chạy malware thực tế

Mỗi loại lại chia thành BasicAdvanced:

graph TD A[Malware Analysis] --> B[Static Analysis] A --> C[Dynamic Analysis] B --> D[Basic Static] B --> E[Advanced Static] C --> F[Basic Dynamic] C --> G[Advanced Dynamic]

Basic Static Analysis

  • Kiểm tra file thực thi mà không xem instruction thực tế
  • Xác nhận file có độc hại không, cung cấp thông tin chức năng, tạo network signature đơn giản
  • Nhanh, dễ thực hiện, nhưng không hiệu quả với malware phức tạp và có thể bỏ sót hành vi quan trọng

Basic Dynamic Analysis

  • Chạy malware, quan sát hành vi để gỡ nhiễm hoặc tạo signature
  • Phải thiết lập môi trường an toàn trước khi chạy
  • Không cần kiến thức lập trình sâu, nhưng không hiệu quả với mọi malware

Advanced Static Analysis

  • Reverse-engineering nội dung malware bằng disassembler
  • Xem program instruction trực tiếp → biết chính xác chương trình làm gì
  • Yêu cầu kiến thức về disassembly, code constructs, Windows OS concepts

Advanced Dynamic Analysis

  • Dùng debugger để kiểm tra trạng thái nội bộ của malware đang chạy
  • Hữu ích nhất khi cần thông tin khó thu thập bằng kỹ thuật khác
  • Thường kết hợp với Advanced Static Analysis để phân tích toàn diện

Các loại Malware

LoạiMô tả
BackdoorCài lên máy để attacker truy cập, thực thi lệnh với ít/không xác thực
BotnetNhư backdoor, nhưng tất cả máy bị nhiễm nhận lệnh từ một C&C server duy nhất
DownloaderChỉ tồn tại để tải malware khác về; thường được cài đầu tiên khi attacker xâm nhập
Information-stealing malwareThu thập thông tin từ máy nạn nhân (sniffer, keylogger, password hash grabber)
LauncherDùng kỹ thuật phi truyền thống để khởi chạy malware khác nhằm ẩn mình
RootkitChe giấu sự tồn tại của malware khác; thường ghép với backdoor
ScarewareLàm người dùng hoảng sợ để mua “phần mềm” giả mạo AV
Spam-sending malwareDùng máy nạn nhân để gửi spam, tạo thu nhập cho attacker
Worm / VirusTự sao chép và lây nhiễm các máy khác

Lưu ý: Malware thường kết hợp nhiều loại — ví dụ: có cả keylogger lẫn worm component.

Mass vs Targeted Malware

Mass MalwareTargeted Malware
Ví dụScarewareBackdoor tùy chỉnh
Mục tiêuNhiều máy nhất có thểMột tổ chức cụ thể
Mức độ phổ biếnPhổ biến nhấtÍt phổ biến
Độ tinh viThấp hơnRất cao
Khả năng phát hiện bởi AVCaoThấp (không có trong database)

Quy tắc chung khi phân tích Malware


Chương 1 — Basic Static Techniques

Tổng quan

Static analysis = phân tích code hoặc cấu trúc chương trình để xác định chức năng mà không chạy chương trình.

Các kỹ thuật chính trong chương:

  • Dùng antivirus tools xác nhận tính độc hại
  • Dùng hashes để nhận dạng malware
  • Trích xuất thông tin từ strings, functions, headers của file

Antivirus Scanning

Bước đầu tiên tốt: chạy qua nhiều chương trình antivirus.

AV tools hoạt động dựa trên:

  • File signatures — database chứa đoạn code đáng ngờ đã biết
  • Heuristics — phân tích hành vi và pattern-matching

Hạn chế của AV:

  • Malware writer dễ dàng sửa code → thay đổi signature → bypass AV
  • Malware hiếm gặp không có trong database
  • Heuristics có thể bị bypass bởi malware mới, độc đáo

Hashing — Dấu vân tay của Malware

Hashing là phương pháp phổ biến để nhận dạng duy nhất một mẫu malware.

  • MD5 — phổ biến nhất trong malware analysis
  • SHA-1 — cũng hay được dùng
# Ví dụ dùng md5deep
md5deep c:\WINDOWS\system32\sol.exe
# Output: 373e7a863a1a345c60edb9e20ec3231  c:\WINDOWS\system32\sol.exe

Ứng dụng của hash:

  • Dùng làm nhãn nhận dạng malware
  • Chia sẻ với analyst khác
  • Tìm kiếm online xem file đã được phân tích chưa

Finding Strings

String trong chương trình = chuỗi ký tự như URL, thông báo lỗi, registry key, IP address…

Tìm strings là cách đơn giản để đoán chức năng của chương trình.

Tool: Strings (Sysinternals)

ASCII vs Unicode

ASCIIUnicode
Bytes/ký tự1 byte2 bytes
Kết thúc1 byte 0x002 bytes 0x00 0x00
ASCII "BAD":  42 41 44 00
Unicode "BAD": 42 00 41 00 44 00 00 00

Strings tool tìm chuỗi từ 3 ký tự trở lên, bất kể context. Một số byte có thể bị nhận diện nhầm là string → người dùng phải tự lọc.

Ví dụ phân tích strings thực tế

C:> strings bp6.ex_

VP3          ← vô nghĩa (ignore)
VW3          ← vô nghĩa (ignore)
99.124.22.1  ← IP address → malware sẽ kết nối tới đây
GetLayout    ← Windows function từ GDI32.DLL
GDI32.DLL    ← tên DLL phổ biến
SetLayout    ← Windows function
Mail system DLL is invalid.!Send Mail failed to send message.
             ← error message → malware gửi email, phụ thuộc vào mail DLL

Packed & Obfuscated Malware

Kỹ thuậtMô tả
ObfuscatedMalware cố ẩn quá trình thực thi
PackedSubset của obfuscated — chương trình bị nén lại và không thể phân tích trực tiếp

Dấu hiệu nhận biết:

  • Legitimate programs → rất nhiều strings
  • Packed/obfuscated → rất ít strings
  • Packed code thường chứa ít nhất: LoadLibraryGetProcAddress
graph LR A[Packed Executable\nWrapper Program] -->|Chạy lên| B[Decompress] B --> C[Unpacked Executable\nchạy bình thường]

Khi phân tích static, chỉ thấy được wrapper program nhỏ, không thấy code thật.

Phát hiện Packer với PEiD

PEiD — tool phát hiện loại packer/compiler được dùng để build ứng dụng.

Unpack với UPX

UPX là packer phổ biến nhất. Unpack rất đơn giản:

upx -d PackedProgram.exe

Portable Executable (PE) File Format

PE format được dùng bởi Windows executables, object code, và DLLs. Gần như mọi file executable trên Windows đều dùng định dạng PE.

graph TD PE[PE File] --> Header PE --> Sections Header --> IMAGE_DOS_HEADER Header --> IMAGE_NT_HEADERS Header --> IMAGE_FILE_HEADER Header --> IMAGE_OPTIONAL_HEADER Header --> IMAGE_SECTION_HEADER Sections --> .text Sections --> .rdata Sections --> .data Sections --> .rsrc

PE File Sections

SectionNội dung
.textCode thực thi — CPU chạy code ở đây; section duy nhất nên có quyền execute
.rdataImport/export info (read-only data); đôi khi tách thành .idata.edata
.dataGlobal data của chương trình, truy cập được từ mọi nơi
.rsrcResources: icon, image, menu, string — không phải là code
.pdataChỉ có trong 64-bit executable; chứa exception-handling info
.relocThông tin để relocation của library files

Linked Libraries và Functions

Imports = các function mà một chương trình sử dụng nhưng được lưu trong chương trình khác (code library).

3 loại linking

graph LR A[Code Library Linking] --> B[Static Linking] A --> C[Runtime Linking] A --> D[Dynamic Linking]
LoạiĐặc điểmRelevance với malware
Static linkingToàn bộ code library được copy vào executable → file to lên; phổ biến trong UNIX/LinuxKhó phân biệt library code với code gốc; không có dấu hiệu trong PE header
Runtime linkingChỉ kết nối đến library khi cần dùng function, không phải lúc khởi độngRất phổ biến trong malware, nhất là packed/obfuscated; dùng LoadLibrary + GetProcAddress → không biết statically functions nào được link
Dynamic linkingHost OS tìm library khi load chương trình; phổ biến và dễ phân tích nhấtThú vị nhất với analyst — PE header lưu rõ mọi library và function được dùng

Công cụ: Dependency Walker

Liệt kê dynamically linked functions trong executable.

Ví dụ phân tích SERVICES.EX_:

  • Import KERNEL32.DLL → có CreateProcessAsẽ tạo process khác → cần theo dõi khi chạy
  • Import WS2_32.DLLnetworking → kết nối mạng

Common DLLs — ý nghĩa

DLLÝ nghĩa
Kernel32.dllCore Windows: memory, file, hardware
Advapi32.dllService Manager, Registry
User32.dllUI: buttons, scroll bars, user input
Gdi32.dllGraphics
Ntdll.dllInterface trực tiếp với Windows kernel; nếu import trực tiếp → có thể đang làm gì đó không bình thường (ẩn process, v.v.)
WSock32.dll / Ws2_32.dllNetworking
Wininet.dllHigh-level networking: FTP, HTTP, NTP

Static Analysis in Practice

Case 1: PotentialKeylogger.exe (Unpacked)

Có rất nhiều imports → không bị packed.

Phân tích imports tiết lộ:

DLLClues
Kernel32.dllOpenProcess, ReadFile, WriteFile → thao tác process và file; FindFirstFile/FindNextFile → duyệt thư mục
User32.dllNhiều GUI functions → có UI; SetWindowsHookEx → keylogging! RegisterHotKey → hotkey toàn hệ thống
Advapi32.dllRegistry functions → kiểm tra strings tìm registry key

Tìm thấy string: Software\Microsoft\Windows\CurrentVersion\Runtự động chạy khi Windows khởi động

Exports: LowLevelKeyboardProc, LowLevelMouseProc → xác nhận keylogging qua SetWindowsHookEx

Case 2: PackedProgram.exe (Packed — Dead End)

Chỉ có vài imports:

Kernel32.dll:        User32.dll:
GetModuleHandleA     MessageBoxA
LoadLibraryA
GetProcAddress
ExitProcess
VirtualAlloc
VirtualFree

→ Quá ít imports, không có strings → bị packed. Basic static analysis không thể tiến xa hơn. Cần dynamic analysis (Chapter 3) hoặc unpacking (Chapter 18).


Phân tích PE Header chi tiết

IMAGE_FILE_HEADER

Chứa Time Date Stamp — thời điểm compile:

  • Compile time cũ → có thể đã có AV signature
  • Compile time mới → malware mới, AV chưa có signature
  • Tất cả Delphi programs đều có compile time: June 19, 1992 — nếu thấy ngày này, đây là Delphi program
  • Competent malware writer có thể fake compile time — nếu thấy ngày vô lý, có thể đã bị giả mạo

IMAGE_OPTIONAL_HEADER

  • IMAGE_SUBSYSTEM_WINDOWS_CUIconsole program (chạy trong command window)
  • IMAGE_SUBSYSTEM_WINDOWS_GUIGUI program

IMAGE_SECTION_HEADER — Phát hiện Packing

TrườngÝ nghĩa
Virtual SizeDung lượng trong memory khi load
Size of Raw DataDung lượng trên disk

Bình thường: hai giá trị gần bằng nhau.

PotentialKeylogger.exe (bình thường):

SectionVirtual SizeRaw Size
.text7AF57C00
.rdata1AF51C00
.rsrc72B87400

PackedProgram.exe (packed):

SectionVirtual SizeRaw Size
.textA0000000 ← bất thường!
.data30000000
.rdata40000000
Dijfpds200000000
.sdfuok340003313F

Section names lạ (Dijfpds, Kijijl) + .text Raw Size = 0 → packer sẽ giải nén code vào .text section khi chạy.


Resource Section với Resource Hacker

Tool Resource Hacker dùng để duyệt .rsrc section.

Các subsection hữu ích cho malware analysis:

SubsectionThông tin
IconIcon hiện trong file listing
MenuTên và nội dung tất cả menus → gợi ý chức năng
DialogUI dialogs → nhìn là biết chương trình làm gì
String TableStrings bổ sung
Version InfoVersion, company name, copyright

Tổng kết thông tin từ PE Header

FieldThông tin
ImportsFunctions từ library khác mà malware sử dụng
ExportsFunctions của malware được thiết kế để gọi từ ngoài
Time Date StampThời điểm compile
SectionsTên sections, kích thước trên disk và trong memory
SubsystemConsole hay GUI
ResourcesStrings, icons, menus, thông tin khác

Câu hỏi ôn tập