我如何绕过的IsDebuggerPresent与OllyDbg的?(How do I bypass

2019-07-29 04:17发布

我真的不明白如何让周围的IsDebuggerPresent。 我想我应该找到用于调试寄存器,然后将其设置为0欺骗的IsDebuggerPresent,但我不知道该怎么做。 我试图围绕谷歌搜索,甚至还尝试了一些解决方案,但它并没有真正为我工作。 可能有人请向我解释,这应该是如何工作的,我怎么能绕过这个?

Answer 1:

有很多方法可以做到这一点。 正如你所说,这是可能的修补程序的线程块。 这里是一个教程,怎么去解决的IsDebuggerPresent,通过简单地修补这个功能,所以它总是返回0。

1)定位的IsDebuggerPresent

在我的情况,它是在7664EFF7,并且只包含三条指令+一个RET。 它读取线程块(地址为:FS:18),然后定位,说:“我正在调试”,并返回它的字节。 的回报值存储在EAX(作为最WINAPI函数)。 如果我修改的功能,以便在年底将有EAX = 0,我会成功绕过的IsDebuggerPresent。

2)修补它

现在做到这一点最简单的方法是简单地使功能简单地做一个MOV EAX, 0指令,然后一个RETN

请注意,我也充满了函数的其余部分与NOP指令,以避免改变它的大小。 这可能是没有必要的,你也可以只是做MOV EAX, 0 ,然后就RETN

你也应该知道,该修改仅适用于该程序的一个运行。 当您重新启动它,它会加载KERNEL32.DLL与原函数的新副本(其中的IsDebuggerPresent所在地),你将不得不重新应用补丁。 如果你想使补丁永久性的,你需要修改启动二进制和修改/删除调用此函数。 但在此之前你做,你还需要确保二进制不检查本身进行修改。



Answer 2:

在注射过程中的这段代码:

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命令。



Answer 3:

如果你希望你的应用程序就检查它这样做:

  • 按下Alt + e或打开Executable modules窗口。
  • 选择C:\WINDOWS\system32\kernel32.dll ,然后按ctrl + N
  • 选择IsDebuggerPresent然后按回车。
  • f2
  • 运行程序,等待你的节目间断对这个操作码。
  • 按一些f8 ,直到回到你的代码。
  • 仰视的东西,像TEST EAX,EAX和后像一些事情je jnz和等,要小心的输出IsDebuggerPresent保存在EAX
  • 如果跳跃发生在这个操作码将其更改为nop ,如果不发生将其更改为jmp
  • 保存程序。 如果你不知道如何保存体改代码在OllyDbg的只是搜索。


文章来源: How do I bypass IsDebuggerPresent with OllyDbg?