OD 各种断点的实现原理
2011-07-20 17:57
330 查看
在网上看到好多介绍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.html3、内存断点,修改内存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
研究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
相关文章推荐
- 【转】硬件断点的原理 ---- OD各种断点的原理
- OD各种断点的原理
- 硬件断点的原理 ---- OD各种断点的原理
- 硬件断点的原理 ---- OD各种断点的原理
- Tomcat原理详解和各种集群的实现
- 调试器工作原理之二——实现断点(ptrace)
- od的各种断点
- 调试器工作原理(2):实现断点
- BASE64 加密算法、原理 各种语言实现算法
- 调试器工作原理(2):实现断点
- C# 断点续传原理和实现
- 断点续传下载原理实现
- Asp.net中断点续传的原理与实现方法分享
- 简单C语言模式实现OD调试断点设置
- 排序技术_各种算法原理 图解 代码实现
- 调试器工作原理(2):实现断点
- Android 断点续传原理以及实现
- 文件断点续传原理与实现
- C# 断点续传原理与实现
- 调试器工作原理之二――实现断点