有关花指令的一点小研究(二)
在上篇文章里我用call花指令实现迷惑IDA与OD。相关代码如下:
代码:
myjmp proc pop eax add eax,ecx push eax ret myjmp endp start: mov ecx,offset @F- $ -10 call myjmp db '花指令乱码' @@:;.........正常指令继续
[思路来源]:
1、一般破解教程告诉我们,call指令后面如果紧接着test eax,eax&jz/jnz指令,那么建议在后面两条指令下断,可以得到一些关键提示。
2、对于一般的动态调试断点,调试器会把原指令处代码改成int 3,执行到此处时中断再恢复原指令。
嘿嘿,有没有想到什么?!我们也可以在我们花指令后加入test/jcc指令,以达到欺骗效果。骗得跟踪者在这两条指令下断。
中断是下了,可以怎么也等不到中断。因为程序永远也不会执行到这里。相关实现很简单:
代码:
myjmp proc pop eax add eax,ecx push eax ret myjmp endp start: mov ecx,offset @F- $ -10 call myjmp test eax,eax jz $+10 db '花指令' @@:;.........正常指令继续
嘿嘿,太阴险的想法了:P,答案是:可以实现。只要在myjmp里加入检测后面两条指令数据是否为0xcc(即int 3),一旦检测到。我们操纵程序流程跑飞程序!
具体实现如下:
代码:
myjmp proc pop edx xor eax,eax mov al,byte ptr [edx] ;这里开始检测后面两条指令是否为int 3 cmp al,0cch setz al ;这里使用了Pentinum pro的条件设置指令集以使条件判断不影响流水线。所以注意测试时的CPU是否支持。一般来说都支持啦。 shl eax,8 mov al,byte ptr [edx+1] cmp al,0cch setz al shl eax,8 mov al,byte ptr [edx+2] cmp al,0cch setz al shl eax,8 mov al,byte ptr [edx+3] cmp al,0cch setz al test eax,eax setnz al add edx,eax ;一旦被下断,eax必定不为0,这样,程序便会跑飞。 add edx,ecx push edx ret myjmp endp start: mov ecx,offset @F- $ -10 call myjmp test eax,eax jz $+10 db '花指令垃圾' @@:;.........正常指令继续
------
顺便提一下:其实如果仔细跟踪,破解花指令很简单,把垃圾数据都nop掉,再分析,正常指令便出来了。嘿嘿。但这需要:耐心++
不敢藏私。赶紧拿出来分享。欢迎交流、拍砖。谢谢!
