- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
今天我决定使用 IDA Pro 反编译一个用 Visual C++ 编写的简单“Hello world”程序。
根据我以前的知识,我确定我不会在可执行文件入口点找到对 printf 的立即调用,我是对的。我发现很多代码不是我写的,是编译器在编译过程中添加的。
我想更好地了解在编译过程中添加了哪些代码。它有什么作用?有什么“技巧”可以快速找到“main”并跳过所有反汇编产生的不必要代码吗?
我能找到的最好的是在这篇文章中: http://www.codeproject.com/Articles/4210/C-Reverse-Disassembly ,说用visual c++编译的可执行文件的执行顺序如下:
CrtlStartUp
主要
CrtlCleanUp
我能得到更详细的答案吗?
最佳答案
您可能会遇到 c++ 标准要求的各种内容。
最重要的是,需要有代码在调用 main 之前处理主翻译单元中任何静态的构造,以及在 main 离开后处理它们的销毁的函数。此外,该标准需要一个函数 atexit
,它允许您注册在 main 返回后调用的其他函数。
因此至少,启动代码需要能够构建函数的数据结构,这些函数将在从 main 返回时调用。这是一个动态数据结构,因为它需要由程序添加到运行时,调用顺序与注册相反(因此通常您需要一个数据结构,可以轻松添加到您走过的地方)。
但此外,该标准要求在其他翻译单元中创建静态变量,然后才能在该翻译单元中执行任何功能。通常,编译器会简单地安排链接器中的所有内容,以便在 main 之前调用所有内容,但这不是必需的。那些以不同方式做事的编译器需要为链接的其他翻译单元代码中的初始化例程提供 thunk,这些代码将在第一次函数调用时调用。
如果您使用任何标准库,这就是相当多的工作。请记住,std::cout 是一个静态对象(静态生命周期,而不是静态链接 - 令人困惑的重载单词警报)。因此,这意味着建立与您的控制台的通信,它将具有您的平台调用所需的任何 API。标准中有很多这样的对象。
然后,可能会有特定于您的平台和/或编译器的东西以某种有用的方式准备过程,或解析环境变量,或加载“标准”动态/共享库,或类似的东西。
通常,exit 只是遍历该列表并以某种方式向环境提供 main 的返回值,因为大多数现代操作系统会自行清理,但除此之外可能还有系统特定的东西。
关于c++ - 逆向工程 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10232871/
我有 *.ipa 文件,它是 iphone 应用程序。 是否可以在该 ipa 中使用逆向工程并提取代码..? 最佳答案 嗯,这不是真正的黑客攻击,但它确实可以帮助您识别 UI 的某些部分...请执行以
我一直在尝试对游戏的功能进行逆向工程,但我有点困惑。我对逆向工程还很陌生(顺便说一句,我正在使用 ollydbg),所以我还不太了解所有的技巧和细节。 无论如何这是我的问题。当您在游戏中拾取任何元素时
我被要求抓取一个 Flash 网站,该网站似乎正在通过 AMF 协议(protocol)使用某种服务器端调用。我完全不熟悉这个协议(protocol),但找到了这个库(http://www.pyamf
我的问题是我正在使用一个巨大的网络应用程序(学校系统),没有内部逻辑的文档。我需要对特定值进行批量更新,但我不知道MySQL数据库中的哪些表包含要更新的相关数据。该应用程序是从 php 自行运行的。有
我正在学习如何逆向一个程序,我想知道..如果我用调试信息编译: gcc -g .... 这对逆向过程有什么帮助吗?如果我这样做,我会提供额外的信息吗?我找不到有关该主题的任何信息。 最佳答案 它通过将
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
今天我决定使用 IDA Pro 反编译一个用 Visual C++ 编写的简单“Hello world”程序。 根据我以前的知识,我确定我不会在可执行文件入口点找到对 printf 的立即调用,我是对
我正在使用 PowerDesigner 为我的 SQL Server 数据库建模。我使用逆向工程选项来导入我的数据库。我的问题是表中的默认数据未导入。 有人知道如何导入表格中的数据吗? 最佳答案 我们
我一直在分析一些 230V 通信并试图找出协议(protocol)的校验和算法。从我了解到的通信结构如下: 第一个 block 总是相同的,必须是某种开始结构(910hex) 然后嵌套5个 block
在 AmigaOS 中的 Devs:Monitors 中找到的文件,它们包含什么? 它们的内部格式是什么?您如何修补一个或从头开始创建一个? 最佳答案 Amiga 程序 MonEd ( http://
我正在使用 VS2013 更新 3 的“逆向工程”模型优先功能从现有数据库开发 EF 模型。不幸的是,我无法完全控制数据库架构,它使用表和列前缀(例如 tblPerson , cFirstName,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在尝试对 APK 文件进行逆向工程。 我尝试了 apk2jar 来获取类和资源文件。但我无法解压缩 Assets 。 有人可以帮忙吗? 最佳答案 使用 apktool。它将对所有布局、值、 Ass
我正在尝试解码由 Android instagram 应用程序发送到 graph.instagram.com 的帖子数据。该问题与此处发现的问题类似: Reverse Engineer HTTP re
我想查明用 C/C++ 编写的应用程序究竟在哪里失败。我无法直接调试应用程序,既不使用 gdb/lldb 也不使用 IDE,因为应用程序是由程序启动的(它是 webots 机器人模拟软件的机器人 Co
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是
我有一个最初用 VS2005 编写的小实用程序。 我需要做一点小改动,但是其中一个 dll 的源代码在某处丢失了。 是否有免费或价格合理的工具将 dll 反向工程回 C++ 代码。 最佳答案 Hex-
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我想知道是否有人知道如何对 Access 数据库进行逆向工程。我希望能够生成用于创建数据库表并将所有记录插入表中的 SQL 代码。换句话说,我想创建类似于 MySQL 转储文件的内容。 任何想法都会很
String.GetHashCode 的行为取决于程序架构。所以它将在 x86 中返回一个值,在 x64 中返回一个值。我有一个必须在 x86 上运行的测试应用程序,它必须预测必须在 x64 上运行的
我是一名优秀的程序员,十分优秀!