好友
阅读权限25
听众
最后登录1970-1-1
|
子晗。
发表于 2019-8-17 20:48
本帖最后由 子晗。 于 2019-8-18 18:01 编辑
最近刚刚开始自学,跟着论坛的教程,看到ximo的脱壳基础里的手脱UPX,视频里的方法3:2次内存镜像法,先是在.rsrc处F2设置断点,然后运行,跳转正常,和视频中一样,来到了此处
但是在回去设置第二次断点后,出现问题,运行后仍然跳转到了此处,并且向下单步步过也会出现问题。
在论坛里搜索了一下,发现有一个帖子说是OD问题,换了个OD就可以了,链接https://www.52pojie.cn/thread-210105-1-1.html。
本人用的是论坛专版虚拟机内提供的OD,并不是很想换,在经过几次尝试后发现,将原教程的用F2设置的断点,即,在访问上设置中断,
都更换为右键菜单里的,设置内存访问断点,即,两次断点都换为设置内存访问断点
然后再运行,就可以在第二次运行后成功跳转到视频中正确的位置,注意,这里要及时清除内存断点
接下来就可以继续按照视频教程中的操作了。
虽然问题解决了,不,应该说目的达到了,但是本新手并没有能够理解这个使用F2设置的断点和内存访问断点的区别,
所以在此请教一下各位高手,这两个有何区别呢,又是什么原理呢,表示不解。。。。提前感谢解答。
更新:
在看雪论坛的帖子里找到了对F2断点和内存断点的分析,内容如下
内存断点寻找OEP的原理
首先,在OD中内存断点,硬件断点和普通断点(F2下断)是有本质区别的。硬件断点等效与SoftICE命令bpm,他的中断要用到DR0-DR7的调试寄存器,也就是说OD通过这些DR0-DR7的调试寄存器来判断是否断下。
普通断点(F2下断)等效于bpx,他是在所执行的的代码的当前地址的一个字节修改为CC(int3)。当程序运行到int3的时候就会产生一个异常,而这个异常将交给OD处理,把这个异常的regEIP-1以后就正好停在了需要的中断的地方(这个根据系统不同会不一样),同时OD在把上面的int3修改回原来的代码。
而内存断点基本上使用的是对代码使用的保护属性来实现中断。
内存断点分为:内存访问断点,内存写入断点。
我们知道,在程序运行的时候会有3种基本的状态产生:读取,写入,执行。
004AE242 A1 00104000 mov eax,dword ptr ds:[004AE24C] //004AE24C处的内存读取
004AE247 A3 00104000 mov dword ptr ds:[004AE24C],eax //004AE24C处的内存写入
004AE24C 83C0 01 add eax,1 //004AE24C处的内存执行
那么我们应该如何中断在上面的几行呢?
1.当我们对004AE24C下内存访问断点的时候,可以中断在004AE242也可以中断在004AE247。
2.当我们对004AE24C下内存写入断点的时候,只能中断在004AE247。
3.当我们对004AE24C下内存访问断点的时候,能中断在004AE24C。
到这里你可能不明白了,为什么内存访问断点能中断在004AE247这一句对004AE24C的写入,而且还能中断在004AE24C的执行呢?
其实很简单,我们只要仔细体会一下“内存访问”这四个字的含义遍可以知道,当我们对004AE24C进行读取的时候需要“访问”他吧,当我对004AE24C进行写入的时候也需要“访问”他吧!!当然我们要执行内存地址004AE24C的代码的时候也是还是要“访问”他的!
所以我们不难得出下面的结论:
1.内存写入中断的地方,一定是也可以用内存访问中断。
2.内存执行的地方,也可以用内存访问中断。
如果这时你认为,那么内存写入岂不是没用了。呵呵~那我要告诉你当然不是,如果你想快速的准确的定位到004AE247这一行的时候,那么他就大有作用了!
总结一下:内存断点不修改原代码,不会像普通断点那样因为修改代码被程序校验而导致中断失败;对于区段的访问只是区域大了一点,其原理和上面分析的三行代码是一样的。 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|