【问题标题】:How do I bypass IsDebuggerPresent with OllyDbg?如何使用 OllyDbg 绕过 IsDebuggerPresent?
【发布时间】:2012-05-06 23:49:18
【问题描述】:

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

【问题讨论】:

  • 你试过像Hide DebuggerOlly Advanced这样的olly插件吗?这些更容易使用,而不是每次都手动修改代码。

标签: reverse-engineering ollydbg


【解决方案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 所在的位置)的新副本,您将不得不再次应用补丁。如果要使补丁永久化,则需要修改启动二进制文件并修改/删除对该函数的 调用。但在您这样做之前,您还需要确保二进制文件不会检查自身是否有修改。

【讨论】:

  • 有没有办法在代码中搜索“FS”?另外,我看到多个 IsDebuggerPresent 实例...实际上,我什至不确定如何找到FS 以及删除它的正确位置。在任何地方,我都会看到MOV DWORD PTR,例如MOV DWORD PTR FS:[0],EAXMOV EAX,DWORD PTR DS:[13000]
  • 我只是按照函数调用找到的。另外,我知道 IsDebuggerPresent 通常被用来添加垃圾来搞乱每一个想法。我应该在更改EAX=0 后保存它然后重新打开它,这样它就不会加载垃圾吗?我不太确定它是如何工作的,抱歉!
  • 应该只有一个地方定义了IsDebuggerPresent,那就是在kernel32.dll里面。可能有很多调用,但是如果你修补函数本身,所有调用都会得到“0”作为响应。您应该在运行程序之前应用补丁,并且每次运行之前都需要应用它。
  • 好的,所以我必须编辑 kernel32.dll。我不确定。好的,我现在就做!
  • 不要修改文件。在 Olly 中加载您的程序,仅在内存中进行更改,然后运行程序。
【解决方案2】:

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

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

【讨论】:

    【解决方案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 随便搜一下。

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 2014-07-11
      • 2018-11-14
      • 2021-09-23
      • 2018-09-19
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多