【问题标题】:Reverse engineering C++ - best tools and approach [closed]逆向工程 C++ - 最佳工具和方法 [关闭]
【发布时间】:2011-05-14 19:33:17
【问题描述】:

对不起 - C++ 源代码可以看作是设计的实现,而逆向工程我的意思是让设计恢复原状。似乎你们中的大多数人都将其视为从二进制文件中获取 C++ 源代码。我在Understanding a C++ codebase by generating UML - tools&methology

发布了一个更精确的问题

我认为有很多工具可以对 C++(源代码)进行逆向工程,但通常要弄清楚你得到了什么并不那么容易。

有人找到了好的方法吗?

我认为我可能希望看到的一件事是 GUI 层以及它是如何分离的(或不与其余部分分离的)。认为这些工具应该以某种方式检测包,然后让我手动组织它。

【问题讨论】:

  • 如果你有源代码,那么“逆向工程”到底是什么意思?
  • 您希望反汇编器或反编译器检测包、从非 UI 代码中提取 UI 元素或任何类似的东西?

标签: c++ reverse-engineering class-diagram tool-uml


【解决方案1】:

据我所知,没有可靠的工具可以对编译后的 C++ 进行逆向工程。

此外,我认为建造这样的设备几乎是不可能的。编译后的 C++ 程序只不过是机器语言指令。为了知道它是如何映射到 C++ 结构的,您需要无限了解编译器、编译器设置、包含的库等等。

你为什么想要这样的东西?根据您的需求,可能还有其他方法可以实现您真正追求的目标。

【讨论】:

  • 即使考虑到编译器信息,它也不是双射:当一些函数模板调用被内联,用不同类型实例化时,不可能知道,也可能很难猜到,首先,它们实际上都来自同一个模板。当然,除非二进制文件有调试信息。
  • 非常同意——你不能真正对 C++ 进行逆向工程。
  • 你们假设目标是恢复原始源代码。假设有可能取回功能等效的东西(即使这意味着模板实例化看起来像独立的类型和函数)。但是,目前还没有工具可以很好地做到这一点。
  • @Evan Teran:查看 Hex-Rays 反编译器。
  • 好吧,我想说 Hex-Rays 很好地完成了“取回功能等效的东西”的工作(在用户的帮助下),而且它不是“假设的”。
【解决方案2】:

虽然它不是一个完整的解决方案。你应该看看IDA ProHexrays

它更多的是用于传统意义上的“逆向工程”。就像这样,它可以让您充分了解代码在类似 C 的语言中的样子,但不会(不能)提供功能齐全的源代码。

它的好处是很好地了解特定段(通常是函数)的工作原理。它是“用户辅助的”,这意味着当确实有一个结构或类时,它通常会执行大量的偏移取消引用。此时,您可以为反编译器提供结构定义(类实际上只是带有额外内容的结构,例如 v-tables 等),它会使用新的类型信息重新分析代码。

就像我说的,它并不完美,但如果你想做“逆向工程”,这是我所知道的最好的解决方案。如果你想要完全“反编译”,那么你就很不走运了。

【讨论】:

    【解决方案3】:

    您可以使用 dissembly 拉取控制流,但您将永远无法恢复数据类型...

    汇编中只有整数(可能还有一些短)。想想对象、数组、结构、字符串和指针算术都是同一种类型!

    【讨论】:

    • “你永远不会找回数据类型”——我想知道。 vtables 可能很容易识别,并且任何具有外部链接的东西都可能具有可以解构的名称。您可能能够计算出许多类的合理数量,但您无法找到对该类的所有调用,因为通常有些会被内联。
    • @Steve:名字不存在。剩下的就是内存地址。
    • @Steve Jessop:内联函数实际上并不是问题,它只会在“反编译器”中显示为具有重复代码的多个函数。当然它看起来不像原始来源,但它可能在功能上等同于对逆向工程真正重要的东西。
    • @Evan:好的,但在此基础上,您可以通过将 C++ 代码反编译为汇编程序或 C 来“逆向工程”C++ 代码。
    • @John: 那么dlopen 怎么会在程序上工作呢?我并不是说名称在 vtable 中,只是它们可能在可执行文件的符号表中,所以给定地址,您可以反向查找它们。当然,可执行文件可能去除了外部符号。
    【解决方案4】:

    http://sourceforge.net/projects/oovaide/ 或 github 上的 OovAide 项目 有一些功能可能会有所帮助。它使用 CLang 编译器 用于从源代码中检索准确的信息。它扫描 目录寻找源代码,并将信息收集到 包含分析所需信息的较小数据集。

    一个概念称为区域图。它显示了类之间的关系 一个非常高的水平,因为每个类都如图中的一个点所示,并且 显示连接它们的关系线。这允许 显示数百或数千个类的图​​表。 OovAide 程序区域图显示有一个名为“Show Child Zones”的选项, 它将目录中彼此靠近的类分组。 还有目录过滤器,可以减少类的数量 显示在非常大的项目的图表上。 区域图示例及其工作方式如下所示: http://oovaide.sourceforge.net/articles/ZoneDiagrams.html

    如果在构建设置中为目录分配了组件类型,那么 组件图将显示组件之间的依赖关系。这 甚至显示哪些组件依赖于外部组件,例如 GTK 或其他外部库。

    下一层显示类似 UML 类图,但显示所有 关系,而不仅仅是聚合和继承。它可以显示 在方法中使用的类,或作为传递的类 方法的参数。可以选择任何类作为起点,然后在之前 在图表中添加了一个类,显示一个允许查看的列表 哪些类将按关系类型显示。

    最低级别显示序列图。这允许向上或向下导航 调用树,同时显示包含方法的类。

    【讨论】:

      猜你喜欢
      • 2010-12-15
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 2011-02-09
      • 2013-10-14
      • 1970-01-01
      • 2010-10-15
      • 2018-09-20
      相关资源
      最近更新 更多