常用断点总结

Posted on 2022-01-07  42 Views


常用断点

在调试程序的过程中,有一个非常重要的步骤就是打断点。
常用的断点大致有七个,分别是

  • INT3 断点
  • 硬件断点
  • 内存断点
  • 内存访问一次性断点
  • 消息断点
  • 条件断点
  • 条件记录断点

接下来对他们进行介绍

INT3断点

INT3断点是一个非常常用的断点,在od中可以使用F2快捷键来设置或者取消断点。他实现的原理也很简单,在某段代码出设置INT3断点之后,这段函数会被调试器改为int3指令,而原本的代码将被隐藏,直到程序中断后才会恢复。
这样的实现方式决定了INT3断点的使用将会非常灵活,可以设置任意多个INT3断点,但缺点也同样明显,INT3指令的机器码是0xCC,所以可以通过针对性的识别API的机器码开头第一个字节是否为CC来防止程序被下API断点进行反调试
当然,这样简单的防范方式也可以绕过,只要将断点设置在函数内部或者尾部就可以了

硬件断点

硬件断点顾名思义,与硬件有关,他是通过DRx调试寄存器实现的。
DRx调试寄存器共有8个,每个寄存器的特性如下

  • DRx0~DRx3:调试地址寄存器,用于保存需要监视的地址,例如设置硬件断点
  • DR4~DR5 这部分的作用并没有被公开
  • DRx6 调试寄存器组状态寄存器
  • DRx7 调试寄存器组控制寄存器。

硬件断点通过DRx0~DRx3来设置地址,DRx7设定状态。也因此,硬件寄存器最多同时存在4个,同时,也比INT3断点更难被检测到。
可以在需要断点的地方按鼠标右键选择断点->硬件执行,删除断点则需要打开od顶部菜单栏里的 调试 -> 硬件断点 打开硬件断点面板

内存断点

od可以设置内存访问断点或者内存写入断点,原理是通过修改所选地址的访问属性,以此使代码运行到所选地址或者读取、写入到所选地址时触发异常,od通过比对触发异常的地址和所下断点的地址,如果相同则中断程序。也因为每次出现异常都会进行一次比对,所以内存断点会降低od的执行效率。
假如我们现在在od中有这样一行代码需要设置内存断点
004013D0 8915 28554000 mov dword ptr [405528], edx
我们需要在数据窗口中对00405528处用光标选中需要下断点的区域,点击右键选择 断点 -> 内存写入 内存访问断点设置流程基本相同
还可以设置执行断点,方法也很简单,在需要设置断点的代码出点击右键,选择 断点 -> 内存访问 即可
内存断点不会修改原始代码,所以不会像INT3断点一样被很简单的检测到,因此在遇到代码校验且硬件代码失灵的情况下可以使用内存断点。

内存访问一次性断点

Windows对内存使用段页式的管理方式。可以在od中使用快捷键 alt+m 显示内存,可以看到内存中的每个段都有不可访问、读、写、执行属性。在相应的段上右键选择在访问上设置断点,可以对整个内存块设置该类断点,快捷键是F2

消息断点

Windows系统是由消息驱动的,如果调试的时候没有合适的断点也可以使用消息断点,当某个程序接受到特定的消息后,消息断点将程序中断。消息断点和INT3断点的主要区别是,INT3断点可以在程序启动之前设置,消息断点只有在窗口被创建后才能被设置并拦截消息
在od中运行程序,出现窗口之后点击菜单栏 -> 查看 -> 窗口,或者工具栏中的 W 按钮,列出窗口相关参数,如果界面没有内容则右键刷新。

例如我们现在有一个这样的程序
在这里插入图片描述

现在要对登录按钮下断点,则选中登录条目然后点击右键选中在classproc上设置消息断点
在这里插入图片描述
会弹出一个这样的窗口
在这里插入图片描述

在第一个消息的下拉菜单中如果选择“任何消息”,则会拦截所有消息,我们所关注的消息属于“按钮”这一项,当单击按钮并松开时,会发送“WM_LBUTTONUP”这个消息,在下拉菜单中找到“202 WM_BUTTONUP”这个选项,在单击确定,消息断点就设置好了

条件断点

在调试过程中常常希望断点满足一定条件时才中断,这类断点称为条件断点。od的条件断点可以按寄存器、存储器、消息等设置。条件断点是一个带有条件表达式的INT3断点,当调试器遇到这类断点时,断点将计算表达式的值,如果结果非零或表达式有效,则断点生效
按寄存器条件中断
选中一条指令,使用快捷键“shift + F2”,在出现的面板中输入例如
eax == 0400000 这样的表达式,当程序执行到选中位置时,若eax寄存器的值为0400000则执行中断


欢迎来到parafish的个人博客,这里是一个正在努力的ctfer

路虽远,行则必至