将任何架构的二进制文件提升为用于静态分析的中间语言

逆向工程 拆卸 安卓 静态分析 赖尔
2021-06-24 04:44:24

背景

由于标题不言自明,我想将任何架构(例如 x86、ARM、ARM Thumb)的二进制文件转换为中间语言,以便应用与架构无关的静态分析。

确切地说,我的工作仅限于 Android 平台 APK 文件中提供的共享对象。我希望 IL 满足的基本要求如下(实际上我的目标是从.soAPK 文件中提供的给定文件中提取信息流)。

  • 二进制切片
  • PDG (CFG/DFG)
  • 得到其维护者或其社区的大力支持

为此,我研究了下面列出的一些现有工具,但不幸的是,我不确定是否可以使用它们来揭示信息流。

  • OpenREIL:该项目的目的是将依赖于 arch 的二进制文件提升到 REIL 中。
  • Barf 项目:一个多平台开源二进制分析和逆向工程框架
  • Capstone:一个反汇编框架。
  • Epic:此工具将 any-arch 的二进制文件转换为与 arch 无关的 LLVM 位码。(这个项目不是公开的,所以我不能使用它。)

问题

是否有任何 IL 可用于静态分析依赖.so于架构的文件(在 APK 存档中)以提取信息流?基本上我希望它提供基本要求,例如切片和 PDG。

4个回答

我的建议是使用 libVEX,因为它是我所知道的最强大的中间代码库。它是 Valgrind 的一部分,支持大量架构您可以在 C/C++ 程序中使用 libVEX,也可以使用名为PyVex的 Python 绑定

无论如何:考虑到您想做的大部分事情都必须从头开始实施。我会说,除了将汇编“方言”翻译成中间表示之外的一切。或者,也许您可​​以使用Angr 项目的某些部分我自己没有测试过。

祝你好运!

Radare2 可能正是您要找的:

https://github.com/radare/radare2

他们将所有内容提升到称为 ESIL 的中间语言,以便可以轻松模拟。可以通过它们的库或通过 C、Python 等中的绑定以编程方式访问、分析和驱动这些代码。它们的架构和文件格式比您提到的要多得多。你可以用它做你需要的一切。

我审查了我正在从事的项目的大约 14 个中间表示。似乎任何作者(即使是博士和硕士论文)都发现所有其他现有的 IR 都缺乏并发明了自己的 IR。

有两个明显的例外:

VEX是一种用于 IR 的史前方法,并提供稳定的后端。话虽如此,它为标志计算之类的东西使用了辅助函数,因此可能会省略语义信息。

REIL是为静态分析目的而精心设计的,但自从 big G 购买 zynamícs 以来就变得支离破碎。一些社区项目保留了这个概念,但引入了他们自己对 REIL 的扩展。

由于静态分析的大部分繁重工作都需要 SMT,因此我们将 IR 转换为逻辑公式,并将它们用作一种中间表示。

例如:

pop eax

等于:

esp = esp -4

[esp - 4] = eax

我想将BAP添加到您的列表中。免责声明,我是作者之一。我们刚刚发布了 1.0.0 版本。这是我们第十次公开发布(经过大约十年的内部开发)。尽管我们的目标受众包括专业研究人员和政府机构,但我们仍然拥有相当不错的独立研究人员社区。我们对 gitter 频道和我们的问题跟踪器也非常敏感。

我们的中间表示具有正式指定的语义,并且我们的提升器使用我们的验证框架进行了密集验证。时至今日,我们的提升器支持多种架构 - x86、x86-64、mips32、mips64、powerpc32、powerpc64 和 armv7。

不提其他库是不公平的,至少是 Radare2 和 Angr。

Radare2 的中间表示称为 ESIL。它不是人类可读的(除非你是 Forth 程序员),但它被认为是高效的。它们至少支持 5 种架构(ARM、x86、GameBoy 和 8051)。

Angr 为提升器使用 VEX 库(即 GPL),因此它们对 5 种架构(x86、arm、mips、ppc、s390)提供开箱即用的支持。VEX 语言也是不可读的(虽然它仍然比 ESIL 好)并且失去了一些精度。我们在之前的 BAP 版本中使用了 VEX,但多年前就转移到了我们自己的升降机上。