在 IDA pro 中找不到 main 函数?

逆向工程 艾达 拆卸 视窗
2021-07-02 06:13:29

我有一个关于 IDA pro 和 Visual Studio 2010 的新手问题。基本上我在 VS 2010 中启动了一个新的“空项目”,并向 .cpp 文件添加了一个主要功能。然后我将其编译为二进制文件并使用 IDA Pro 打开二进制文件。但是,我找不到主要功能。这是为什么?

3个回答

在 IDA 中打开导出视图(视图--> 打开子视图--> 导出)。你会看到一个函数名。它是程序的真正主函数(它可能不是你的主函数,但你的主函数会以某种方式被它调用)。

实际上,您无法通过名称找到 main 函数,因为此信息不存在于可执行文件中:计算机不需要它来执行程序。有关函数、变量和类型名称的信息以及 CPU 指令与称为“调试信息”并存储在不同位置的真实源代码行之间的关系,在您的特定情况下是 .PDB 文件。

因此,如果您使用调试信息(这是默认设置)编译程序,则加载 .PDB 文件(文件--> 加载文件--> PDB 文件)可能会有所帮助。

start 是 IDA 从文件头中提取的地址。对于 PE 文件,这对应于 (AddressOfEntryPoint + ImageBase)。start != main, main 是语言 (C/C++) 特定要求,并非所有语言都需要“main”。

在 start 和 main 之间执行的代码的工作之一是,根据二进制文件所在平台的调用约定,以 main 期望接收它们的方式设置 main 期望的所有参数(argc、argv、envp)被建。

IDA 尝试为您定位 main,因为您通常对 start 和 main 之间的代码不感兴趣,这通常只是编译器样板代码。在某些情况下,IDA 会注意到有一个名为 main 的符号,然后将您放在那里。在其他情况下,IDA 会根据起始代码进行有效的签名匹配,以挑选出 main 的地址。编译器往往有独特的方法来访问 main,所以如果(一个很大的 if)IDA 有一个特定编译器的签名,那么它可能会为你挑选出 main。

您没有提到您是在二进制文件的调试版本还是发布版本上使用 IDA。根据我使用 IDA/Visual Studio 的经验,IDA 将很难在 Debug 版本上找到 main 并且在 Release 版本上做得更好。如果比较两个不同的 .exe 文件,您会发现它们有很大的不同。特别是通过调试构建的流程比通过发布构建复杂得多。

在 IDA 中,查看“functions”并查找“start”。

看到什么了吗?

有时,IDA 签名无法识别 main() 函数。在这种情况下,您必须从程序的入口点手动跟踪它,尽管多年来 sig 有所改进,但它们通常能够正确识别 main。

您如何访问 main() 还取决于您是否链接到标准 Visual Studios 库(我不记得 Empty Project 是否默认链接)。