从弹出窗口向后工作
您收到的错误可能是由众所周知的保护程序Themida或WinLicense引发的。我要说的是,完全绕过Themida和WinLicense是缺乏经验的逆向工程师难以达到的目标。
因为这是你问的关于这个主题的第三个问题,而且看起来你真的很挣扎,我将向你展示一个快速的分步教程,教你如何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并选择“零值”,立即将 的值eax更改为零。
现在让我们继续执行(不要忘记之前的断点exit(),以防您因某种原因删除它)。正如我们所希望的,消息“找不到调试器”会打印在控制台中。
希望您了解如何IsDebuggerPresent通过修改 的值来绕过eax,现在您可以继续您的逆向工程过程。



