有关花指令的一点小研究(二)
2007-11-21 23:28
197 查看
在上篇文章里我用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掉,再分析,正常指令便出来了。嘿嘿。但这需要:耐心++
不敢藏私。赶紧拿出来分享。欢迎交流、拍砖。谢谢!
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掉,再分析,正常指令便出来了。嘿嘿。但这需要:耐心++
不敢藏私。赶紧拿出来分享。欢迎交流、拍砖。谢谢!
相关文章推荐
- 有关花指令的一点小研究
- 有关DEP(数据执行保护)的一点研究
- 有关正则表达式的研究
- 有关C语言学习的一点感悟
- 高性能Web服务器Nginx的配置与部署研究(9)核心模块之HTTP模块基本常用指令
- 移植64位发生的问题(跟cltq指令有关)
- 有关网络协议的一点学习
- 与ClientWidth有关的一点资料
- 有关socket AF_UNIX的一点心得
- oracle UDT 有关数据字典的研究
- 有关STL中的容器和MFC的集合类型构造函数区别的一点思考
- 个人对kobject的一点研究
- linux定时任务cron的一点研究
- 有关DBN的一点小心得
- JMX的一点研究
- 关于局域网如何防止被限速的一点研究(在外合租公用路由的同学必看)大家都帮忙顶哈!
- Launcher 源码有关加载应用xml等资源文件研究
- 有关矩阵的一点讨论
- 枚举类型的一点研究
- 有关Android国际化的一点积累 推荐