我真的不明白如何让周围的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?