我想将 X86_64、x86、ARM 可执行文件翻译成 LLVM IR(反汇编)。
你建议什么解决方案?
mcsema 是一个生产质量的二元升降机。它采用 x86 和 x86-64 并将其静态“提升”到 LLVM IR。它得到积极维护,获得 BSD 许可,并拥有大量测试和文档。
考虑使用在S2E 项目中开发的RevGen工具。它允许将 x86 二进制文件转换为 LLVM IR。可以通过 url https://dslabgit.epfl.ch/git/s2e/s2e.git从 GIT 存储库的 Revgen 分支中检出源代码。
关于@bsa2000 提到的RevGen工具,这篇最新论文《基于编译器级中间表示的二进制分析和重写系统》指出了S2E 和Revinc 中的一些限制。
我把它们拉出来。
动态翻译的缺点:
S2E [16] 和 Revnic [14] 提出了一种使用 QEMU 将 x86 动态转换为 LLVM 的方法。与我们的方法不同,这些方法将代码块动态转换为 LLVM,这将 LLVM 分析的应用程序限制为一次仅一个块。
红外不完整:
Revnic [14] 和 RevGen [15] 通过合并翻译的块来恢复 IR,但恢复的 IR 不完整,仅对当前执行有效;因此,各种整体方案分析将提供不完整的信息。
没有抽象堆栈或推广信息
此外,翻译后的代码保留了原始二进制文件关于堆栈布局的所有假设。它们不提供任何获取抽象堆栈或将内存位置提升为符号的方法,这对于应用多个源级分析至关重要。
我怀疑会有通用的解决方案(考虑间接分支等),LLVM IR 比任何汇编程序都“更高级别”。尽管可以按每个 BB 进行翻译。您可能需要检查 llvm-qemu 和 libcpu 项目等。
有一个新项目,处于一些早期阶段,libbeauty
:
https ://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 编译回程序集,以获得具有相同功能的二进制文件。
只需发布一些关于将 ARM 二进制文件翻译为 LLVM IR 的参考资料:
disarm - 将二进制文件武装到 llvm ir 反汇编程序
https://code.google.com/p/disarm/
但是,我没有尝试过,因此不确定它的质量和稳定性。其他人可以发布有关此项目的其他信息吗?