用 Ghidra 反汇编的简单 C 程序

逆向工程 拆卸 部件 C 吉德拉
2021-07-04 03:23:52

当我用 Ghidra 反汇编它们时,我试图弄清楚我的简单示例程序发生了什么。我不确定这是一些奇怪的 Ghidra 行为还是在编译时默认设置的会产生大量汇编代码的东西,但我积极地只编写了很少的 LOC。

这是我使用 VS Studio 2017 创建的示例 C 程序:

void main()
{
    int x = 1;
    int y = 2;
    x = x + y;
}

这就是我尝试用 Ghidra 拆卸它时得到的结果:

在此处输入图片说明

上面的屏幕截图来自程序的假定“入口”点。但为什么这么复杂?我做了一个简单的程序来测试局部变量在Assembly 中的显示方式,并得到了这样的输出。然而,它应该是一些简单的汇编命令。

在此处输入图片说明

我不确定我在这里错过了什么,所以如果有人能帮助我尝试理解这一点,我将不胜感激。

1个回答

程序入口点!= main

您会看到一些由负责设置C 运行时(CRT) 环境的编译器工具链自动链接到程序的函数的反汇编

来自微软的CRT 初始化

默认情况下,链接器包含 CRT 库,该库提供自己的启动代码。此启动代码初始化 CRT 库,调用全局初始化程序,然后main为控制台应用程序调用用户提供的函数。

main 和 mainCRTStartup 有什么区别?

main()是 C 或 C++ 程序的入口点。mainCRTStartup()是 C 运行时库的入口点。它初始化 CRT,调用您在代码中编写的任何静态初始化程序,然后调用您的main()函数。

您可能会发现有趣的一个练习是编译以下代码(假设 VS Studio 2017 允许),然后反汇编生成的二进制文件:

int main(){}

这是 Linux 版本:Linux x86 程序启动