将机器代码翻译成LLVM IR(X86_64的拆卸/重组.X86.ARM到LLVM bitcode)

Grz*_*cki 27 assembly translation llvm opcode disassembly

我想将X86_64,x86,ARM可执行文件转换为LLVM IR(反汇编).

你建议什么解决方案?

Dan*_*Dan 13

mcsema是一个生产质量的二元升降机.需要x86和x86-64并静态"提升"到LLVM IR.它得到了积极维护,获得了BSD许可,并拥有广泛的测试和文档.

https://github.com/trailofbits/mcsema

  • 但它需要 IDA 的 PRO 许可证 (2认同)

bsa*_*000 11

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

  • 您好osgx,您可以在**<s2e_root>/tools/tools/static-translator**找到它. (2认同)

Hac*_*one 10

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

我把它们拉出来

  1. 动态翻译的缺点:

    S2E [16]和Revnic [14]提出了一种使用QEMU将x86动态转换为LLVM的方法.与我们的方法不同,这些方法可以动态地将代码块转换为LLVM,从而将LLVM分析的应用限制为一次只有一个块.

  2. IR不完整:

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

  3. 没有抽象堆栈或促销信息

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


Ant*_*kov 2

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

  • LLVM 能够捕获高级信息,恕我直言,这不是必需的。我相信可以存在解决方案 - 也许不是一种通用方法,但仍然如此。感谢您的精彩参考:llvm-qemu 和 libcpu 看起来很有趣。:) (3认同)