如何绕过IsDebuggerPresent与OllyDbg?

时间:2012-04-26 08:53:36

标签: reverse-engineering ollydbg

我真的不明白如何绕过IsDebuggerPresent。我想我应该找到用于调试的寄存器,然后将其设置为0来欺骗IsDebuggerPresent,但我不知道该怎么做。我尝试在谷歌周围搜索,甚至尝试了一些解决方案,但它对我来说并不适用。有人可以向我解释一下这应该如何运作以及如何绕过这个?

3 个答案:

答案 0 :(得分:23)

有很多方法可以做到这一点。正如你所说,可以修补程序的线程块。这是一个教程,如何绕过IsDebuggerPresent,只需修补此函数,使其始终返回0.

1)找到IsDebuggerPresent

OllyDbg 1

在我的情况下,它在7664EFF7,只包含三个指令+一个RET。它读取线程块(地址在FS:18),然后找到“我正在调试”的字节并返回它。返回值存储在EAX中(与大多数WINAPI函数一样)。如果我修改了函数,那么最后它将具有EAX = 0,我将成功绕过IsDebuggerPresent。

2)补丁

现在最简单的方法就是简单地让函数执行MOV EAX, 0指令,然后执行RETN

OllyDbg 2

请注意,我还使用NOP填充了函数的其余部分,以避免更改它的大小。它可能没有必要,您也可以MOV EAX, 0然后RETN

此外,您应该知道,修改仅对程序的一次运行有效。当您重新启动它时,它将使用原始函数加载kernel32.dll的新副本(其中IsDebuggerPresent所在的位置),您将不得不再次应用该修补程序。如果要使补丁永久化,则需要修改启动二进制文件并修改/删除调用到此函数。但在此之前,您还需要确保二进制文件不会检查自身是否有修改。

答案 1 :(得分:9)

在您的流程中注入此代码:

mov eax,dword ptr fs:[18]
mov eax,dword ptr ds:[eax+30]
mov byte ptr ds:[eax+2],0

这将修补PEB.BeingDebugged flag,确保IsDebuggerPresent始终返回0

使用x64dbg时,您可以运行dbh命令。

答案 2 :(得分:8)

如果您希望您的应用程序永远不检查它:

  • Alt + e或打开Executable modules窗口。
  • 选择C:\WINDOWS\system32\kernel32.dll,然后按ctrl + N
  • 选择IsDebuggerPresent并按Enter键。
  • f2
  • 运行程序并在此操作代码上等待程序中断。
  • 按一些f8,直到回到您的代码。
  • 查找TEST EAX,EAX之类的内容以及je之类的内容 jnz等,请注意IsDebuggerPresent的输出保存在EAX
  • 如果此操作码发生跳转​​,则将其更改为nop,否则更改为jmp 发生时将其更改为MediaPlayer
  • 保存您的程序。如果您不知道如何保存修改后的代码 ollyDBG只是搜索它。