在 C++ 中反转简单的 hello world

逆向工程 部件 C++
2021-07-08 15:58:03

有人能解释一下为什么一个简单的 C++ 应用程序 -

#include <iostream>
int main()
{
    std::cout << "Hello world!";
    return 0;
}

用 MSVC 2012 编译在 IDA/Olly 中看起来很奇怪?为什么我看到数百行 ASM 代码,而不是我预期的那几行?有人可以向我解释所有这些代码的来源吗?谢谢。

2个回答

您使用的一段代码是#include,其中包括:http : //www.opensource.apple.com/source/gcc/gcc-937.2/libio/iostream.h

你可能会发现班级。这会生成大量代码,您还需要考虑库、默认编译器生成的代码等。

如果您使用 NASM 组装一个基本应用程序,您还会发现比您编写的更多的程序集。

有几个原因:

  • 编译器本身 - 由于编译器实现的优化及其默认选项,在使用不同的编译器时,您将获得略有不同的代码。
  • 要实际运行您的代码,编译器将插入引导程序代码,处理可能的命令行命令,当今常见的安全保护,语言细节支持:
    • 缓冲区溢出 - 堆栈 cookie
    • UAC 保护
    • RTTI - 实时类型信息,C++ 东西
    • 还有其他人。
  • 另一件事是编译器优化,这在大多数情况下会使您编写的代码看起来完全不同。在某些情况下,编译器可以完全删除您的代码-您将获得一个“空”的可执行文件:-)

我希望你明白,要添加以上所有内容,编译器需要添加一些代码,而这甚至是之前的代码your code当然,您可以通过使用参数来禁用上述所有功能。

减少可执行文件大小是一个很好的有用信息列表,可以帮助您了解幕后发生的事情。

我的建议是编写以下代码

int main()
{
   return 0;
}

删除所有优化并通过一次添加/删除编译器选项从那里开始您的研究。

玩得开心!