【问题标题】:How to reconstruct type and data structure in disassembled C/C++ program?如何在反汇编的 C/C++ 程序中重构类型和数据结构?
【发布时间】:2011-08-02 07:47:26
【问题描述】:

我已经使用 IDA Pro 之类的反汇编程序反汇编了一个二进制可执行文件。现在,我打算尽可能多地识别类型和数据结构信息。是否有任何资源参考或想法可以帮助我完成任务?

谢谢!~

编辑

非常感谢以下提示。除了type and data structure information,还有关于class object recognition的想法吗?

【问题讨论】:

  • 你有一个汉堡包。你能弄清楚这头牛是棕色的还是黑白相间的?

标签: assembly binary types reverse-engineering disassembly


【解决方案1】:

这实际上是不可能的;编译后的文件中根本没有足够的信息不存在

您需要在运行时手动完成反汇编并尝试自己破译数字。

【讨论】:

  • @Mehrdad 嗨,Mehrdad。我不这么认为。正如我的问题所说,我只是想要尽可能多的信息而不是完全。并且有一些很棒的基于反汇编文件的反编译工具来完成这项工作,但不是开源的。我只能参考一些专注于这一点的论文。
  • @Jason:您可以从已编译的可执行文件中恢复的 only 类型信息来自 RTTI 和可执行文件的导出表,这两者很可能都不存在,并且两者其中不完整。调试符号会有很大帮助,但它们通常不存在于发布版本中,因此您可能也不会发现它们有帮助。因此,您没有真正的方法来恢复大多数可执行文件。只有少数专门构建的可执行文件可以从中提取类型信息。
  • @Mehrdad:这根本不是真的。它不会自动发生,但如果你愿意付出一些努力,你可以恢复得更多。
  • @Jerry:真的吗?您介意反编译C:\Windows\Notepad.exe 并将代码发布到某个地方(不使用调试符号)吗?我很想看看。
  • 当然反编译器假定标准调用约定(您可以手动覆盖),否则您将如何完成任何事情?名称和类型来自众所周知的 Win32 API 调用的参数,并在调用树中向上跟踪。请参阅 PIT here 的描述。没有使用实际的调试信息,只有 PE 文件中导入函数的代码和名称。
【解决方案2】:

根据访问指令在内存的某些部分所做的类型,可以猜测并选择一些基本类型,如布尔、整数、浮点数,甚至一些字符串消息(如果是 ascii char 很容易,但现在我们也看到了 utf)。

即使您确实选择了一个或另一个来“表示”您在记忆中的想法,您的选择与实际代码之间没有任何关系。

您应该寻找线索的地方是每次调用函数之前的推送指令,因为它们很可能是参数。如果您知道原始语言,您会在calling convention used 上获得一些信息。

但是,正如 Mehrdad 所说,没有足够的信息可以信任。

保重, 贝科

【讨论】:

    【解决方案3】:

    有几本书你可能会觉得有用:

    1. 使用 IDA Pro 逆向工程代码
    2. 逆向:逆向工程的秘密
    3. IDA 专业书籍

    除此之外,在您正在处理的任何操作系统上都有一个 API 参考和一本“内部”书籍会很方便。您可以根据传递给哪些 API 函数的内容大致了解一下。

    【讨论】:

    • 第一本书真的不推荐。这是一个随机收集的编辑不当的文本。出版商处理得非常糟糕,以至于其中一位作者在亚马逊获得了一星评价。不过其他两个都很好。
    【解决方案4】:

    Eldad Eilam 已经提到的Reversing: Secrets of Reverse engineering 很好地描述了各种控制流和数据结构在程序集中的外观。但是,由于您特别提到了类,我想在 Visual C++ 实现上插入my article。其中很多也适用于其他编译器。

    顺便说一句,我建议从小函数/类开始并在二进制文件中识别它们。如果您使用 Visual C++ 并使用调试信息(命令行上的调试版本或 /Zi)编译代码,IDA(至少是最新版本)将检测并提供加载 PDB 符号。这将使您的代码更容易识别。

    【讨论】:

    • 谢谢你,伊戈尔。我听说你是一个伟大的逆向工程师。 :) 感谢您的提示和文章。
    【解决方案5】:

    最近有一些关于这个主题的研究论文,它们可能是开源的,甚至可能有 Web 界面,您可以通过该界面提交二进制文件进行分析,尽管它们可能只处理 Elf 二进制文件。他们取得了相当可观的成绩:

    挖掘数据结构 作者:Anthony Cozzie、Frank Stratton、Hui Xue 和 Samuel T. King

    二进制执行数据结构的自动逆向工程 作者:林志强、张翔宇、徐冬燕

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 2018-08-30
      相关资源
      最近更新 更多