我真的不明白如何绕过 IsDebuggerPresent。我想我应该找到用于调试的寄存器,然后将其设置为 0 以欺骗 IsDebuggerPresent,但我不知道该怎么做。我尝试在谷歌上搜索,甚至尝试了一些解决方案,但它对我来说并没有真正起作用。有人可以向我解释一下这应该如何工作以及如何绕过它吗?
有很多方法可以做到这一点。正如您所说,可以修补程序的线程块。这是一个教程,介绍如何通过简单地修补此函数使其始终返回 0 来绕过 IsDebuggerPresent。
1)找到IsDebuggerPresent
在我的情况下,它位于 7664EFF7,并且仅包含三个指令 + 一个 RET。它读取线程块(地址位于 FS:18),然后找到“我正在调试”的字节并返回它。返回值存储在 EAX 中(对于大多数 WINAPI 函数而言)。如果我修改该函数,使其最后的 EAX = 0,我将成功绕过 IsDebuggerPresent。
2)修补它
现在最简单的方法就是让函数简单地执行MOV EAX, 0
指令,然后是RETN
:
请注意,我还用 NOP 填充了函数的其余部分,以避免更改其大小。这可能没有必要,你也可以这样做MOV EAX, 0
然后就RETN
.
您还应该知道,修改仅对程序的一次运行有效。当您重新启动它时,它将加载带有原始函数的 kernel32.dll(IsDebuggerPresent 所在位置)的新副本,您将必须再次应用补丁。如果你想让补丁永久存在,你需要修改启动二进制文件并修改/删除call到这个函数。但在执行此操作之前,您还需要确保二进制文件不会检查自身是否有修改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)