rgzz 发表于 2023-2-21 23:12

OllyDbg 常用断点

# 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)](https://www.cnblogs.com/yilang/p/12107126.html)

## 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”,输入`“ ]=="c:\\1212.txt" ”`,(STRING表示以零结尾的ASCII字符串),也可在命令行插件中输入 `bp CreateFileA, ]=="c:\\1212.txt"`

原理:一个带有条件表达式的普通 INT 3 断点。当调试器遇到这类断点时,断点将计算表达式的值,如果结果非零或表达式有效,则断点生效(暂停调试程序)。

## 7. 条件记录断点

条件记录断点除了具有条件断点的作用外,还能记录断点处函数表达式或参数的值。也可以通过设置断点的次数,每次符合暂停条件时,计数器的值都将减1。

设置/取消断点:要记录程序调用 CreateFileA 函数的情况,可在 CreateFileA 函数的第1行按“Shift+F4”,打开条件记录窗口,设置相关参数。

rgzz 发表于 2023-2-22 15:29

IBinary 发表于 2023-2-22 11:05
谢谢分享,新年代了,赶紧更换为x32 x64dbg吧.. OD指令都不支持了.32 64已经替代OD了. 且指令都有详细文档.

确实,x64dbg的动态调试也很好用,但是我发表这篇文章的本意是为了了解断点的底层原理,OD指令只是附带方便我自己学习的,顺便说一下,x64下也用到了这些断点,原理都大差不差

IBinary 发表于 2023-2-22 11:05

谢谢分享,新年代了,赶紧更换为x32 x64dbg吧.. OD指令都不支持了.32 64已经替代OD了. 且指令都有详细文档.

kkoo 发表于 2023-2-21 23:49

感谢分享

ludonghengsb 发表于 2023-2-22 01:57

感谢大佬,非常有用{:1_919:}

svip6868 发表于 2023-2-22 03:11

学习了,感谢分享。。。

xtudou 发表于 2023-2-22 05:35


学习了,感谢分

l441669899 发表于 2023-2-22 07:36

感谢分享!

心中的影子 发表于 2023-2-22 08:27

感谢分享。。

轩逸浪子 发表于 2023-2-22 08:40

感谢分享!!!

hu007 发表于 2023-2-22 08:51

谢谢技术分享!

aa2923821a 发表于 2023-2-22 09:15

谢谢,刚好想学习一下
页: [1] 2 3 4
查看完整版本: OllyDbg 常用断点