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

硬件断点(简称:HBP)是处理器的特性之一,在OD中我们最多可以设置4个硬件断点,如果想设置第5个的话,你需要删除已经设置了的4个中的其中一个。
硬件断点分为:硬件执行断点(ON EXECUTION),硬件写入断点(ON WRITE),硬件访问断点(ON ACCESS)3种。

硬件执行断点与内存的CC断点作用一样,但硬件执行断点并不会将指令首字节修改为CC,所以更难检测。但是有些程序会使用一些技巧来清除硬件断点,应对方法我们会在后面的章节介绍。

如果你想在401013处设置硬件执行断点的话,请在401013这一行单击鼠标右键选择-Breakpoint-Hardware,on execution。
OD调试器断点——硬件断点_第1张图片

也可以在命令栏中输入:HE 401013
在这里插入图片描述

这样可以设置硬件执行断点。

OD中有个特殊的窗口,通过它我们可以查看和管理硬件断点。我们选择菜单栏中的Debug-Hardware breakpoints就可以打开这个窗口。
OD调试器断点——硬件断点_第2张图片OD调试器断点——硬件断点_第3张图片
在硬件断点窗口中,如果我们单击Follow按钮,反汇编窗口中该硬件断点所对应的那一行指令就会灰色高亮显示。如果我们单击Delete按钮,那么相应的硬件断点就会被清除。

现在按F9键运行程序。
OD调试器断点——硬件断点_第4张图片

中断在401013处。

正如你所看到的,起到的效果跟内存的CC断点有点像,如果你像对CC断点做的测试-MOV EAX,DWORD PTR DS:[401013]一样的话,你会发现401013的机器码并没有改变,依旧是E8 A60400。也就是硬件断点的原理和内存CC断点的与哪里不同,并不是简单的把最后一个字节改成CC。
OD调试器断点——硬件断点_第5张图片
在这里插入图片描述
在401000这一行单击鼠标右键选择-New origin here将EIP修改为401000,接着按F7键单步。
OD调试器断点——硬件断点_第6张图片

可以看到EAX的值为0004A6E8,内存的形式为E8 A60400,机器码并没有发生变化。
如果我们重启OD,可以看到硬件断点依然存在。
OD调试器断点——硬件断点_第7张图片
单击Delete按钮将其删除,然后给MessageBoxA API函数设置一个硬件执行断点。
在这里插入图片描述

我们来看看硬件断点窗口。
OD调试器断点——硬件断点_第8张图片

我们知道,如果按F9键将程序运行起来,然后输入用户名和序列号,跟之前的内存CC断点一样程序将断在MessageBoxA的第一条指令处,这里就不再赘述了。

单个硬件写入断点或者硬件访问断点可以设置1,2或者4个字节的长度,不论我们选择的数据范围有多大,只有前4个字节会起作用。

现在我们清除所有设置的硬件断点,然后再4020CA处设置一个硬件访问断点。

我们在数据窗口中转到4020CA这个地址处。
OD调试器断点——硬件断点_第9张图片

在这里插入图片描述

注意前4个字节。
在这里插入图片描述

单击鼠标右键。
OD调试器断点——硬件断点_第10张图片

可以看到,对于我们标记的区域,硬件访问断点可供我们选择的长度只有1字节和2字节,由于4字节的只针对4的倍数的地址,当前地址并不是4的倍数,所以没有该菜单项。

接下来我们选择后面的1个字节,单击鼠标右键选择-Hardware,on access,可以看到只有1个字节的选项。
OD调试器断点——硬件断点_第11张图片

我们接着选中后面一个字节,这个时候出现了4个字节(Dword)的选项。
OD调试器断点——硬件断点_第12张图片

如果我们想在读取或者写入4020CA地址处的内容的时候断下来的话,我们给该地址设置1个字节的硬件访问断点即可。

返回到4020CA处,单击鼠标右键选择-Hardware,on access-Byte。

我们可以看到硬件断点窗口中显示的硬件访问断点长度为1个字节。
OD调试器断点——硬件断点_第13张图片
OD调试器断点——硬件断点_第14张图片
F9键运行。
OD调试器断点——硬件断点_第15张图片

OD提示命中了1号硬件断点。
OD调试器断点——硬件断点_第16张图片

我们可以看到程序断在了触发硬件访问断点或者硬件写入断点的下一条指令处,所以请记住硬件访问/写入断点是断在触发硬件断点的下一条指令处。
在这里插入图片描述

正如你所看到的,跟内存断点不一样,内存断点会断在触发断点指令处,也就是401007处。
而硬件访问/断点断在了触发硬件断点的下一条指令40100C处。

你可能感兴趣的:(#,调试器,动态调试,OllyDbg,硬件断点)