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

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

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

如果你想在401013处设置硬件执行断点的话,请在401013这一行单击鼠标右键选择-Breakpoint-Hardware,on execution。
在这里插入图片描述

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

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

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

现在按F9键运行程序。
在这里插入图片描述

中断在401013处。

正如你所看到的,起到的效果跟内存的CC断点有点像,如果你像对CC断点做的测试-MOV EAX,DWORD PTR DS:[401013]一样的话,你会发现401013的机器码并没有改变,依旧是E8 A60400。也就是硬件断点的原理和内存CC断点的与哪里不同,并不是简单的把最后一个字节改成CC。
在这里插入图片描述
在这里插入图片描述
在401000这一行单击鼠标右键选择-New origin 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处。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您在 Visual Studio 2022 中调试 DLL 时发现断点无法进入,请确保您已经进行了以下步骤: 1. 确保 DLL 项目已经以调试模式进行构建。在解决方案资源管理器中,右键单击 DLL 项目,选择 "属性"。在属性页中,选择 "配置属性" -> "常规",确保 "配置类型" 设置为 "动态库(.dll)",并且 "调试信息格式" 设置为 "调试"。 2. 确保您的应用程序正确加载了 DLL。在 Visual Studio 中,您可以通过在 "调试" 菜单中选择 "附加到进程" 来手动附加到正在运行的应用程序。选择您的应用程序进程,并点击 "附加" 按钮。 3. 确保您设置了正确的断点。在 DLL 项目的代码中,单击行号旁边空白处设置断点。确保您设置的断点是在实际会执行的代码行上。 4. 如果您的 DLL 是由另一个应用程序加载的,而不是直接运行的,那么请确保您在正确的环境下进行调试。有些应用程序可能会以不同的用户权限或沙盒环境运行,这可能会导致断点无法进入。您可以尝试以管理员权限运行 Visual Studio 或目标应用程序,或者将目标应用程序的启动路径设置为可访问的路径。 5. 确保您的代码没有被优化。在 Visual Studio 中,您可以在 DLL 项目的属性页中的 "配置属性" -> "C/C++" -> "优化" 下,将 "优化" 选项设置为 "无(/Od)",以确保代码没有被优化,从而使断点能够进入。 如果您仍然遇到断点无法进入的问题,建议检查您的代码和项目配置是否正确,并尝试重启 Visual Studio 和目标应用程序。有时候,重新构建项目和清理解决方案也有助于解决此类问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值