常用的动态调试断点

常用的断点的种类有以下几种:CC断点,内存断点,硬件断点,条件断点,记录断点,条件记录断点,消息断点等。

断点有三种类型:执行,写入,访问:

  • 访问:写入+执行
  • 执行:将机器码当成执行时中断。
  • 写入:改写这部分机器码时中断。

CC/int3断点

原理:

执行int3时程序会暂停,而int3指令的机器码就是CC。当设置断点时,OD会将被下断处的机器码首字节替换为CC,当程序执行CC时会被断下,程序暂停。然后OD将CC恢复为原始代码,此时可以执行真机器码。执行完毕后再次将机器码首字节替换为CC,以便下一次运行使用。

优点:

设置数量没有限制。

缺点:

容易被检测。

内存断点

原理:

在下断地址所在的内存页增加一个名为PAGE_NOACCESS的属性,这个属性会把当前内存页设为禁止任何形式的访问,如果进行访问会触发一个内存访问异常。OD会持续捕获目标程序中出现的这个异常,并判断触发这个异常的位置是否跟下断的地址相同,如果相同则内存断点触发,暂停被调试程序的运行,否则放行。

优点:

相比CC/int3断点更难被检测。

缺点:

每次只能设置一个,如果设置新的内存断点,旧的会被覆盖;执行后会消失。

硬件断点

原理:

使用调试寄存器Dr0-Dr7,其中Dr0-Dr3存放中断的地址,Dr4,Dr5一般保留,而Dr6,Dr7作用是记录Dr0-Dr3中下断的地址的属性(执行/访问/写入;Byte/Word/Dword)。

优点:

最难被断下。

缺点:

只能设置四个;程序执行符合条件代码之后再停下,而不是执行符合条件的代码之前停下。

条件断点

原理:

达到由逻辑表达式构成的条件时断下程序。

优点:

可以中断反复调用的函数。

特点:

条件对大小写不敏感;数字最好加上0x来规定十六进制。

记录断点

记录断点可以看作可以选择是否断下程序的记录功能,在条件记录窗口有以下选项:
* 条件:下段的条件,和条件断点作用相同。
* 表达式:想要记录的内容,如ESP,表示任何时候都会记录 ESP 的值。记录功能不受条件的影响。
* 暂停程度:断点功能。“从不”表示只记录,不断下;“永远”表示每次符合条件时就断下,和“条件”共同构成条件断点。