OD调试器断点——条件断点

Posted 大灬白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OD调试器断点——条件断点相关的知识,希望对你有一定的参考价值。

条件断点

条件断点实际上就是普通的CC断点,只不过该断点的触发需要满足设置的条件,如果满足设置的条件,那么程序就会中断下来,如果不满足条件的话,就和没有设置CC断点差不多。

我们来看一个例子:
在这里插入图片描述

重启OD并清除我们之前设置的所有硬件断点,我们在40100E处设置一个条件断点,在40100E处单击鼠标右键选择-Breakpoint-Conditional。
在这里插入图片描述

就会弹出设置条件的窗口。
在这里插入图片描述

举个例子,如果你想当前EAX等于400000的时候,程序中断下来,那么条件应该写成:“EAX == 400000”。
在这里插入图片描述

OD的帮助文档中介绍了条件断点的设置可以使用的符号以及条件怎么书写。
在这里插入图片描述

我们可以看到设置了条件断点的语句地址显示的是粉红色。按F9键运行。
在这里插入图片描述

我们可以看到,OD状态栏显示断下来了。
在这里插入图片描述

我们可以看到EAX等于400000,满足条件,所以断了下来。
在这里插入图片描述

再次重启OD,清除设置的条件断点,然后设置一个新的条件断点,条件为:EAX==500000。
在这里插入图片描述

F9键运行。

可以看到CrackMe运行起来了,并没有中断下来,因为EAX等于400000,条件不满足。

我们在主菜单项中选择-Help-Contents。
在这里插入图片描述
在这里插入图片描述

选择超链接Breakpoints,紧接着选择超链接expression。
在这里插入图片描述

可以看到OD帮助文档中显示了很多条件表达式以及相应的例子。
在这里插入图片描述

条件记录断点

条件记录断点跟刚刚介绍的条件断点差不多,区别在于,我们可以通过设置该断点来记录下设置的条件的精确值。我们举个例子,我们给一个API函数设置条件记录断点,程序中有很多地方调用了这个API函数,通过该条件记录断点我们可以精确的记录程序中每处调用该API函数传递给它的内容。

我们删除之前设置的条件断点,并重启OD。

在反汇编窗口中单击鼠标右键选择-Goto-Expression转到MessageBoxA函数的入口处。
在这里插入图片描述
在这里插入图片描述

单击鼠标右键选择-Breakpoint-Conditional log。
在这里插入图片描述

弹出一个窗口,有很多选项。
在这里插入图片描述

这里我们只是记录下我们关心的数据,并不让程序中断下来。
在这里插入图片描述

既然我们不想程序中断下来,那么Condition(条件)编辑框这一栏我们就不填,Pause program(中断程序)这个单选按钮选着Never(不中断)即可。Expression(表达式)这个编辑框我们填写[ESP],我们知道在API函数的入口处,栈顶存放的是函数的返回地址。接着,Log value of expression(记录表达式的值)这个单选按钮我们选择Always(总是),即总是记录表达式的值,也就是[ESP]的值。Log function arguments(记录函数参数)这个单选按钮我们也选择Always(总是),即记录函数的参数个数/参数内容。

我们单击工具栏中【L】按钮打开日志窗口。
在这里插入图片描述

我们单击鼠标右键选择-Clear window清空日志窗口。
在这里插入图片描述

如果需要想将日志保存到文件的话,我们选择Log to file即可。
在这里插入图片描述

我们按F9键运行程序。

我们注意到日志窗口什么也没有记录,因为MessageBoxA并没有被调用。

我们打开注册窗口,输入指定的用户名和序列号。
在这里插入图片描述

单击OK。
在这里插入图片描述

我们可以看到日志窗口显示有关MessageBoxA函数的信息,栈顶内容为40137D即函数的返回地址,接下来是MessageBoxA的参数,依次是hOwner(所属窗口句柄),Text(文本),Title(标题),(Sytle)显示风格。

这里,只显示了一个函数调用的信息,如果某个API被调用了100次的话,你可以将日志保存到文本文件中。如果我们只需要记录某些函数调用的信息的话,我们可以设置相应的条件。

如果程序中有大约100处调用了该API函数,你可以指定相应的条件,比如说返回地址。设置条件为[ESP] == 40137D,那么这100个函数调用中只有返回地址为40137D的会被记录下来。

我们重启CrackMe,定位到MessageBoxA,并设置条件记录断点如下:
在这里插入图片描述

Pause program这个单选按钮我们选择On condition(满足条件时中断下来),即当[ESP] == 40137D时中断下来。

运行程序,打开注册窗口输入用户名ricnar456以及序列号989898。
在这里插入图片描述

当我们输入包含数字的用户名的时候,会弹出两个错误消息框。现在单击OK。
在这里插入图片描述

可以看到第一个MesasgeBoxA并没有中断下来。日志中显示的返回地址为4013C1,并不满足设置的条件,所以不会中断下来。
在这里插入图片描述

我们按下OK按钮。

在这里插入图片描述

这是第二次调用MessageBoxA,这里返回地址满足条件,所以中断下来了。
在这里插入图片描述

我们看到栈顶的内容是40137D,满足条件记录断点设定的条件,所以中断下来了。
在这里插入图片描述

两次调用MessageBoxA的信息,OD都记录下来了。
在这里插入图片描述

只有第二次返回地址为40137D,断了下来。
在这里插入图片描述

以上是关于OD调试器断点——条件断点的主要内容,如果未能解决你的问题,请参考以下文章

OD调试器断点——消息断点

巧用条件断点实现更好的调试

Windbg 字符串条件断点

VisualStudio断点调试基础

为啥条件断点会在调试时降低应用程序的执行速度?

VCDebugOllydbgWinDbg字符串条件断点