OD 各种断点的实现原理

来源:互联网 发布:本草纲目 辣妹子 知乎 编辑:程序博客网 时间:2024/06/05 11:03
 在网上看到好多介绍OD断点原理的文章受益匪浅,主要是前辈LenusMa写的。看完之后,也有一点自己的想法,并且通过实验验证,首先介绍有几种被使用的断点:

1、Int3 断点(CC断点),运行到指令cc就产生int3中断。

2、硬件断点,通过调试寄存器DR,DR寄存器只能够存放4个地址,分别是DR0 DR1 DR2 DR3,所以硬件断点只能够存放4个;DR4 DR5保留, DR6 DR7用于存放这几个断点的相关属性。详细介绍DR寄存器的文章:http://hi.baidu.com/zzydog/blog/item/63e300fcfb91fe55d6887db5.html

3、内存断点,修改内存page的属性,是访问过程中产生中断。


研究OD中使用的断点,分情况讨论:

1)F2、shift+F2、shift+F4都是使用的int3断点,下断之后通过xuetr.exe软件查看应用软件钩子,可以看到




2)F4运行到指定的地址,这两个功能的实现,可能使用硬件断点,也会使用到int3断点。

a) 当调试寄存器DR0~3这四个寄存器有空余,那么F4会将指点的地址存入到调试寄存器中,并且设置“仅一次中断”。

b) 当调试寄存器DR0~3这四个寄存器都已经被占用了,那么OD就会使用int3断点,将指定地址的首个字节改为cc,运行到这个地址的时候产生中断,在中断处理中恢复这个字节。下次执行到这里时候,不会在中断了。


3)F8和F7这两个操作,确实不好检测,这里没有特别固定的方法,最好可以直接分析OD就比较好了。F7是设置EFLAG标志寄存器,将TF位设置为1,当执行完一条指令之后,就产生中断并且停止。F8是当DR寄存器有未使用的,就会利用DR寄存器来存储下一个要中断的地址,如果DR寄存器已经满了,那么就将下一个中断地址设置cc。



4)内存访问断点,记录下断的内存地址范围,将地址所在的PAGE属性设置为PAGE_NOACCESS,当被调试进程访问到这个PAGE,就会产生中断,中断处理判断访问地址是否在下断点的地址范围内,如果是就中断到这条指令。如果不是继续执行。内存写入断点也是类似,只是将PAGE的属性修改为PAGE_EXECUTE_READWRITE