1、int3 断点,机器码为 0xCC ,因此又叫做 CC 断点 —— n 个
实现方法是比如:将某一行汇编进行了 F2 下断,那么这一行汇编对应的机器码的第一个字节将被改写为 CC ,尽管调试器不会显示,但是实际上已经进行了更改,调试器在执行到这里检测到了 0xCC 之后就会断下。
2、硬件断点,通过 DRx 调试寄存器实现 —— 4 个
DRx 调试寄存器有 8 个:DR0 ~ DR7,其中 DR0 DR1 DR2 DR3 用于保存需要监视的地址,即设置硬件断点,因此最多设置 4 个硬件断点,并通过 DR7 设置状态。硬件断点的效果与 int 3 一样,但是硬件执行断点并不会改写机器码,因此更难检测到,而且硬件断点是断在下一条指令位置。
3、内存断点 —— 1 个
OD 可以设置内存访问断点、内存写入断点。原理是将用户要断点的内存地址设置成 不可读不可写,这样一旦进行读写,则会异常,比较地址之后如果是用户指定的断点地址,则中断。正因为要进行大量的比较,因此比较慢,OD 只能设置一个。
4、内存段访问一次性断点
Alt + M 可以看到程序对应的虚拟内存分为了一个个内存段页,OD 右键可以设置属性以及对整个段下断点,脱壳时比较有用。
5、消息断点
基于 windows 的消息机制,每个消息都会有对应要处理的对象,对象对应唯一的句柄,OD 的 w 按钮中包含了该程序所有的 句柄,右键即可对比如一个 check 按钮下断点,断下时位于系统代码, alt + f9 是回不去的,需要用到 4、内存段访问一次性断点,可以对 .text 下断,F4。
6、条件断点,本质是带有条件表达式的 int 3
7、条件记录断点,不看