Bài 6: Stealth Malware: Encrypted Viruses & Virus Obfuscation
1. Virus Mã Hóa (Encrypted Viruses)
1.1 Tại sao virus sử dụng mã hóa?
Virus mã hóa xuất hiện nhằm hai mục tiêu chính:
- Chống phân tích (Anti-disassemble / Analysis-resistant): Khiến cho việc đọc hiểu mã nguồn trở nên khó khăn, làm chậm quá trình phân tích của nhà nghiên cứu bảo mật.
- Chống phát hiện (Anti-detection / Code-pattern detection resistant): Làm cho các công cụ quét dựa trên chữ ký (signature-based) không thể nhận diện được mã độc vì phần thân virus đã bị mã hóa, không còn xuất hiện ở dạng plaintext.
1.2 Mã hóa đơn giản (Simple Encryption)
Các virus mã hóa đầu tiên dùng thuật toán rất đơn giản, ví dụ điển hình là phép XOR giữa code với địa chỉ của nó.
Virus Cascade là virus mã hóa đầu tiên, sử dụng kỹ thuật XOR.
Tại sao XOR được ưa dùng?
XOR có hai đặc tính lý tưởng:
- Tốc độ: Cực nhanh ở cấp độ phần cứng.
- Khả năng đảo ngược (Reversibility): XOR hai lần với cùng một giá trị sẽ trả về giá trị ban đầu.
0xf247 XOR 0x0682 = 0xf4c5
0xf4c5 XOR 0x0682 = 0xf247Ví dụ mã hóa thực tế (dựa trên Cascade)
Giả sử cần mã hóa đoạn code 4 byte tại địa chỉ 0x08084044:
Code gốc: 0xc3c95f5e
XOR với địa chỉ: 0x08084044
XOR với độ dài: 0x00000004
─────────────────────────────
Kết quả mã hóa: 0xcbc11f1eGiải mã:
Encrypted code: 0xcbc11f1e
XOR với độ dài: 0x00000004
XOR với địa chỉ: 0x08084044
─────────────────────────────
Code gốc: 0xc3c95f5e1.3 Cấu trúc Decryptor (Bộ giải mã)
Decryptor là đoạn mã chạy trước, có nhiệm vụ giải mã phần thân virus trước khi thực thi. Nó luôn tồn tại ở dạng plaintext.
Tóm tắt các bước hoạt động:
- Tìm một “cavity” (vùng trống) trong file đích và ghi nhớ địa chỉ của nó.
- Mã hóa toàn bộ thân virus dựa trên địa chỉ cavity và độ dài virus.
- Chèn (inject) thân virus đã mã hóa vào cavity đó.
- Nạp địa chỉ của đoạn virus code vào thanh ghi
ESI. - Nạp độ dài của virus vào
ESP. - Giải mã từng khối dựa trên giá trị
ESIvàESP, ghi lại vào cavity.
1.4 Phân tích và phát hiện Virus mã hóa đơn giản
Cách phòng ngừa ở cấp OS
Hệ điều hành có thể ngăn ghi vào đoạn code thực thi (text segment). Virus có thể vượt qua bằng hai cách:
- Workaround 1: Giải mã vào một buffer trên stack hoặc heap, thay vì giải mã tại chỗ trong vùng text.
- Workaround 2: Thay đổi cờ (flag) của section
.textthành writable.
Cách phát hiện tốt nhất
Phát hiện các pattern của đoạn decryptor, vì đây là phần không bị mã hóa. Ví dụ: lệnh đặc trưng mov 0x0684, %esp (độ dài 1668 byte của Cascade).
1.5 Mã hóa phức tạp hơn (Difficult Encryption)
Ví dụ 1: Hai bộ mã hóa, hai bộ giải mã (Hai vòng, cùng loại)
- Mã hóa: Encryptor 1 mã hóa thân virus, Encryptor 2 mã hóa tiếp theo thứ tự ngược lại.
- Giải mã: Cần hai decryptor chạy hai vòng.
- Hạn chế: Các decryptor vẫn có thể bị phát hiện.
Ví dụ 2: Hai bộ mã hóa, hai bộ giải mã (Lồng nhau)
- Encryptor 1 mã hóa chính đoạn decryptor thứ hai.
- Encryptor 2 mã hóa thân virus.
- Kết quả: Decryptor 1 giải mã ra Decryptor 2, rồi Decryptor 2 mới giải mã thân virus.
- Lợi thế: Phân tích tĩnh Decryptor 1 sẽ không có ích gì vì decryptor đó có thể rất phổ biến (xuất hiện cả trong phần mềm thương mại), gây khó khăn và cả false positive.
1.6 Phát hiện Virus Mã Hóa (Detecting Encrypted Viruses)
Vì thân virus được mã hóa, phương pháp phổ biến nhất là phát hiện decryptor.
Các chỉ số nhận dạng decryptor:
- Vòng lặp chặt với lệnh XOR (Tight loops with XORs): Tuy nhiên, nhiều virus khác nhau có thể dùng cùng thuật toán decryptor nhưng payload hoàn toàn khác nhau.
- Độ dài virus đặc trưng (Unique virus length): Tuy nhiên, virus có thể tự “đệm” thêm để có cùng độ dài với virus khác.
Vấn đề về phân bổ bộ nhớ:
Khi OS chặn ghi trực tiếp vào text section, virus phải cấp phát bộ nhớ ở stack hoặc heap:
- Cấp phát trên heap: Cần code cấp phát không mã hóa → dễ phát hiện hơn (kết hợp lệnh malloc + lệnh giải mã = pattern tốt).
- Cấp phát trên stack: Ẩn tàng nhất, chỉ cần lệnh
sub $length, %esp.
Các phương pháp phát hiện nâng cao:
- Emulation và Dynamic Analysis: Hiệu quả nhưng tốn kém và thường là độc quyền.
- Static Analysis + SDT (Software Dynamic Translation): Một công cụ instrumentation có thể dump code ra sau khi giải mã xong. SDT decode chương trình vào một buffer khi nó chạy, cho phép kiểm tra code đã giải mã trong translation cache.
2. Tiến hóa của Virus Code (Virus Code Evolution)
Virus Simile là ví dụ điển hình về virus tiến hóa để đánh bại phát hiện dựa trên pattern. Mỗi lần nhân bản, nó tạo ra một chuỗi lệnh cấp phát bộ nhớ khác nhau trong decryptor thông qua các kỹ thuật obfuscation và sắp xếp lại code đơn giản, tránh bị phát hiện qua memory allocator code.
Phổ biến hơn là đột biến chính đoạn decryptor kết hợp dùng stack allocation.
2.1 Phân loại Virus theo Khả năng Đột biến Decryptor
3. Obfuscation (Làm rối code)
3.1 Khái niệm
Obfuscation là hành động cố ý tạo ra mã nguồn hoặc mã máy khó cho con người hiểu. Virus dùng obfuscation để vượt qua phần mềm diệt virus và cản trở phân tích thủ công. Mã hóa virus là một dạng obfuscation. Các dạng phức tạp hơn bao gồm: oligomorphic, polymorphic và metamorphic.
4. Oligomorphic Viruses
4.1 Khái niệm và lịch sử
Phát hiện virus mã hóa có decryptor đặc trưng là quá dễ dàng (theo quan điểm của người viết virus). Virus oligomorphic mang theo vài chục decryptor dưới dạng data; khi nhân bản, chọn một ngẫu nhiên, mã hóa thân virus với nó, rồi đặt cả thân virus lẫn decryptor vào file đích.
- Whale: Virus oligomorphic đầu tiên.
- Memorial: Virus oligomorphic trên Windows 95, tạo ra 96 decryptor khác nhau, chọn một khi nhân bản.
4.2 Hạn chế
Mang theo nhiều decryptor làm tăng kích thước virus. Phát hiện 96 pattern khác nhau là một giải pháp không thực tế khi phải đối phó với hàng nghìn virus khác nhau, dẫn đến bùng nổ kích thước cơ sở dữ liệu pattern.
4.3 Phát hiện
Số lượng decryptor còn hạn chế nên vẫn có thể phát hiện bằng pattern matching. Tuy nhiên cần emulation, debugging, hoặc dynamic analysis để giải mã và phân tích thân virus.
5. Polymorphic Viruses
5.1 Khái niệm
Trong khi oligomorphic virus tạo ra hàng chục biến thể decryptor, polymorphic virus tạo ra hàng triệu biến thể bằng cách:
- Sắp xếp lại lệnh (code rearrangements)
- Chèn các junk instruction (lệnh vô dụng)
Virus polymorphic đầu tiên là V2PX (còn gọi là 1260, vì chỉ có 1260 byte!), được tạo ra năm 1990 cho DOS.
5.2 Junk Instructions (Lệnh rác)
Junk instruction có thể là:
- Lệnh no-op (không làm gì)
- Lệnh sử dụng register hoặc memory không được dùng bởi decryptor
Ví dụ decryptor gốc của Memorial:
Decrypt:
xor %al, (%esi) ; giải mã 1 byte với key trong AL
inc %esi ; đến byte tiếp theo
inc %al ; trượt key
dec %ecx ; giảm bộ đếm
jnz Decrypt ; lặp lại nếu còn byteSau khi chèn junk instructions:
Decrypt:
add %ebx, %edx ; JUNK
xor %al, (%esi) ; giải mã byte với key trong AL
dec %edx ; JUNK
inc %esi ; đến byte tiếp theo
mov (whocares), %edx ; JUNK
inc %al ; trượt key
dec %ecx ; giảm bộ đếm
jnz DecryptBiến thể khác với junk ở vị trí và lệnh khác nhau:
Decrypt:
add $4, %bh ; JUNK
xor %edx, %edx ; JUNK
xor %al, (%esi) ; giải mã
inc %esi ; đến byte tiếp
xchg %edx, %ebx ; JUNK
inc %al ; trượt key
cmp %ecx, %edx ; JUNK
dec %ecx ; giảm bộ đếm
jnz Decrypt5.3 Instruction Variation (Biến thể lệnh)
Ngoài junk, có thể thay thế các lệnh bằng lệnh tương đương:
inc %esi
inc %al
dec %ecx
jnz Decryptadd $1, %esi
add $1, %al
sub $1, %ecx
jnz Decryptadd $1, %esi
add $1, %al
loop Decrypt ; ECX tự động giảm và kiểm tra bởi lệnh loop5.4 Ví dụ: Virus 1260
Nhà nghiên cứu Mark Washburn tạo ra 1260 để chứng minh cho cộng đồng diệt virus thấy rằng các scanner dựa trên chuỗi ký tự (string-based) là không đủ. Ông đã chỉnh sửa virus Vienna hiện có, giới hạn junk instructions ở 39 byte, và thiết kế decryptor dễ sắp xếp lại thứ tự.
Cấu trúc decryptor của 1260:
Decryptor gồm 3 nhóm lệnh (group), mỗi nhóm có các lệnh có thể hoán đổi thứ tự cho nhau mà không ảnh hưởng kết quả:
- Group 1 (Prologue): 3 lệnh khởi tạo (mov key vào AX, mov offset vào DI, mov byte count vào CX)
- Group 2 (Decryption loop body): 2 lệnh giải mã (xor CX với [DI], xor AX với [DI])
- Group 3 (Iteration): 2 lệnh tăng con trỏ/key (inc DI, inc AX)
- Lệnh loop: không thuộc group nào, đứng cố định
Ngoài ra có 9 vị trí có thể chèn junk instructions xuyên suốt decryptor.
Số lượng biến thể:
| Nguồn đa dạng | Số lượng |
|---|---|
| Sắp xếp lại lệnh trong nhóm | 3! × 2! × 2! = 24 biến thể |
| Vị trí chèn junk (9 vị trí, ~15 lệnh) | Vài nghìn cách |
| Lựa chọn lệnh junk (hàng trăm lệnh x86 + toán hạng) | Hàng trăm nghìn khả năng |
| Tổng lý thuyết | ~1 tỷ biến thể |
5.5 Register Replacement (Thay thế thanh ghi)
Đây là kỹ thuật polymorphic mà 1260 không sử dụng, nhưng rất hiệu quả. Nếu decryptor chỉ dùng 3 thanh ghi, virus có thể chọn bộ thanh ghi khác nhau cho từng lần nhân bản. Điều này thêm hàng chục biến thể nhân. Một decryptor chỉ 8 lệnh có thể tạo ra hơn 100 tỷ biến thể chỉ bằng 4 kỹ thuật polymorphic đơn giản.
5.6 Polymorphic Mutation Engines
Việc tạo ra virus polymorphic hoạt động chính xác không mắc lỗi khi nhân bản là rất khó. Vì vậy, một số tác giả virus tạo ra mutation engine — công cụ biến virus mã hóa thông thường thành virus polymorphic.
MtE (Dark Avenger Mutation Engine): Engine đột biến đầu tiên, xuất hiện mùa hè 1991 tại Bulgaria.
MtE nhận đầu vào là: tham số về kích thước và vị trí file đích, con trỏ đến virus code cần mã hóa, con trỏ đến buffer để ghi output, bitmask cho biết thanh ghi nào cần tránh. Sau đó nó tạo ra polymorphic wrapper code bao quanh virus và nhân bản polymorphically.
MtE đặc biệt ở chỗ nó tạo ra nhiều chuỗi obfuscation để tính toán ra cùng một giá trị theo những cách cực kỳ khác nhau.
Ví dụ MtE — đặt BP = 0x0d2b:
mov $0xA16C, %bp
mov $0x03, %cl
ror %cl, %bp ; Xoay phải BP 3 lần → BP = giá trị bí ẩn 1
mov %bp, %cx ; Lưu vào CX
mov $0x856e, %bp
or $0x740f, %bp ; BP = giá trị bí ẩn 2
mov %bp, %si ; Lưu vào SI
mov $0x3b92, %bp
add %si, %bp ; BP := BP + giá trị bí ẩn 2
xor %cx, %bp ; XOR với giá trị bí ẩn 1
sub $0xb10c, %bp ; BP bây giờ có giá trị mong muốn (0x0d2b)5.7 Phát hiện Polymorphic Viruses
Các scanner diệt virus vào 1990–1991 ban đầu không đối phó được. Giải pháp được thêm vào là x86 virtual machine (emulator) tích hợp trong scanner để giả lập một đoạn code ngắn, xem kết quả có khớp với decryptor đã biết không. Điều này thúc đẩy sự phát triển các anti-emulation techniques trong các virus “bọc giáp” (armored viruses).
Chìa khóa phát hiện: thân virus bắt buộc phải được giải mã về dạng plaintext tại một thời điểm nào đó. Do đó cần dynamic analysis; một SDT (Software Dynamic Translation) có thể chạy đến điểm giải mã rồi kiểm tra thân virus trong bộ nhớ SDT.
6. Metamorphic Viruses
6.1 Khái niệm
Metamorphic virus được định nghĩa là body-polymorphic virus: áp dụng kỹ thuật polymorphic cho toàn bộ thân virus, không chỉ decryptor. Không cần mã hóa để được xem là metamorphic. Thân virus thay đổi qua mỗi thế hệ, trở thành mục tiêu di động cho phân tích khi nó lan truyền.
6.2 Metamorphism: Source Code
Trên Unix/Linux, hầu như luôn có sẵn C compiler. Virus Apparition chèn các junk instruction ở cấp source code C vào virus rồi gọi trình biên dịch C. Lợi thế so với ASM level: tránh lỗi dùng nhầm register (vì compiler tự xử lý), và bản thân sự khác biệt giữa các phiên bản compiler, thư viện… đã tạo ra sự đa dạng thêm.
Trên Windows, virus MSIL/Gastropod hoạt động tương tự nhưng trên MSIL (Microsoft Intermediate Language), tận dụng .NET Framework để biên dịch.
6.3 Metamorphism: Register Replacement
Virus Regswap (Windows 95, tháng 12/1998) sử dụng metamorphism giới hạn trong việc thay thế thanh ghi.
Hai thế hệ của Regswap:
pop edx
mov edi, 0004h
mov esi, ebp
mov eax, 000ch
add edx, 0088h
mov ebx, [edx]
mov [esi+eax*4+1118], ebxpop eax
mov ebx, 0004h
mov edx, ebp
mov edi, 000ch
add eax, 0088h
mov esi, [eax]
mov [edx+edi*4+1118], esiPhát hiện Regswap: Dùng wildcard trong pattern scanner. Chỉ có các hex digit mã hóa thanh ghi là khác nhau. Cả hai biến thể đều khớp với pattern 5?B?04000000.
6.4 Metamorphism: Module Permutation
Hoán đổi thứ tự các module (khối nhỏ) của virus. Hiệu quả nhất khi code được viết thành nhiều module nhỏ. 8 module tạo ra 8! = 40,320 hoán vị. Tuy nhiên, nếu dùng wildcard để che các địa chỉ và offset trong code, scanner vẫn có thể phát hiện bằng chuỗi tìm kiếm ngắn bên trong từng module.
6.5 Metamorphism: Instruction Permutation
Họ virus Zperm sắp xếp lại các lệnh riêng lẻ và chèn jump để giữ nguyên chức năng của code.
Ba thế hệ Zperm:
Phát hiện: Dùng SDT hoặc Phoenix Analysis Tool để “làm thẳng” (straighten) chuỗi jump thành straight-line code, rồi nhận dạng bằng pattern. Tuy nhiên, Zperm còn dùng thêm instruction replacement và junk insertion để thực sự metamorphic.
6.6 Metamorphism: Build-and-Execute
Virus Zmorph (đầu năm 2000) có cách tiếp cận độc đáo:
- Nhiều subroutine nhỏ được thêm vào cuối file PE.
- Chúng tạo thành một call chain.
- Mỗi subroutine là body-polymorphic (metamorphic).
- Mỗi subroutine xây dựng một đoạn virus code nhỏ trên stack.
- Khi xây dựng xong, điều khiển được chuyển đến vùng stack.
- Payload không bao giờ xuất hiện dưới dạng pattern thông thường trong file để scanner có thể quét.
6.7 Metamorphic Engines
Metamorphic engine là bộ nhân bản code có các heuristic tiến hóa tích hợp:
- Thay lệnh số học và load-store bằng lệnh tương đương
- Chèn junk instructions
- Sắp xếp lại lệnh
- Thay các hằng số nội tại bằng giá trị tính toán
Đặc biệt: Các hằng số nội tại (built-in constants) rất quan trọng với scanner dựa trên pattern. Engine biến đổi constants từ thế hệ này sang thế hệ khác khiến static analysis gần như bất lực.
Ví dụ ba thế hệ do metamorphic engine tạo ra:
mov dword ptr [esi], 55000000h
mov dword ptr [esi+0004], 5151EC8Bhmov edi, 55000000h ; constant chưa thay đổi
mov dword ptr [esi], edi
pop edi ; junk
push edx ; junk
mov dh, 40h ; junk
mov edx, 5151EC8Bh ; constant chưa thay đổi
push ebx ; junk
mov ebx, edx
mov dword ptr [esi+0004], ebxmov ebx, 5500000Fh ; constant chưa thay đổi
mov dword ptr [esi], ebx
pop ebx ; junk
push ecx ; junk
mov ecx, 5FC000CBh ; constant ĐÃ thay đổi
add ecx, F191EBC0h ; ECX bây giờ có giá trị gốc
mov dword ptr [esi+0004], ecx6.8 Điểm Yếu Chung của Metamorphic Viruses
Để biến đổi code qua từng thế hệ, metamorphic virus phải tự phân tích lại đoạn code đã biến đổi mà nó tạo ra. Điều này đòi hỏi phải dùng một số quy ước coding hoặc phát triển thuật toán đặc biệt để phát hiện chính các obfuscation của mình. Nghĩa là trong chính cơ chế đột biến có một pattern. Khi nhà nghiên cứu diệt virus phát hiện ra pattern đó, họ có thể dùng Algorithmic Detection — thuật toán đặc thù cho virus đó để trích xuất các lệnh quan trọng từ thân virus đã bị biến đổi.
7. Bảng Tổng Kết So Sánh
| Loại Virus | Cơ chế | Số biến thể | Phương pháp phát hiện |
|---|---|---|---|
| Simple Encrypted | XOR đơn giản, decryptor cố định | 1 (thay đổi theo địa chỉ) | Pattern matching trên decryptor |
| Oligomorphic | Mang sẵn ~vài chục decryptor | Vài chục | Pattern matching nhiều pattern + Emulation |
| Polymorphic | Tạo decryptor động với junk/reorder | Hàng triệu đến hàng tỷ | Emulation, SDT, Dynamic analysis |
| Metamorphic | Biến đổi toàn bộ thân virus | Vô số | Algorithmic detection, SDT |
Câu Hỏi Trắc Nghiệm
Câu 1. Mục tiêu chính của việc mã hóa virus là gì?
- A. Giảm kích thước file virus
- B. Tăng tốc độ lây nhiễm
- C. Chống phân tích và chống phát hiện dựa trên pattern
- D. Bảo vệ code khỏi bị sao chép
Câu 2. Virus mã hóa đầu tiên trong lịch sử là?
- A. Simile
- B. Vienna
- C. Cascade
- D. Whale
Câu 3. Tại sao XOR được sử dụng phổ biến trong mã hóa virus đơn giản?
- A. XOR là thuật toán phức tạp, khó bị phá vỡ
- B. XOR rất nhanh và có tính đảo ngược
- C. XOR tạo ra output ngẫu nhiên mỗi lần
- D. XOR không để lại dấu vết trong bộ nhớ
Câu 4. Trong ví dụ mã hóa Cascade, công thức mã hóa là gì?
- A. Code XOR Key = Encrypted
- B. Code XOR Address = Encrypted
- C. Code XOR Address XOR Length = Encrypted
- D. Code XOR Length = Encrypted
Câu 5. Tại sao hex patterns của Cascade là “file-dependent”?
- A. Vì virus thay đổi thuật toán mã hóa theo từng file
- B. Vì kết quả mã hóa phụ thuộc vào địa chỉ chèn virus, khác nhau giữa các file
- C. Vì virus đọc nội dung file để tạo key
- D. Vì mỗi file có độ dài khác nhau
Câu 6. Tại sao Cascade dùng ESP để lưu độ dài virus?
- A. ESP là thanh ghi nhanh nhất trên x86
- B. Để cản trở việc debug bằng debugger thông thường
- C. Vì ESP có thể lưu trữ số nguyên lớn
- D. Để tránh dùng các thanh ghi general-purpose
Câu 7. Phương pháp tốt nhất để phát hiện virus mã hóa đơn giản là gì?
- A. Quét chữ ký trên thân virus đã mã hóa
- B. Phát hiện pattern của đoạn decryptor
- C. Kiểm tra kích thước file
- D. Theo dõi lưu lượng mạng
Câu 8. Khi OS ngăn ghi vào text section, virus mã hóa có thể làm gì?
- A. Dừng hoạt động
- B. Giải mã vào buffer trên stack/heap hoặc thay đổi cờ của section .text
- C. Gửi yêu cầu đến kernel để được cấp quyền
- D. Chỉ có thể hoạt động trên OS không có bảo vệ
Câu 9. DEP (Data Execution Prevention) có ngăn chặn virus mã hóa không?
- A. Có, DEP hoàn toàn ngăn chặn được
- B. Không, vì virus có thể dùng system call để bật cờ thực thi cho stack/heap
- C. Có, nếu virus không có decryptor
- D. Không, vì DEP chỉ áp dụng cho kernel mode
Câu 10. Mã hóa phức tạp dạng “hai bộ mã hóa lồng nhau” (Ví dụ 2) có lợi thế gì so với Ví dụ 1?
- A. Tạo ra nhiều biến thể hơn
- B. Decryptor 1 có thể giống phần mềm thương mại, gây khó phân tích và false positive
- C. Không cần decryptor
- D. Virus nhỏ hơn
Câu 11. Virus oligomorphic đầu tiên là gì?
- A. Cascade
- B. Whale
- C. Memorial
- D. Simile
Câu 12. Virus Memorial tạo ra bao nhiêu decryptor khác nhau?
- A. 10
- B. 48
- C. 96
- D. 256
Câu 13. Nhược điểm lớn nhất của virus oligomorphic là gì?
- A. Tốc độ lây nhiễm chậm
- B. Mang theo nhiều decryptor làm tăng kích thước virus
- C. Decryptor dễ bị phát hiện hơn
- D. Không thể mã hóa thân virus
Câu 14. Tại sao phát hiện 96 pattern cho Memorial là “không thực tế”?
- A. Các scanner không hỗ trợ nhiều hơn 10 pattern
- B. Phải đối phó với hàng nghìn virus, thêm 96 pattern sẽ gây bùng nổ kích thước database
- C. Các pattern của Memorial quá ngắn
- D. 96 pattern là quá ít để nhận diện chính xác
Câu 15. Virus polymorphic đầu tiên là gì và được tạo ra năm nào?
- A. Cascade, 1988
- B. V2PX (1260), 1990
- C. MtE, 1991
- D. Simile, 1995
Câu 16. Đâu KHÔNG phải là junk instruction hợp lệ?
- A. Lệnh no-op
- B. Lệnh dùng register không được dùng bởi decryptor
- C. Lệnh XOR giải mã chính của decryptor
- D. Lệnh dùng memory location không liên quan
Câu 17. Virus 1260 có bao nhiêu nhóm lệnh (groups) trong decryptor?
- A. 2
- B. 3
- C. 4
- D. 9
Câu 18. Số biến thể tạo ra chỉ từ việc sắp xếp lại lệnh trong các nhóm của 1260 là bao nhiêu?
- A. 12
- B. 24
- C. 48
- D. 120
Câu 19. Trong 1260, có bao nhiêu vị trí có thể chèn junk instructions?
- A. 3
- B. 6
- C. 9
- D. 12
Câu 20. Về lý thuyết, 1260 có thể tạo ra bao nhiêu biến thể?
- A. ~1 triệu
- B. ~1 tỷ
- C. ~1 nghìn
- D. ~100 triệu
Câu 21. Kỹ thuật nào mà virus 1260 KHÔNG sử dụng?
- A. Sắp xếp lại lệnh trong nhóm
- B. Chèn junk instructions
- C. Register replacement
- D. Giới hạn kích thước junk ở 39 byte
Câu 22. Mark Washburn tạo ra virus 1260 nhằm mục đích gì?
- A. Tấn công hệ thống tài chính
- B. Chứng minh string-based scanner không đủ để nhận diện virus
- C. Kiểm tra hiệu năng phần cứng
- D. Nghiên cứu thuật toán mã hóa mới
Câu 23. Mutation engine MtE được tạo ra bởi ai và khi nào?
- A. Mark Washburn, 1990, Mỹ
- B. Dark Avenger, mùa hè 1991, Bulgaria
- C. Mark Ludwig, 1989, Đức
- D. Unknown, 1993, Nga
Câu 24. MtE nhận đầu vào là gì để tạo ra polymorphic wrapper?
- A. Chỉ cần thân virus
- B. Tham số kích thước, vị trí file, con trỏ virus, con trỏ buffer output, bitmask thanh ghi cần tránh
- C. Key mã hóa và thân virus
- D. Địa chỉ cavity và độ dài virus
Câu 25. Kỹ thuật đặc biệt của MtE là gì ngoài chèn junk instructions?
- A. Sử dụng nhiều thuật toán mã hóa khác nhau
- B. Tạo nhiều chuỗi obfuscation tính cùng một giá trị theo cách rất khác nhau
- C. Thay đổi entry point của file
- D. Mã hóa decryptor thứ hai
Câu 26. Cách scanner phát hiện polymorphic virus vào đầu thập niên 1990 là gì?
- A. Quét pattern trên toàn bộ file
- B. Thêm x86 virtual machine (emulator) để giả lập đoạn code ngắn
- C. So sánh hash của file
- D. Kiểm tra header của file PE
Câu 27. Việc thêm emulator vào scanner dẫn đến hệ quả gì?
- A. Virus ngừng phát triển
- B. Thúc đẩy phát triển các kỹ thuật anti-emulation trong armored viruses
- C. Scanner trở nên hoàn hảo
- D. Virus chuyển sang tấn công mạng
Câu 28. Tại sao dynamic analysis là cần thiết để phát hiện polymorphic virus?
- A. Vì static analysis không thể đọc được file nhị phân
- B. Vì thân virus bắt buộc phải được giải mã về plaintext tại một thời điểm khi chạy
- C. Vì polymorphic virus chỉ hoạt động trong bộ nhớ
- D. Vì scanner không thể mở file bị mã hóa
Câu 29. Metamorphic virus khác gì so với polymorphic virus?
- A. Metamorphic dùng nhiều loại mã hóa hơn
- B. Metamorphic biến đổi toàn bộ thân virus, không chỉ decryptor; không cần mã hóa
- C. Metamorphic chỉ hoạt động trên Linux
- D. Metamorphic không thể nhân bản
Câu 30. Virus Apparition sử dụng kỹ thuật metamorphism nào?
- A. Register replacement
- B. Module permutation
- C. Source code metamorphism bằng C compiler
- D. Instruction permutation
Câu 31. Lợi thế của source code metamorphism so với ASM-level metamorphism là gì?
- A. Tạo ra nhiều biến thể hơn
- B. Tránh lỗi dùng nhầm register vì compiler tự xử lý; sự khác biệt compiler cũng tạo thêm đa dạng
- C. Không cần compiler trên máy nạn nhân
- D. Code nhỏ hơn
Câu 32. MSIL/Gastropod virus hoạt động như thế nào?
- A. Dùng C compiler để biên dịch lại virus
- B. Dùng .NET Framework để biên dịch MSIL (Microsoft Intermediate Language)
- C. Tự modify binary của chính nó
- D. Dùng PowerShell để tái tạo code
Câu 33. Virus Regswap sử dụng kỹ thuật metamorphism nào?
- A. Junk instruction insertion
- B. Module permutation
- C. Register replacement
- D. Source code metamorphism
Câu 34. Cách phát hiện Regswap là gì?
- A. Emulation
- B. Pattern scanner dùng wildcard để bỏ qua các byte mã hóa thanh ghi
- C. Hash comparison
- D. Behavioral analysis
Câu 35. 8 module tạo ra bao nhiêu hoán vị trong kỹ thuật module permutation?
- A. 256
- B. 5040
- C. 40320
- D. 362880
Câu 36. Kỹ thuật module permutation có thể bị vô hiệu hóa bằng cách nào?
- A. Emulation
- B. Dùng wildcard để che địa chỉ và offset trong các chuỗi tìm kiếm ngắn bên trong từng module
- C. Phân tích entropy
- D. Kiểm tra header file
Câu 37. Họ virus Zperm sử dụng kỹ thuật gì?
- A. Source code metamorphism
- B. Register replacement thuần túy
- C. Sắp xếp lại lệnh riêng lẻ và chèn jump để giữ chức năng
- D. Module permutation
Câu 38. Cách phát hiện Zperm là gì và tại sao nó không hoàn toàn hiệu quả?
- A. Dùng SDT/Phoenix Analysis Tool để làm thẳng jump chain, nhưng Zperm còn dùng thêm instruction replacement và junk insertion
- B. Dùng emulation, và nó hoàn toàn hiệu quả
- C. Kiểm tra kích thước file, không hiệu quả vì Zperm thay đổi kích thước
- D. Pattern matching thông thường, không hiệu quả vì Zperm mã hóa toàn bộ
Câu 39. Virus Zmorph hoạt động theo cơ chế nào?
- A. Mã hóa toàn bộ thân virus bằng AES
- B. Thêm nhiều subroutine nhỏ vào cuối PE file, mỗi subroutine xây dựng đoạn code trên stack rồi chuyển thực thi lên stack
- C. Chèn code vào các DLL hệ thống
- D. Dùng kernel rootkit để ẩn mình
Câu 40. Metamorphic engine khác gì so với polymorphic mutation engine?
- A. Không có sự khác biệt
- B. Metamorphic engine biến đổi toàn bộ thân virus qua nhiều thế hệ, kể cả hằng số nội tại; polymorphic engine chỉ tạo wrapper decryptor
- C. Metamorphic engine chỉ dùng register replacement
- D. Polymorphic engine mạnh hơn
Câu 41. Tại sao hằng số nội tại (built-in constants) quan trọng với metamorphic engine?
- A. Hằng số giúp virus nhận ra chính mình
- B. Các hằng số là mục tiêu đặc biệt của scanner dựa trên pattern; đột biến chúng làm static analysis khó/không thể
- C. Hằng số giúp tính toán địa chỉ mã hóa
- D. Hằng số xác định loại mã hóa được dùng
Câu 42. Điểm yếu chung của mọi metamorphic virus là gì?
- A. Kích thước file quá lớn
- B. Tốc độ lây nhiễm chậm
- C. Cơ chế đột biến bản thân chứa pattern — virus phải tự phân tích code đã tạo, tạo ra sự nhất quán có thể phát hiện
- D. Chỉ hoạt động trên một loại OS
Câu 43. Phương pháp “Algorithmic Detection” để phát hiện metamorphic virus là gì?
- A. Quét toàn bộ file tìm chuỗi byte cố định
- B. Dùng thuật toán đặc thù cho từng virus để trích xuất các lệnh quan trọng từ thân virus đã bị biến đổi
- C. So sánh hash của file với database
- D. Giám sát hành vi trong sandbox
Câu 44. SDT (Software Dynamic Translation) giúp phát hiện virus như thế nào?
- A. Ngăn virus chạy hoàn toàn
- B. Decode chương trình vào buffer khi nó chạy, cho phép kiểm tra code đã giải mã trong translation cache
- C. Mã hóa lại virus để vô hiệu hóa
- D. Gửi báo cáo lên server trung tâm
Câu 45. Cấp phát bộ nhớ trên stack ẩn tàng hơn heap vì lý do gì?
- A. Stack nhanh hơn heap
- B. Chỉ cần lệnh
sub $length, %esp— không có lệnh cấp phát rõ ràng nào có thể dùng làm pattern - C. Stack không thể được theo dõi bởi OS
- D. Virus trên stack không bao giờ bị swap ra disk
Câu 46. Virus Simile nổi bật vì điều gì?
- A. Là virus metamorphic đầu tiên
- B. Mỗi lần nhân bản tạo ra chuỗi lệnh cấp phát bộ nhớ khác nhau trong decryptor, tránh phát hiện qua allocator code
- C. Sử dụng mã hóa AES 256-bit
- D. Tấn công BIOS
Câu 47. Ba loại virus theo khả năng đột biến decryptor, từ ít đến nhiều biến thể, là?
- A. Polymorphic → Oligomorphic → Metamorphic
- B. Oligomorphic → Polymorphic → Metamorphic
- C. Metamorphic → Oligomorphic → Polymorphic
- D. Simple → Oligomorphic → Metamorphic
Câu 48. Emulation để phát hiện virus có nhược điểm gì?
- A. Không thể chạy trên phần cứng thật
- B. Tốn kém (expensive) và thường là độc quyền (proprietary); có thể bị vô hiệu hóa bởi anti-emulation techniques
- C. Chỉ hoạt động với DOS virus
- D. Không thể phát hiện polymorphic virus
Câu 49. Trong kỹ thuật “Build-and-Execute” của Zmorph, tại sao payload khó bị phát hiện bởi scanner?
- A. Payload được mã hóa bằng RSA
- B. Payload không bao giờ xuất hiện hoàn chỉnh trong file — nó được xây dựng từng mảnh nhỏ trên stack tại runtime
- C. Payload nằm trong vùng nhớ kernel
- D. Payload chỉ tồn tại trong registry
Câu 50. Điểm khác biệt then chốt giữa virus và buffer overflow code injection liên quan đến DEP là gì?
- A. Virus lớn hơn nên DEP không xử lý được
- B. Buffer overflow injection chèn toàn bộ code vào stack/heap nên DEP ngăn được; virus có decryptor trong text section nên luôn được thực thi bất kể DEP
- C. DEP chỉ áp dụng cho buffer overflow, không áp dụng cho virus
- D. Virus dùng mã hóa nên DEP không nhận ra được
Câu 51. Cấu phát bộ nhớ trên heap để chứa code giải mã tạo ra pattern nào dễ bị phát hiện?
- A. Pattern của các lệnh XOR
- B. Kết hợp lệnh cấp phát bộ nhớ (như malloc) với các lệnh giải mã điển hình
- C. Pattern của lệnh JMP tới heap
- D. Không tạo pattern nào
Câu 52. Tại sao phát hiện decryptor bằng “tight loops with XORs” có thể gây false positive?
- A. Nhiều virus dùng XOR khác nhau
- B. Phần mềm thương mại dùng anti-debug wrapper cũng có cấu trúc tương tự decryptor của Cascade
- C. XOR được dùng trong mã hóa SSL/TLS
- D. Compiler tối ưu hóa tạo ra vòng lặp XOR tự nhiên
Câu 53. Khi một polymorphic virus kết hợp EPO (Entry Point Obscuring) với anti-emulation, tại sao việc phát hiện trở nên đặc biệt khó?
- A. EPO làm tăng kích thước file vượt giới hạn của scanner
- B. EPO trì hoãn việc thực thi decryptor đến rất muộn trong luồng thực thi; emulator thường chỉ giả lập một đoạn ngắn nên có thể không bao giờ đến đoạn decryptor
- C. EPO xóa decryptor khỏi file sau khi thực thi
- D. Anti-emulation làm hỏng emulator hoàn toàn