为什么逆向工程不能自动化?

信息安全 逆向工程 部件
2021-08-09 00:58:08

我还在大学攻读计算机安全学位,并在上学期参加了我的第一个汇编语言课程。我们谈到了逆向工程的主题,以及为什么它是对抗恶意软件和恶意应用程序的重要组成部分。

在我的课上,我们主要使用 IDA pro,但也检查了一些类似的免费的基于浏览器的应用程序。

在这些应用程序中,我们能够获得关于指令和低级代码的大量信息,以至于我想知道为什么我们甚至需要一个人来检查它并重新创建高级语言(比如编写一个“C”版本的代码)恶意软件)。

这是我的问题:

为什么程序不能使用汇编代码中存在的信息并自动将其转换为简单的语言?

我知道它看起来与第一次编写时的样子不太一样,但难道不能以一种更容易阅读和遵循的方式重新创建它吗?

这只是我无法解决的问题,谢谢!

3个回答

简答

这是绝对可能的,但准确性和可读性是完全不同的事情。需要澄清一点:逆向工程不是反编译。


长答案

逆向工程通常是您将某些东西(实际上是任何东西)拆开以查看其工作原理的过程。 反汇编是当您获取二进制格式的文件并将机器代码解释为汇编代码时。 反编译是将汇编代码解释为更高级别的语言。

我相信你的问题是真的,为什么不能自动反编译程序? 那么它可以!

有几种不同的Java 反编译器。由于其架构独立性,Java 字节码是完全可逆的。变得棘手的是反编译像 C 这样的语言 。Hex Rays确实提供了 C 反编译器,但 C 是一种复杂的语言。有 10 种不同的方法可以完成相同的任务。可以在 20 行内完成的事情,可以在 3 行或 10 行内完成。正是对语言的解释使得反编译 C 的自动化变得困难。

当然,您可以将 C 反编译为最简单的指令。然后你会得到类似**(*var1) = 3;(*bytecode)(param1)可以调用函数指针的行。更糟糕的是,您必须记住,这些仍然只是一种解释我怎么强调都不过分。如果解释有误怎么办?这是您在反汇编级别必须担心的事情,但对于一条指令,至少 5-6 个字节有合理数量的结果。现在您必须解释 15-20 个字节才能找出函数调用或 for 循环。如果有反逆向工程技术,那么它会使解释变得更加困难。

上下文起着巨大的作用。char *函数指针、指针和 a之间有什么区别uint32绝对没有,除了它使用的上下文。编译器优化可能使用__fastcall而不是__stdcall. 这意味着现在您必须解释函数的参数将在哪里;在堆栈上还是在寄存器中?内联函数、宏、#defines 都将成为更大的子例程的一部分。没有真正的方法来解释这些类型的上下文。

可以从汇编中自动重新创建看起来像 C 代码的东西,但是反编译器必须做的猜测工作量是巨大的。

编译器是对源代码进行复杂转换的非常复杂的东西。优化、宏/预编译器替换、代码内联、类型和错误检查、静态链接等。反编译器必须猜测(或选择默认值)您使用的编译器、设置了哪些编译器标志、哪个版本它是在哪个操作系统上编译的,它是针对哪些库编译的,等等。

所以,如果你拿一些 C 代码,编译它,然后反编译它,结果看起来和原来的完全不一样。

这只是为了生成可以运行的 C 代码,我们甚至还没有谈到可读性。变量名、函数名等被编译器删除并替换为原始地址,因此像您想象的那样的反编译器通常将您的函数命名为A(), B(), C()... 和所有变量a, bc因为它无法知道语义(即这些东西应该代表什么)。

底线是任何有一点汇编经验的人都会说阅读反编译的代码实际上比阅读原始汇编更难。(除了少数例外:例如,Java 实际上反编译得非常干净)。

我还没有找到完全自动化逆向工程的论文或软件,但是有些领域对逆向工程自动化特别感兴趣,比如取证分析。逆向工程自动化并不(至少目前)意味着完全自动化逆向工程的整个过程,但至少是某些部分,以便您可以将过程扩展到整个文件系统。例如,本文中对此进行了描述:

介绍

本文将解决逆向工程对自动化(Reverse Engineering Automation)日益增长的需求,将自动化引入研究过程如何可以节省宝贵的时间并帮助检索信息,否则我们的研究将不那么彻底,或者将在小得多的规模上进行。

同样在本文中,我将展示自动化脚本的示例,并将通过我的 Github 帐户访问它们。除了本文中的示例之外,我还邀请您添加更多示例,并向我发送拉取请求,以便我添加它们。

为什么逆向工程需要自动化?

首先,我觉得有必要指出,逆向工程自动化节省了调查时间,但并没有取代其余的流程,其次,原因包括以下几点:

  1. 重复的动作。
  2. 在程序后期检测到的动态代码片段(Crypters、Packers)。
  3. 绕过软件保护,例如 SSDT。
  4. 分配在 Ollydbg 中运行的软件的内存

本文继续描述了一些工具,如 OllyDBG-Python 和 OllyDBG-Playtime,然后是一些代码片段,这些代码片段也可以在此处此处以开源方式获得。