从弹出窗口向后工作

逆向工程 艾达 反调试
2021-06-28 09:58:53

我目前正在尝试对游戏进行逆向工程,但是有反调试,到目前为止我尝试遵循的唯一线索是:我找到了 IsDebuggerPresent API,我尝试通过放入硬件来更改 EAX 的值在 API 的地址处断点(写入),然后运行调试器并打开通用寄存器并将 EAX 更改为 0x00000000,但这并没有完成任何事情。

所以我想知道如何在 IDA 中找到这个弹出窗口的来源在此处输入图片说明

这样我就可以从原点开始向后工作并找出它的来源。

1个回答

您收到的错误可能是由众所周知的保护程序ThemidaWinLicense引发的我要说的是,完全绕过ThemidaWinLicense是缺乏经验的逆向工程师难以达到的目标。

因为这是你问的关于这个主题的第三个问题,而且看起来你真的很挣扎,我将向你展示一个快速的分步教程,教你如何IsDebuggerPresent从 IDA 内部绕过运行时并避免弹出 -上消息。


首先,让我们创建一个小程序,它所做的只是检查它是否在调试器中执行:

#include <windows.h>
#include <stdio.h>

int main(){
    if (IsDebuggerPresent()) {
        printf("Debugger found\n");
    } else {
        printf("Debugger not found\n");
    }

    return 0;
}

如您所见,该程序仅包含一个main()函数,函数将打印“ Debugger found ”或“ Debugger not found ”,具体取决于IsDebuggerPresent().

让我们编译程序。我使用TinyCC是因为它比其他一些编译器噪音小。基本上,您可以为 Windows 使用任何 C 编译器。

./tcc.exe check_for_debugger.c

现在我们有了一个可执行.exe文件,让我们执行它:

./check_for_debugger.exe
Debugger not found

正如预期的那样,我们最终将“ Debugger not found ”打印到控制台。让我们在 IDA Pro 中打开可执行文件。如您所见,主函数如下所示(单击可放大):

主功能

让我们执行它。您可能希望在程序退出之前而不是在打印消息之前放置一个断点。

我们可以看到“Debugger found”被打印到了控制台。

现在让我们IsDebuggerPresent()通过eax在调用函数后更改 的值来修改结果为此,我们将在 offset 0x0040100F(在我的程序中)中创建一个断点,这是IsDebuggerPresent()test eax, eax.

在 IDA 中执行程序。程序在我们的断点处停止,test eax, eax我们可以在寄存器面板中看到eax非零值(在我的情况下是 eax==1)。

eax=1

让我们右键单击eax并选择“零值”,立即将 的值eax更改为零。

在此处输入图片说明

现在让我们继续执行(不要忘记之前的断点exit(),以防您因某种原因删除它)。正如我们所希望的,消息“找不到调试器”会打印在控制台中。


希望您了解如何IsDebuggerPresent通过修改 的值来绕过eax,现在您可以继续您的逆向工程过程。