首页
社区
课程
招聘
探讨一下OD内存断点的具体实现原理!
发表于: 2008-4-8 15:26 11662

探讨一下OD内存断点的具体实现原理!

2008-4-8 15:26
11662
众所周知,OD的内存断点是依靠内存页面的保护属性来实现的。但在其实现原理上,有一个问题还是想不明白。大家一起探讨一下。
举例来说,我在内存0x00500020上设定一个内存写断点。这样,当线程执行某一条指令(假设IP为0x00402000)mov [0x00500010] 0x00000001时。由于[0x00500010]与[0x00500020]处于同一页面。就会触发一个访问异常,线程的执行由OD接管。但0x00500010并不是我想要的断点位置。OD是怎么保证mov [0x00500010] 0x00000001这条指令被正确的执行了呢?
我的想法:
一、OD对mov [0x00500010] 0x00000001这条指令进行分析,计算出该指令的执行结果,然后用WriteProcessMemory函数将0x00000001写到[0x00500010]。但是,X86的指令那么多,OD怎么能把指令的结果准确无误的计算出来呢?

二、在触发异常指令的下一条指令处设置软件断点,然后恢复内存断点所在页面的原有属性,并调整被调试线程的IP。这样,当指令mov [0x00500010] 0x00000001执行完之后,执行下一条指令时,就会触发一个软件断点异常。这时,OD再次设置内存断点所在页面的属性。从而保证了mov [0x00500010] 0x00000001的执行。这种方法比第一种简单一些。但是,当触发异常的指令是一条调转指令时。在何处设定软件断点也不是一件很容易的事。

以上是我的理解,那位仁兄有更好的方法。还请赐教。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 153
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不是这样的。触发异常时,检查访问的目标内存是不是自己的范围。如果是,恢复内存断点所在页面的原有属性,执行单步,在单步中,OD再次设置内存断点所在页面的属性。
2008-4-11 06:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
嗯,设单步断点确实是一种好办法,不需要确定下条指令的IP了。

多谢!
2008-4-11 08:14
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
用OllyDBG分析一个经过加密壳处理的程序(只对代码段中的代码做了加密)
为了确定解密后代码的位置,我想用内存断点的方法
现在有个问题:
1)内存断点只能设置4096字节的长度,那么怎么确定内存断点的起始位置呢?
     如果只是在代码段的起始地址处下了一个内存写入断点,但是解密的时候修改的代码在离此处4096字节之外,那是不是就不会引起中断了?
2)有没有插件可以设置整个代码段的页面的读写执行等属性的?
2008-4-11 10:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
to nipcdll:
你想要实现的功能用内存断点是做不到。要使用内存断点,首先肯定要知道对哪块内存下断点。

你现在的问题是根本就不能确定在什么位置下断点。
2008-4-11 12:44
0
游客
登录 | 注册 方可回帖
返回