如何绕过IsDebuggerPresent与OllyDbg?

Str*_*rry 14 reverse-engineering ollydbg

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

kub*_*uba 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所在的位置),您将不得不再次应用该修补程序.如果要使补丁永久化,则需要修改启动二进制文件并修改/删除对此函数的调用.但在此之前,您还需要确保二进制文件不会检查自身是否有修改.

  • 应该只有一个地方定义了 IsDebuggerPresent,那就是在 kernel32.dll 中。可能有很多*调用*,但是如果您修补函数本身,所有调用都将获得“0”作为响应。您应该在运行程序之前应用补丁,并且每次运行之前都需要应用它。 (2认同)

mre*_*dia 9

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

mov eax,dword ptr fs:[18]
mov eax,dword ptr ds:[eax+30]
mov byte ptr ds:[eax+2],0
Run Code Online (Sandbox Code Playgroud)

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

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


Ami*_*mir 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.
  • 保存你的程序.如果您不知道如何在ollyDBG中保存修改后的代码,只需搜索它即可.