为什么现在逆向工程师使用反编译器而不是反汇编器进行逆向工程?

逆向工程 艾达 二元分析 吉德拉 反汇编者 反编译器
2021-07-07 03:55:04

我看到了很多逆向工程课程,每隔一个人就使用 Ghidra 反编译器而不是反汇编器进行逆向工程,因为两者都可以在同一平台上使用。我认为使用反编译器进行逆向比反汇编器更容易(理解代码的汇编)。我想对了吗?假设我正在使用 Ghidra,那么我什么时候应该看到反汇编程序和反编译程序?另外,如果我们现在在 Ghidra 中有一个免费的反编译器,那么对反汇编器的需求就消失了,当我们有了反编译器时就不需要理解程序集了?

4个回答

尽管这些术语可以互换使用,但传统上反汇编器和反编译器定义之间存在内在差异。让我们首先考虑将低级代码转换为高级人类可读代码所涉及的常见步骤。这类似于将高级代码转换为低级机器代码或可执行文件的编译。

  1. 语法分析+语义分析
  2. 中间码
  3. 控制流恢复
  4. 控制流和数据流分析
  5. 变量恢复和类型恢复
  6. 提前结构恢复等
  7. 高层次的代表。

请注意,这些级别因反编译器的算法而异。

现在历史上反汇编和反编译可以互换使用。但是,现在这些术语通常用于以下上下文。

  • 反汇编器:将低级代码转换为汇编
  • 反编译器:将低级代码转换为高级表示,如 C 或 C++(主要是 C)。

在我个人看来,反编译器涉及高级分析,最重要的是类型和高级结构恢复,用于高级和用户可读的表示。我个人会使用反汇编程序进行符号分析、代码相似性或可能不需要实际高级表示的模糊测试之类的分析。当我想解释程序的底层代码或一般工作时,我更喜欢反编译器。因为程序是更好的方式。

参考

王帅、王沛和吴丁浩。“可拆装拆装。” 第 24 届 {USENIX} 安全研讨会({USENIX} Security 15)。2015 年。

安德烈斯、丹尼斯等人。“对全尺寸 x86/x64 二进制文件的反汇编的深入分析。” 第 25 届 {USENIX} 安全研讨会({USENIX} Security 16)。2016 年。

王若宇等。“Ramblr:让重组再次伟大。” 国家安全局。2017 年。

“反编译与反汇编介绍” Hex-Rays SA

这取决于逆向工程,大多数使用反编译器来加速你的工作,这对定位必要的调用有很大帮助,假设你在工作,需要快速找到一个 X 算法来交付你的工作,所以如果你要仅使用一个反汇编器,您将花费更多的工作时间来分析和转换小汇编指令和等效的高级代码,反编译器很棒,它们可以简化您的生活,但不要陷入其中,因为这还不够,让我们说在我的例子我找到了用反编译器求得最接近想要的操作的算法 用反汇编器把它分析出来的伪代码和反编译器比对,这一切都是为了最大限度地还原原作,也取决于要进行的工作,好学习。

除了其他答案之外,我认为来自可执行代码的“逆向工程”意味着“从可执行代码中获取源代码”。

根据这个定义,如果被逆向工程的程序是用 C 编写的,我们需要一个 C 反编译器来有效地对其进行逆向工程;同样,如果它是用 Java 编写的,我们需要一个 Java 反编译器。如果我们在第一种情况下使用反汇编器,我们可以理解逻辑并推断出代码的工作原理,但我们没有任何接近原始源代码的内容。如果我们使用 Java 的字节码浏览器,我们可以跟踪 JVM 中的执行,并了解代码在做什么;但又离源代码很远了。

只有当代码最初是用汇编语言编写时,反汇编程序才会对源代码进行适当的逆向工程。

当然逆向工程还有其他定义;例如,如果您想在移动应用程序上调用 API,则不需要源代码;您使用网络分析器并遵循 HTTP 协议请求/响应。然后您可以使用您想要的任何语言实现对服务的调用。只是澄清一下反编译器的所有目的是取回源代码,并且从假设编写代码的语言开始。

反汇编器:将机器代码(可执行二进制)转换为人类可读的汇编代码。
反编译器:将机器代码(可执行二进制)转换为更高级别的语言,例如 C/C++。