将机器代码翻译成LLVM IR(将X86_64.X86.ARM反汇编/重组成LLVM位代码)
我想将X86_64,x86,ARM可执行文件翻译成LLVM IR(反汇编)。
你build议什么解决scheme?
考虑使用S2E项目中开发的RevGen工具。 它允许将x86二进制文件转换为LLVM IR。 源代码可以通过URL https://dslabgit.epfl.ch/git/s2e/s2e.git从GIT仓库的Revgen分支检出。
关于@ bsa2000提到的RevGen工具,这篇最新的论文“基于编译器级中间表示的二进制分析和重写系统”在S2E和Revinc中指出了一些限制。
我把它们拉出来
-
dynamic翻译的缺点:
S2E [16]和Revnic [14]提出了一种使用QEMUdynamic地将x86转换为LLVM的方法。 与我们的方法不同,这些方法将代码块快速转换为LLVM,一次只能将LLVM分析的应用程序限制为一个块。
-
IR不完整:
Revnic [14]和RevGen [15]通过合并翻译的块来恢复IR,但恢复的IR是不完整的,仅对当前执行有效; 因此,各种整体scheme分析将提供不完整的信息。
-
没有抽象的堆栈或者宣传信息
此外,翻译的代码保留了原始二进制关于堆栈布局的所有假设。 他们没有提供任何获取抽象堆栈的方法,也没有提供将内存位置提升到符号的方法,这些方法对于多个源代码级分析的应用是必不可less的。
mcsema是一个生产质量的二进制升降机。 它需要x86和x86-64,并静态“提升”到LLVM IR。 这是积极维护,BSD许可,并有广泛的testing和文件。
我怀疑是否会有通用的解决scheme(考虑间接分支等),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
子集作为input。 其中一个项目目标是能够将生成的LLVM IR编译回程序集,以获得具有相同function的二进制程序。
只要在将ARM二进制文件翻译成LLVM IR时提供一些参考资料:
解除武装二进制到IIvm反汇编
https://code.google.com/p/disarm/
但是,我还没有尝试过,所以对它的质量和稳定性一无所知。 其他人可能会发布关于这个项目的额外信息?