31

我想将 X86_64、x86、ARM 可执行文件翻译成 LLVM IR(反汇编)。

你建议什么解决方案?

4

6 回答 6

15

mcsema 是一个生产质量的二元升降机。它采用 x86 和 x86-64 并将其静态“提升”到 LLVM IR。它得到积极维护,获得 BSD 许可,并拥有大量测试和文档。

https://github.com/trailofbits/mcsema

于 2015-08-06T15:29:45.267 回答
11

考虑使用在S2E 项目中开发的RevGen工具。它允许将 x86 二进制文件转换为 LLVM IR。可以通过 url https://dslabgit.epfl.ch/git/s2e/s2e.git从 GIT 存储库的 Revgen 分支中检出源代码。

于 2012-01-31T07:46:36.727 回答
10

关于@bsa2000 提到的RevGen工具,这篇最新论文《基于编译器级中间表示的二进制分析和重写系统》指出了S2E 和Revinc 中的一些限制。

我把它们拉出来。

  1. 动态翻译的缺点:

    S2E [16] 和 Revnic [14] 提出了一种使用 QEMU 将 x86 动态转换为 LLVM 的方法。与我们的方法不同,这些方法将代码块动态转换为 LLVM,这将 LLVM 分析的应用程序限制为一次仅一个块。

  2. 红外不完整:

    Revnic [14] 和 RevGen [15] 通过合并翻译的块来恢复 IR,但恢复的 IR 不完整,仅对当前执行有效;因此,各种整体方案分析将提供不完整的信息。

  3. 没有抽象堆栈或推广信息

    此外,翻译后的代码保留了原始二进制文件关于堆栈布局的所​​有假设。它们不提供任何获取抽象堆栈或将内存位置提升为符号的方法,这对于应用多个源级分析至关重要。

于 2013-04-16T07:06:35.450 回答
2

我怀疑会有通用的解决方案(考虑间接分支等),LLVM IR 比任何汇编程序都“更高级别”。尽管可以按每个 BB 进行翻译。您可能需要检查 llvm-qemu 和 libcpu 项目等。

于 2011-08-14T11:41:41.343 回答
1

有一个新项目,处于一些早期阶段,libbeautyhttps ://github.com/jcdutton/libbeauty

关于项目的文章:Libbeauty:另一个逆向工程工具,2013 年 12 月 24 日,Michael Larabel - http://www.phoronix.com/scan.php?page=news_item&px=MTU1MTU

它现在只支持x86_64作为输入的子集。项目目标之一是能够将生成的 LLVM IR 编译回程序集,以获得具有相同功能的二进制文件。

于 2014-01-18T11:08:18.620 回答
0

只需发布一些关于将 ARM 二进制文件翻译为 LLVM IR 的参考资料:

disarm - 将二进制文件武装到 llvm ir 反汇编程序

https://code.google.com/p/disarm/

但是,我没有尝试过,因此不确定它的质量和稳定性。其他人可以发布有关此项目的其他信息吗?

于 2013-04-16T06:17:04.670 回答