从弹出窗口向后工作


0

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

所以我想知道我怎样才能找到这个弹出的原产地在IDA enter image description here

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

3

您收到的错误可能是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()函数将打印“调试器发现”或“调试器未找到”,取决于IsDebuggerPresent()的结果。

让我们来编译程序。我使用了TinyCC,因为它比其他编译器的噪声要小。基本上,你可以使用任何C编译器为你想要的窗口。

./tcc.exe check_for_debugger.c 

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

./check_for_debugger.exe 
Debugger not found 

正如预期的那样,我们结束了“调试器没有找到”打印到控制台。让我们在IDA Pro中打开可执行文件。正如你所看到的,主要功能如下所示(点击它可放大):

main function

让我们来执行它。您可能希望在程序退出前放置断点,但不要在打印消息前放置断点。

我们可以看到“找到调试器”被打印到控制台。

现在让我们在调用该函数后通过更改eax的值来修改IsDebuggerPresent()的结果。为此,我们将在偏移量0x0040100F(在我的程序中)创建一个断点,IsDebuggerPresent()的结果由test eax, eax检查。

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

eax=1

让我们在eax右击并选择“零值”,并立即的eax值将变为零。

enter image description here

现在,让我们继续执行(不要忘记在情况exit()之前断点你删除了它出于某种原因)。正如我们想要的那样,在控制台中打印出“Debugger not found”的消息。


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

  0

谢谢,我上次发布的内容完全一样。我认为这很简单,我想还有更多的反调试技巧 16 12月. 172017-12-16 15:23:25

  0

所以我做了正确的事情,但我认为我做错了什么。这意味着有更多的反调试技术。 16 12月. 172017-12-16 15:24:12

+1

确实如此,软件保护程序在反调试技巧方面已经触手可及,正如我所说,完全绕过它们并不容易。无论如何,这是你绕过IsDebuggerPresent,如果你会检查你可以看到,其他反分析技巧可能会抓住你。 16 12月. 172017-12-16 15:26:12

  0

感谢您的详细回复 16 12月. 172017-12-16 15:34:01