使用OllyDbg从零开始Cracking 第十一章-硬件断点与条件断点
第十一章:硬件断点与条件断点下面我们将把剩下的类型的断点介绍完,本章先介绍硬件断点和条件断点。 硬件断点硬件断点(简称:HBP)是处理器的特性之一,它的工作原理我不是很了解,但是我们会用就行了,我们可以设置硬件断点使程序中断下来。在OD中我们最多可以设置4个硬件断点,如果想设置第5个的话,你需要删除已经设置了的4个中的其中一个。跟之前一样,我们还是拿CrueHead'a的CrackMe来做实验。硬件断点分为:硬件执行断点(ONEXECUTION),硬件写入断点(ON WRITE),硬件访问断点(ONACCESS)3种。硬件执行断点与普通的CC断点作用一样,但硬件执行断点并不会将指令首字节修改为CC,所以更难检测。但是有些程序会使用一些技巧来清除硬件断点,应对方法我们会在后面的章节介绍。如果你想在401013处设置硬件执行断点的话,请在401013这一行单击鼠标右键选择-Breakpoint-Hardware,on execution。也可以在命令栏中输入:这样可以设置硬件执行断点。OD中有个特殊的窗口,通过它我们可以查看和管理硬件断点。我们选择菜单栏中的Debug-Hardware breakpoints就可以打开这个窗口。在硬件断点窗口中,如果我们单击Follow按钮,反汇编窗口中该硬件断点所对应的那一行指令就会灰色高亮显示。如果我们单击Delete按钮,那么相应的硬件断点就会被清除。现在按F9键运行程序。中断在401013处。正如你所看到的,起到的效果跟普通的CC断点有点像,如果你像对CC断点做的测试-MOVEAX,DWORD PTR DS:一样的话,你会发现机器码并没有改变。在401000这一行单击鼠标右键选择-Neworigin here将EIP修改为401000,接着按F7键单步。可以看到EAX的值为0004A6E8,内存的形式为E8 A60400,机器码并没有发生变化。如果我们重启OD,可以看到硬件断点依然存在。单击Delete按钮将其删除,然后给MessageBoxA API函数设置一个硬件执行断点。我们来看看硬件断点窗口。我们知道,如果按F9键将程序运行起来,然后输入用户名和序列号,跟之前的普通CC断点一样程序将断在MessageBoxA的第一条指令处,这里就不再赘述了。单个硬件写入断点或者硬件访问断点可以设置1,2或者4个字节的长度,不论我们选择的数据范围有多大,只有前4个字节会起作用。现在我们清除所有设置的硬件断点,然后再4020CA处设置一个硬件访问断点。我们在数据窗口中转到4020CA这个地址处。注意前4个字节。单击鼠标右键。可以看到,对于我们标记的区域,硬件访问断点可供我们选择的长度只有1字节和2字节,由于4字节的只针对4的倍数的地址,当前地址并不是4的倍数,所以没有该菜单项。接下来我们选择后面的1个字节,单击鼠标右键选择-Hardware,on access,可以看到只有1个字节的选项。我们接着选中后面一个字节,这个时候出现了4个字节(Dword)的选项。如果我们想在读取或者写入4020CA地址处的内容的时候断下来的话,我们给该地址设置1个字节的硬件访问断点即可。返回到4020CA处,单击鼠标右键选择-Hardware,on access-Byte。我们可以看到硬件断点窗口中显示的硬件访问断点长度为1个字节。F9键运行。OD提示命中了1号硬件断点。我们可以看到程序断在了触发硬件访问断点或者硬件写入断点的下一条指令处,所以请记住硬件访问/写入断点是断在触发硬件断点的下一条指令处。正如你所看到的,跟内存断点不一样,内存断点会断在触发断点指令处,也就是401007处。而硬件访问/断点断在了触发硬件断点的下一条指令40100C处。 条件断点条件断点实际上就是普通的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(表达式)这个编辑框我们填写,我们知道在API函数的入口处,栈顶存放的是函数的返回地址。接着,Log value of expression(记录表达式的值)这个单选按钮我们选择Always(总是),即总是记录表达式的值,也就是的值。Logfunction arguments(记录函数参数)这个单选按钮我们也选择Always(总是),即记录函数的参数个数/参数内容。我们单击工具栏中【L】按钮打开日志窗口。我们单击鼠标右键选择-Clear window清空日志窗口。如果需要想将日志保存到文件的话,我们选择Log tofile即可。我们按F9键运行程序。我们注意到日志窗口什么也没有记录,因为MessageBoxA并没有被调用。我们打开注册窗口,输入指定的用户名和序列号。单击OK。我们可以看到日志窗口显示有关MessageBoxA函数的信息,栈顶内容为40137D即函数的返回地址,接下来是MessageBoxA的参数,依次是hOwner(所属窗口句柄),Text(文本),Title(标题),(Sytle)显示风格。这里,只显示了一个函数调用的信息,如果某个API被调用了100次的话,你可以将日志保存到文本文件中。如果我们只需要记录某些函数调用的信息的话,我们可以设置相应的条件。如果程序中有大约100处调用了该API函数,你可以指定相应的条件,比如说返回地址。设置条件为== 40137D,那么这100个函数调用中只有返回地址为40137D的会被记录下来。我们重启CrackMe,定位到MessageBoxA,并设置条件记录断点如下: Pause program这个单选按钮我们选择On condition(满足条件时中断下来),即当 == 40137D时中断下来。运行程序,打开注册窗口输入用户名ricnar456以及序列号989898。当我们输入包含数字的用户名的时候,会弹出两个错误消息框。现在单击OK。可以看到第一个MesasgeBoxA并没有中断下来。日志中显示的返回地址为4013C1,并不满足设置的条件,所以不会中断下来。 我们按下OK按钮。这是第二次调用MessageBoxA,这里返回地址满足条件,所以中断下来了。我们看到栈顶的内容是40137D,满足条件记录断点设定的条件,所以中断下来了。两次调用MessageBoxA的信息,OD都记录下来了。只有第二次返回地址为40137D,断了下来。
好了,以上的内容够大家练习一段时间了。下一章将介绍消息断点。
本系列文章汉化版转载看雪论坛
感谢原作者:RicardoNarvaja(西班牙人) 原作者个人主页:http://www.ricardonarvaja.info/
感谢热心翻译的朋友:1~3章译者:BGCoder4~58章译者:安于此生
全集配套程序下载地址:链接: http://pan.baidu.com/s/1eQzTWfo 密码: vytv
== 40137D时中断下来
学习一下 学习学习,,, 谢谢分享 [吾爱汇编论坛52HB.COM]-顶帖,不仅谢谢楼主,也能赚HB [吾爱汇编论坛52HB.COM]-感谢楼主分享,支持一下!做的不错哦,楼主加油,期待更好的作品! 感谢楼主的分享 谢谢楼主分享 感谢分享
页:
[1]
2