我不太了解如何解决IsDebuggerPresent。我想我应该找到用于调试的寄存器,然后将其设置为0以欺骗IsDebuggerPresent,但是我不知道该怎么做。我曾尝试在Google周围搜索,甚至尝试了一些解决方案,但对我而言确实不起作用。有人可以向我解释这应该如何工作以及如何绕过它吗?

最佳答案

有很多方法可以做到这一点。如您所说,可以修补程序的线程块。这是一个教程,介绍如何通过简单地修补此函数使其始终返回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所在的位置)的新副本,并且您将不得不再次应用该修补程序。如果要将补丁永久化,则需要修改启动二进制文件并修改/删除对此函数的调用。但是在您这样做之前,您还需要确保二进制文件不会检查自身是否有修改。

关于reverse-engineering - 如何通过OllyDbg绕过IsDebuggerPresent?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10330147/

10-10 11:40