OllyDbg 常用断点
1. INT 3 断点
设置/取消断点:bp命令或 “F2” 快捷键
原理:当执行一个 INT 3 断点时,该地址处的内容被调试器用 INT 3 (机器码是 0xCC,因此它通常又叫 “CC指令”)指令替换了,此时 OllyDbg 将 INT 3 隐藏,显示出来的仍然是中断前的指令。当调试进程执行 INT 3 指令导致一个异常时,调试器会捕捉这个异常,从而停在断点处,然后将断点处的指令恢复成原来的指令。
优点:可以设置无数个断点
缺点:改变了机器码,容易被软件检测到
防范:调用 API 前检测 API 首地址是否为 0xCC,以此来检测是否被下断点。
2. 硬件断点
硬件断点与 DRx 调试寄存器有关。
DRx 调试寄存器共有8个(DR0~DR7):
- DR0~DR3:调试地址寄存器,用于保存需要监视的地址,例如硬件断点。
- DR4~DR5:未公开
- DR6:调试寄存器组状态寄存器
- DR7:调试寄存器组控制寄存器
设置/取消断点:在指定代码行单击右键,执行“Breakpoint” --> “Hardware, on execution”(“断点” -->“硬件执行”)命令,也可在命令行中设置“HE 地址”
硬件断点原理:使用DR0~DR3设定地址,并用DR7设定状态,因此最多设置4个断点。单个硬件写入/访问断点可以设置为1字节、2字节、4字节,而且不论选择的数据范围多大,只有前4个字节会起作用。
优点:速度快,不容易被发现
缺点:只能设置4个
更详细介绍:调试寄存器 原理与使用:DR0-DR7 - 活着的虫子 - 博客园 (cnblogs.com)
3. 内存断点
在OllyDbg中,内存断点分为内存访问断点和内存写入断点。
设置/取消断点:在数据/代码窗口选中需要下断点的地址区域,单击右键,“Breakpoint” --> “Memory, on write ”(“断点” --> “内存写入”)命令。
原理:对所设地址赋予不可访问/不可写属性,这样当访问/写入时就会产生异常。OllyDbg截获异常后,比较异常地址是不是断点地址,如果是就中断。
优点:不修改原始机器码,不容易被检测到,所以在遇到代码校验且硬件断点失灵时,可以使用内存断点。
缺点:由于每次出现异常都要比较确定是否中断,所以内存断点会降低 OllyDbg 执行速度,可能是这个原因,OllyDbg只允许下一个内存断点。
区别:硬件访问/写入断点在触发硬件断点的下一条指令处中断,而内存断点是在触发断点指令处中断。
4. 内存访问一次性断点
设置/取消断点:按“Alt+M”显示内存窗口,在目标段上单机右键,“Set break-on-access”(在访问上设置断点),快捷键“F2”。
原理:将内存的段设置为不可访问,当此段被读取或执行时就会中断,中断发生后,断点将被删除,所以是一次性断点。
适用场景:如果想捕捉调用或返回某个模块,这类断点就特别有用。
5. 消息断点
设置/取消断点:单机菜单“view” --> “Windows”,列出窗口相关参数,在目标条目上单击右键,执行“Message breakpoint on ClassProc”(在 ClassProc 上设置消息断点)命令,在弹出窗口的下拉列表中选择消息类型,OK。
原理:当某个特定窗口函数接收到某个特定消息时,消息断点将使程序中断。
区别:INT 3 断点可在程序启动前设置,而消息断点只有在窗口被创建后才能被设置并拦截消息。
6. 条件断点
条件断点,顾名思义,就是在满足一定条件时才会中断,它可以按寄存器、存储器、消息等设断。
设置/取消断点:
按寄存器中断,选择判断条件断点时执行的位置如 00401476h,按“Shift+F2”,在弹出的文本框内输入条件表达式“eax==0400000”,也可在命令行插件中输入 bp 00401476 eax==0400000。
按存储器中断,假设 CreateFileA 函数打开 c:\1212.txt 时需要中断,选择 CreateFileA 函数的第一行,按“Shift+F2”,输入“ [STRING[esp+4]]=="c:\\1212.txt" ”
,(STRING表示以零结尾的ASCII字符串),也可在命令行插件中输入 bp CreateFileA, [STRING [esp+4]]=="c:\\1212.txt"
原理:一个带有条件表达式的普通 INT 3 断点。当调试器遇到这类断点时,断点将计算表达式的值,如果结果非零或表达式有效,则断点生效(暂停调试程序)。
7. 条件记录断点
条件记录断点除了具有条件断点的作用外,还能记录断点处函数表达式或参数的值。也可以通过设置断点的次数,每次符合暂停条件时,计数器的值都将减1。
设置/取消断点:要记录程序调用 CreateFileA 函数的情况,可在 CreateFileA 函数的第1行按“Shift+F4”,打开条件记录窗口,设置相关参数。