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