任何技術都有被攻破的一天,沒有包打天下的方法。再強的花指令也是有可能被清除的,這時我們也要想辦法應對。所以我們經常需要檢測花指令是否被清除,加以應對。
一、花指令被清除後的痕跡
我們來看一下,下面一段簡單花指令被清除後的結果:
代碼:
jmp @F
byte 08eH
@@:
ret
清除後:
二、檢測
從上文我們可以看到,花指令被替換指令NOP,這樣就不必重構代碼,就能夠使代碼正常運行。顯然,我們只要NOP就行了。
舉例:
.386
.model stdcall,flat
option casemap:none
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
.data
Context byte "Junkcode has been cleaned",0
Tip byte "Tip",0
.code
start:
JunkCode:
jmp @F
byte 8eH
@@:
mov al,byte ptr[$-1]
cmp al,90H
jnz Pro_End
invoke MessageBox,NULL,addr Context,addr Tip,MB_OK
Pro_End:
invoke ExitProcess,0
end start