菜鸟经验之找关键跳之前的关键代码
我这里所指的关键代码,是指能决定关键跳的代码。第一种情况
CALL XXXXXXXXX
test eax,eax
jnz yyyyyyyyy
大家都知道,这个只要跟进上面一个CALL里就能找到,只要想办法在这个CALL里改变EAX的值就可以了,通常可以在这个CALL里找到一个或者几个关键跳,改一下跳转。或者直接在某个给EAX附值的地方,改一个附值,如0改成1, 或者改成 XOR EAX,EAX, 或者 or eax,1 。有的时候修改完之后,发现后面有部分不应该改的代码没有了,或者发生了变化。这时,你可以找个空白地方改代码,让修改的地方,先JMP你改的代码地方,最后再JMP回去。
第二种情况
CALL XXXXXXXXX
CMP dword ptr ss: , 0
JNZ ZZZZZZ
这里的YYYYYYYY,指的是一个定值,比如00401000
这时,CALL XXXXXXXXX就不一定是关键CALL了,这时候,可以在命令窗口输入 d YYYYYYY,回车,然后在此处下硬件访问断点,再重新跑程序,你就可以找到改变这个值的地方了,有可能不只一处。一般改最后一处,因为如果你在前面改了,后面的还是会改回来。
如果CALL XXXXXXXXX
CMP dword ptr ss: , 0
JNZ ZZZZZZ
这个地方是程序还没有执行完成的时候,也可以直接在这里改。 如直接
或者
dword ptr ss: , 1
再NOP掉后面的JNZ。
上面两种情况,一般网上的教程里都会有介绍,我这里啰嗦了几句,希望大家不要介意,也许有人需要。
第三种情况也许你已经在用,但是我没看到哪里有,我是自己摸索出来的,供大家参考一下。
第三种情况
CALL XXXXXXXXX
CMP dword ptr ss: , 0
JNZ ZZZZZZ
也就是比较的是一个局部变量。
上面的CALL同样有可能不是关键CALL。那怎样才能找到关键的CALL呢?
如果你用第二种情况的方法,我保证你会在N个地方断下来,最后还是找不到。
试试下面这个方法。
当程序运行到CMP dword ptr ss: ,0时,看堆栈里的值。
然后在段首下断,让程序重新运行到段首。这时,在命令行输入 d ebp-8(你的局部变了是什么就把EBP-8换成什么)
然后在数据窗口,改变一下这个EBP-8地址的值,要与程序路到CMP dword ptr ss:,0时的值不一样。然后一步一步的单步,注意数据窗口该地址值的变化,放心肯定会变的。有可能不只变一次,如果发生了变化,马上把他的值再改回来。记下最后一个改变该值的CALL,这个就是关键CALL了。
仅供菜鸟参考,希望对你们有帮助。
如果你喜欢,如果对你有点帮助,请帮我加点分。
我也是个菜鸟,希望能学到更多破解知识,希望能抛砖引玉。
不错 很强大 学习了 谢谢楼主共享 我还是看不太明白,这是为什么呢?看来我还处于迷茫阶段. 这都是楼主的经验,谢谢了 懂得总结,你就会成功;懂得分享,你就会…… 顶你 我就是找不到关键跳
页:
[1]