我想将X86_64,x86,ARM可执行文件转换为LLVM IR(反汇编)。
您建议使用什么解决方案?
答案 0 :(得分:13)
mcsema是一款生产品质的二元升降机。它需要x86和x86-64以及静态"提升"它到LLVM IR。它积极维护,获得BSD许可,并拥有广泛的测试和文档。
答案 1 :(得分:11)
考虑使用RevGen中开发的S2E project工具。它允许将x86二进制文件转换为LLVM IR。可以通过url https://dslabgit.epfl.ch/git/s2e/s2e.git 从GIT存储库的Revgen分支中检出源代码。
答案 2 :(得分:10)
关于@ bsa2000提到的 RevGen 工具,这篇最新论文"A compiler level intermediate representation based binary analysis and rewriting system"指出了S2E和Revinc的一些限制。
我把它们拉出来。
动态翻译的缺点:
S2E [16]和Revnic [14]提出了一种动态转换的方法 使用QEMU的x86到LLVM。与我们的方法不同,这些方法转换 动态LLVM的代码块限制了LLVM的应用 一次仅分析一个区块。
IR不完整:
Revnic [14]和RevGen [15]通过合并翻译来恢复IR 块,但恢复的IR不完整,仅对有效 当前执行;因此,各种整体计划分析将会 提供不完整的信息。
没有抽象堆栈或宣传信息
此外,翻译后的代码保留了所有的假设 关于堆栈布局的原始二进制文件。他们不提供任何 获取抽象堆栈或促进存储器位置的方法 符号,这对于几个应用是必不可少的 源级分析。
答案 3 :(得分:2)
我怀疑会有通用解决方案(考虑间接分支等),LLVM IR比任何汇编程序都“更高级别”。虽然可以按BB进行翻译。您可能想要检查llvm-qemu和libcpu项目等。
答案 4 :(得分:1)
有一个新项目,处于早期阶段,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编译回程序集,以获得具有相同功能的二进制文件。
答案 5 :(得分:0)
发布一些关于将ARM二进制文件转换为LLVM IR的参考文献:
解除武装 - 将二进制文件转换为llvm ir反汇编程序
https://code.google.com/p/disarm/
但是,我没有尝试过,因此不确定它的质量和稳定性。其他人可能会发布有关此项目的其他信息吗?