Anti-靜態分析
1.死迴圈語句
型別:對付W32Dasm
平臺:Windows9x 、Windows NT
原理:下面是故意在程式中插入的一個死迴圈,可能會使W32Dasm的某些版本停止響應:
0401000 JMP 00401005
……
00401005 JMP 00401000
對策:W32Dasm進入死迴圈後,用Bpx hmempcy設斷,來到死迴圈程式碼處,將其跳出死迴圈,或用IDA來反彙編。
2.利用花指令
花指令是對付靜態分析的重要手段。以下是一段彙編源程式:
start_: xor
eax,1 add eax,2
jmp label1
label1: xor eax,3
add eax,4 xor
eax,5 end start_ |
此時把源程式進行編譯,然後用W32Dasm進行反彙編,得到的反彙編結果完全正常。接著我們將上述源程式作如下修改:
start_: xor
eax,1 add eax,2
jnz label1
;注意這裡,用兩句條件跳轉代替了:jmp label1 jz
label1 db
0E8h ;注意這個無用的位元組和源程式的區別 label1:
xor eax,3 add
eax,4 xor eax,5
end start_ |
再把源程式進行編譯,然後用W32Dasm進行反彙編,來看一下反彙編後的結果:
:00401000 83F001 :00401003 83C002 :00401006 7503 :00401008
7401 :0040100A E883F00383 :0040100F C00483F0 | xor eax, 00000001
add eax, 00000002 jne 0040100B je 0040100B call 83440092 rol byte
ptr [ebx+4*eax], F0 |
結果令人很吃驚,會發現W32Dasm反彙編的結果和事先寫的彙編指令不一樣,從反彙編的結果中已經無法理解程式的"真實"的功能了,W32Dasm給出了一個意想不到的答案。
這是因為上述改動是為了在W32Dasm的反彙編工作中做點手腳,從而使得它犯下錯誤。那麼W32Dasm為什麼會因此而犯下這樣的錯誤呢?
不同的機器指令包含的位元組數並不相同,有的是單位元組指令,有的是多位元組指令。對於多位元組指令來說,反彙編軟體需要確定指令的第一個位元組的起始位置,也就是操作碼的位置,這樣才能正確地反彙編這條指令,否則它就可能反彙編成另外一條指令了。
如果在程式中加入一些無用的位元組來干擾反彙編軟體的判斷,從而使得它錯誤地確定指令的起始位置,那麼也就達到了干擾W32Dasm反彙編工作的目的。
透過前面的介紹,知道由於"無用的位元組"干擾了W32Dasm對指令起始位置的判斷,從而導致反彙編的錯誤結果,所以如果能讓W32Dasm正確地識別出指令起始位置,也就達到了去除花指令的目的了。比如可以把那些無用的位元組都替換成單位元組指令,最常見的一種替換方法是把無用的位元組替換成
NOP 指令,即十六進位制數 90。
作者:Ljtt 加解密技術交流站