学习:内存断点

内存断点原理:OD会对所设置地址设置为不可访问或者不可写属性,这样当程序试图访问或者写入时就会产生异常,OD在截获这种异常后比较地址是否是设置的断点地址,这种方式会对程序的运行速度有很大的影响,所以只允许设置一个内存断点,但是在找到内存断点后可以使用一般的断点(这个是可以设置无数个的)进行调试。


内存断点的实现:

00401007 |. A3 CA204000 mov dword ptr ds:[0x4020CA],eax

对以上中的0x4020CA内存地址进行内存断点,右键数据窗口中跟随->内存地址,然后在内存数据进行设置内存断点

然后运行程序,发现程序会在00401007地址进行断点,如以下图

原因:OD会对所设置地址设置为不可访问或者不可写属性,这样当程序试图访问或者写入时就会产生异常,OD在截获这种异常后比较地址是否是设置的断点地址


取消内存断点

第一种方法:在原来设置的地方进行删除内存断点
第二种方法:随便找一个设置内存断点,然后再删除内存断点


针对单一DLL进行内存断点进行调试的方法

ALT+M打开内存窗口,比如要对调用了user32.dll中的内容进行调试,可以对user32.dll的代码段设置内存断点,然后再运行程序F9,它会在77D11000,大小为00060000 (393216.)中进行监视,当访问或写入了就直接捕获异常,然后堆栈窗口跟随窗口反汇编到程序领空,效果如下


DLL内存断点快速返回程序领空的两种方法:

第一种:ALT+M 打开内存窗口,比如要对调用了user32.dll中的内容进行调试,可以对user32.dll的代码段设置内存断点,然后运行程序,会来到user32.DLL的领空然后在堆栈窗口进行窗口反汇编跟随,在当前的地方进行设置断点,然后在内存窗口把之前设置的内存断点删除,再运行程序F9,就来到了程序的领空

第二种:*ALT+M 打开内存窗口,比如要对调用了user32.dll中的内容进行调试,可以对user32.dll的代码段设置内存断点,然后运行程序,会来到user32.DLL的领空,然后在内存窗口把之前设置的内存断点删除,再使用ALT +F9 快捷键(执行到用户代码)

原文地址:https://www.cnblogs.com/zpchcbd/p/12057304.html