組式語言與機器碼一一對應,編譯器不插入額外代碼,導致靜態反組譯工具(如 Win32Dasm、IDA Pro)輸出極接近原始碼。破解者僅需基本 SDK 與組語經驗,即可定位關鍵邏輯(如註冊碼驗證、序號檢查)並修改跳轉指令繞過保護。反反組譯技術旨在干擾靜態分析工具的控制流圖重建與字串識別,增加逆向工程難度。
預設情況下,invoke MessageBox, 0, offset szText, 0, 0 會在資料段產生字串,反組譯工具掃描資料段即可列出所有字串並追蹤交叉引用。
對策:使用暫存器間接傳遞字串位址:
lea eax, szWelcome
invoke MessageBox, 0, eax, 0, 0
此後反組譯工具的「字串參考」列表將顯示空白,因為呼叫點不再直接引用資料段標號。
在關鍵代碼前插入永不執行但干擾反組譯器線性掃描的指令序列。
jz @F
jnz @F
fake db "Fake String to Confuse", 0
@@:
lea eax, RealString
invoke MessageBox, 0, eax, 0, 0
jz @F + jnz @F:互斥條件跳轉,必定執行 後續代碼(@F 為匿名前向標號)。push 0 ; uType
push 0 ; hWnd
push offset RealStr ; lpCaption
push 0 ; lpText
jz @F
jnz @F
fake db "Another Fake", 0
@@:
call [MessageBox] ; 間接呼叫,而非 invoke
invoke ExitProcess, 0
效果:
call [MessageBox] 為間接呼叫,工具無法靜態解析目標 API(除非模擬執行)。.386
.model flat, stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.code
START:
push 0
push 0
push offset Welcome
push 0
jz @F
jnz @F
Welcome db "Welcome", 0
@@:
; 手動解析 IAT 取得 MessageBox 真實位址
mov eax, [MessageBox+4] ; IAT 條目:前 4 字節為 DLL 名 RVA,後 4 字節為函數 RVA
sub eax, 4 ; 簡易演示:實際需解析 PE 結構
jnz @F
Welcome1 db "Welcome1", 0
@@:
call eax
invoke ExitProcess, 0
END START
此技術對 SoftICE 等動態除錯器同樣有效:雖可在 MessageBoxA 設斷點中斷,但反組譯視窗顯示的代碼仍是亂碼,無法直觀理解邏輯。
| 策略 | 適用場景 | 維護成本 | 對抗強度 |
|---|---|---|---|
| 全域間接字串引用 | 所有敏感字串 | 低 | 中 (阻擋字串掃描) |
| 關鍵邏輯花指令 | 註冊驗證、授權檢查、核心演算法 | 中 | 高 (破壞控制流圖) |
| 手動 API 呼叫 + IAT 解析 | 核心 API (MessageBox, CreateFile, RegOpenKey 等) | 高 | 極高 (阻擋 API 識別與交叉引用) |
| 加殼/加密 | 整個程式 | 極高 (需專用工具) | 最高 |
MASM 反反組譯技術的核心在於破壞靜態分析工具的假設:線性掃描、直接引用識別、API 交叉引用。間接字串引用、花指令、手動 API 呼叫是入門級技巧,適合保護非關鍵邏輯或提高初級破解門檻。面對專業逆向工程,必須結合動態加密、虛擬化、完整性驗證等多層次防護體系。安全無絕對,唯有持續迭代。