断点
- 断点的种类:软断点、硬件断点、内存断点
软断点
- 实现:
- 将目标地址、地址中的数据记录在断点列表中
- 将目标地址所在字节改为“CC”,即 int3中断
- 当程序执行到断点处,发生int3中断,调试器将其捕获
- 调试器遍历断点列表,若符合某一记录,则暂停程序。
- 程序继续运行时,调试器根据断点列表将中断处“CC”改回原代码。
- 特点:一些程序会在运行时计算CRC,若不符合则“自我了断”,以此防御软中断分析。
硬件中断
- 调试寄存器
CPU中有8个调试寄存器 DR0~DR7 用于设置、管理断点。
- DR0~DR3用于存储硬件中断内存地址。
- DR4、DR5保留。
- DR6调试状态寄存器,记录上一次断点触发产生的调试事件类型信息。
- DR7实质是硬件中断的激活开关,并保存各个断点的触发条件信息。
- DR7的设置
- 0~7 : 0,1位对应DR0的断电开关,0为局部断点,1为全局断点,之后同理。
- 8~15 : 并非用于普通调试
- 16~31 : 16,17分别表示DR0的断点类型和长度,之后同理。
- 硬件断点的类型
- 00 : 执行断点
- 01 : 数据写入断点
- 11 :数据读写(非执行)断点
- 硬件断点的长度
- 00:1字节
- 01:2字节
- 11:4字节
- 实现
- 硬件断断点使用一号中断,INT1用于硬件断点和单步执行。
- 步骤
- 在CPU试图执行一条指令之前,会先检查指令和指令包含操作数的所在地址是否被设置了硬件断点
- 如果上述地址存在于DR0~3,则根据断点类型执行INT1。
- 特点
- 数量最多为4
- 最多对4字节数据设置断点
内存断点
- 实质:改变内存区域或内存页的访问权限。
- 内存页的访问权限
- 页可执行:允许进程执行页上的代码,试图读写则会产生异常。
- 页可读:进程只能从页面上读取数据,写或执行会触发异常。
- 页可写:允许进程在该内存页上写入数据。
- 保护页:对保护页的任何操作将导致一次异常,之后内存页会恢复原状。
大部分操作系统允许组合不同的权限
- 实现:利用保护页机制,可以使进程访问特定区域内的内容时,使进程暂停运行。