任何技术都有被攻破的一天,没有包打天下的方法。再强的花指令也是有可能被清除的,这时我们也要想办法应对。所以我们经常需要检测花指令是否被清除,加以应对。
一、花指令被清除后的痕迹
我们来看一下,下面一段简单花指令被清除后的结果:
代码:
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