与 SetThreadContext 一起使用时,调试寄存器 (DRx) 不断被践踏

逆向工程 断点
2021-07-09 19:18:08

我正在尝试通过使用 Get/SetThreadContext 和修改 DR0..3、DR7 从代码设置硬件断点,但它只有在我重复执行时才有效。大多数情况下,当我在之前使用过 Set 之后使用 Get 时,我看到这些值完全被践踏(有时是 0,有时是显然不是地址的虚假数字)。get 的返回值始终为 1,有时会卡住一段时间,断点命中。可能导致的是什么,有没有办法跟踪它?我尝试在 ntdll 中的 SetThreadContext 中设置代码断点,但它只是从我的代码中调用。无论是否附加 VS,都会发生这种情况。我必须添加它是一个游戏引擎项目,所以可能是某些 3rd 方库会这样做。配置为 Ryzen 3900、Windows 10 20H2、Windows SDK 10.0.14393、VS 2017

2个回答

好吧,事实证明这是一个新手错误 - 在调用 GetThreadContext 之前我没有将 ContextFlags 设置为 CONTEXT_DEBUG_REGISTERS

这听起来像是某种反调试措施,可能是由内核驱动程序完成的,因此您不会用用户模式断点捕获它。在安装游戏之前和之后检查驱动程序列表,应该会显示罪魁祸首。