17

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

4

3 回答 3

27

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

于 2012-04-26T10:58:44.827 回答
11

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

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

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

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

于 2012-11-07T16:33:41.370 回答
10

如果您希望您的应用程序永远不要检查它,请执行以下操作:

  • 按下Alt + e或打开Executable modules窗口。
  • 选择C:\WINDOWS\system32\kernel32.dll并按下ctrl + N
  • 选择IsDebuggerPresent并按回车。
  • f2
  • 运行程序并在此操作码上等待您的程序中断。
  • 按一些f8直到回到您的代码。
  • 寻找类似的东西TEST EAX,EAX,然后寻找类似的东西je jnz等等,注意输出IsDebuggerPresent保存在EAX.
  • 如果在此操作码上发生跳转,则将其更改为nop,如果没有发生,则将其更改为jmp.
  • 保存您的程序。如果您不知道如何在 ollyDBG 中保存修改后的代码,只需搜索即可。
于 2016-03-05T19:12:33.840 回答