常用的断点有INT 3断点、硬件断点、内存断点等。
一、INT 3断点
详细介绍参考《int 3 软中断指令》一文。
二、硬件断点
1. 硬件断点与DRx调试寄存器有关
1)DR0~DR3:调试地址寄存器,保存需要监视的地址,如设置硬件断点;
2)DR4~DR5:保留,未公开具体作用;
3)DR6:调试寄存器组状态寄存器;
4)DR7:调试寄存器组控制寄存器。
2. 硬件断点的原理
使用4个调试寄存器(DR0~DR3)来设定地址,DR7来设定状态。最多只能设置4个断点。
3. 硬件断点设置和取消
1)设置:右击需要设置的代码行,选择“断点/硬件执行”命令;
2)取消:单击菜单“调试/硬件断点”,在弹出的硬件断点面板中进行删除操作。
4. 硬件断点的优缺点
1)优点:速度快,在INT 3容易被发现的地方,使用硬件断点来代替会有很好的效果;
2)缺点:最多只能使用4个断点。
三、内存断点
1. 包括:内存写入断点和内存访问断点;
2. 原理:
对所设的地址设为不可访问/不可写属性,这样当访问/写入的时候就会产生异常,OllyDbg截获异常后比较异常地址是不是断点地址,如果是就中断。
3. 优缺点
1)优点:内存断点不修改原代码。不会像INT 3断点那样,因为修改代码被程序校验而导致中断失败,因此在遇到代码校验,并且硬件断点失灵情况下,可以用内存断点来代替。
2)缺点:速度慢,因为每次异常时都要通过比较地址来确定是否应该停下。同一时刻只能设置一个内存断点。
四、 内存访问一次性断点
1. 设置方法
在OD中按“Alt + M”打开内存窗口,然后在要设置断点的段(.data , .text等)上按F2或者右击选择“在访问上设置断点”命令。
2. 特点
该断点是一次性断点,当所在段被读取或执行时就中断,中断发生以后,断点将被删除。
3. 用途
用来捕捉调用或返回到某个模块(如,脱壳时该类断点就非常有用)。
4. 与内存访问断点的区别
与内存访问断点的功能一样,但是内存访问断点不是一次性断点。
五、消息断点
1. 定义
消息断点使得当某个特定窗口函数接收到某个特定消息时程序中断。
2. 设置消息断点
1)必须有个窗口(由定义可知),一般是输入序列号的窗口;
2)单击菜单“查看/窗口”打开窗口界面,选择要设置消息断点的对象,右击,在弹出的菜单中选择“在ClassProc上设置消息断点”,在弹出的窗口中选择相应的消息类型即可;
3. 从系统代码段返回用户领空的方法:对应用程序的代码段.text区块(注意可能有多个.TEXT区一定要选应用程序的.TEXT区)设置内存断点。
六、条件断点
1. 定义
1)在调试过程中,经常希望断点满足一定条件时才中断,这类断点称为条件断点;
2)条件断点是一个带有条件表达式的普通INT 3断点;
2. 原理
当调试器遇到条件断点时,它将计算表达式的值,如果结果非零或者表达式无效,则断点生效,被调试程序暂停执行。
3. 常见设置条件断点的对象:寄存器、存储器、消息等。
4. 设置条件断点的方法
1)按条件断点的快捷键“Shift + F2”打开条件断点设置窗口,输入条件;
2)在命令行直接输入条件断点语句,如bp 401476 eax == 040000。(前提是已经安装了命令行插件)
七、条件记录断点
1. 定义
条件记录断点除了具有条件断点作用,还能记录断点处函数表达式或参数的值。
2. 快捷键
“Shift + F4”打开条件记录断点窗口。