Anti-靜態分析

看雪資料發表於2015-11-15

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 加解密技術交流站

 

相關文章