gpt4 book ai didi

c++ - 逆向工程 C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:06 27 4
gpt4 key购买 nike

今天我决定使用 IDA Pro 反编译一个用 Visual C++ 编写的简单“Hello world”程序。

根据我以前的知识,我确定我不会在可执行文件入口点找到对 printf 的立即调用,我是对的。我发现很多代码不是我写的,是编译器在编译过程中添加的。

我想更好地了解在编译过程中添加了哪些代码。它有什么作用?有什么“技巧”可以快速找到“main”并跳过所有反汇编产生的不必要代码吗?

我能找到的最好的是在这篇文章中: http://www.codeproject.com/Articles/4210/C-Reverse-Disassembly ,说用visual c++编译的可执行文件的执行顺序如下:

  1. CrtlStartUp

  2. 主要

  3. CrtlCleanUp

我能得到更详细的答案吗?

最佳答案

您可能会遇到 c++ 标准要求的各种内容。

最重要的是,需要有代码在调用 main 之前处理主翻译单元中任何静态的构造,以及在 main 离开后处理它们的销毁的函数。此外,该标准需要一个函数 atexit,它允许您注册在 main 返回后调用的其他函数。

因此至少,启动代码需要能够构建函数的数据结构,这些函数将在从 main 返回时调用。这是一个动态数据结构,因为它需要由程序添加到运行时,调用顺序与注册相反(因此通常您需要一个数据结构,可以轻松添加到您走过的地方)。

但此外,该标准要求在其他翻译单元中创建静态变量,然后才能在该翻译单元中执行任何功能。通常,编译器会简单地安排链接器中的所有内容,以便在 main 之前调用所有内容,但这不是必需的。那些以不同方式做事的编译器需要为链接的其他翻译单元代码中的初始化例程提供 thunk,这些代码将在第一次函数调用时调用。

如果您使用任何标准库,这就是相当多的工作。请记住,std::cout 是一个静态对象(静态生命周期,而不是静态链接 - 令人困惑的重载单词警报)。因此,这意味着建立与您的控制台的通信,它将具有您的平台调用所需的任何 API。标准中有很多这样的对象。

然后,可能会有特定于您的平台和/或编译器的东西以某种有用的方式准备过程,或解析环境变量,或加载“标准”动态/共享库,或类似的东西。

通常,exit 只是遍历该列表并以某种方式向环境提供 main 的返回值,因为大多数现代操作系统会自行清理,但除此之外可能还有系统特定的东西。

关于c++ - 逆向工程 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10232871/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com