-
-
探讨一下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直播授课