当我用Ghidra分解它们时,我试图弄清楚我的简单示例程序的状况。我不确定这是某种奇怪的Ghidra行为还是在编译时默认设置的会产生大量汇编代码的行为,但是我只写了很少的LOC。 VS Studio 2017创建的程序:

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


这就是我尝试用Ghidra进行拆解时得到的内容: />
上面的屏幕截图来自该程序的假定“入口”点。但是为什么这么复杂?我做了一个简单的程序来测试如何在Assembly中显示局部变量,并得到这样的输出。但是,应该改用几个简单的Assembly命令。我将不胜感激。

#1 楼

程序入口点!= main

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

来自Microsoft的CRT初始化:


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


Frommain和mainCRTStartup有什么区别? /> main()是C或C ++程序的入口点。 mainCRTStartup()是C运行时库的入口点。它会初始化CRT,调用您在代码中编写的所有静态初始化程序,然后调用main()函数。


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

int main(){}

这是Linux版本:Linux x86 Program Startup

评论


谢谢朱利安,现在有点清楚了。但是,我在哪里可以找到我的主要功能?我找不到它。

–重新开始
19-09-25在5:38

@Rebegin main应该在某些时候由mainCRTStartup调用。如果仍然很难在程序的反汇编中找到它,则可以首先使用调试器运行程序,并在main处设置一个断点,查看调用堆栈,然后重新查看Ghidra产生的反汇编和反编译

– julian♦
19-09-25在7:36



谢谢朱利安,很好的提示。会做到的。我还有一个问题,但是我将在这里打开另一个线程,因为它需要更多信息。我实质上是在尝试了解Assembly中全局变量与局部变量之间的区别。我知道全局存储在内存中,而局部变量存储在堆栈中的理论,但是我想通过我的C代码和反汇编来了解它。

–重新开始
19-09-25在7:56



@重新开始不客气

– julian♦
19-09-25在8:05