将机器码转换为 LLVM IR(将 X86_64.X86.ARM 反汇编/重新汇编为 LLVM 位码)
我想将 X86_64、x86、ARM 可执行文件转换为 LLVM IR(反汇编)。
您建议什么解决方案?
I would like to translate X86_64, x86, ARM executables into LLVM IR (disassembly).
What solution do you suggest ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
mcsema 是一款生产质量的二进制升降机。它采用 x86 和 x86-64 并将其静态“提升”到 LLVM IR。它得到积极维护,获得 BSD 许可,并拥有广泛的测试和文档。
https://github.com/trailofbits/mcsema
mcsema is a production-quality binary lifter. It takes x86 and x86-64 and statically "lifts" it to LLVM IR. It's actively maintained, BSD licensed, and has extensive tests and documentation.
https://github.com/trailofbits/mcsema
考虑使用在 < a href="http://dslab.epfl.ch/proj/s2e" rel="noreferrer">S2E 项目。它允许将 x86 二进制文件转换为 LLVM IR。源代码可以通过 url https: //dslabgit.epfl.ch/git/s2e/s2e.git。
Consider using RevGen tool developed within the S2E project. It allows converting x86 binaries to LLVM IR. The source code could be checked out from Revgen branch of GIT repository available by url https://dslabgit.epfl.ch/git/s2e/s2e.git.
关于@bsa2000提到的RevGen工具,这篇最新论文 《基于编译器级中间表示的二进制分析和重写系统》指出了S2E和Revinc的一些局限性。
我把它们拉到这里。
动态翻译的缺点:
<块引用>
S2E [16] 和 Revnic [14] 提出了一种动态翻译的方法
使用 QEMU 从 x86 到 LLVM。与我们的方法不同,这些方法转换
即时将代码块传输到 LLVM,这限制了 LLVM 的应用
一次仅分析一个块。
动态翻译的缺点
IR 不完整:
<块引用>
Revnic [14] 和 RevGen [15] 通过合并翻译后的内容来恢复 IR
块,但恢复的 IR 不完整且仅有效
当前执行;因此,各种整个程序分析将
提供不完整的信息。
IR
没有抽象堆栈或促销信息
<块引用>
此外,翻译后的代码保留了所有假设
关于堆栈布局的原始二进制文件。他们不提供任何
获取抽象堆栈或提升内存位置的方法
符号,这对于几个应用程序是必不可少的
源代码级分析。
As regards to RevGen tool mentioned by @bsa2000, this latest paper "A compiler level intermediate representation based binary analysis and rewriting system" has pointed out some limitations in S2E and Revinc.
I pull them out here.
shortcoming of dynamic translation:
IR incomplete:
no abstract stack or promoting information
我怀疑是否会有通用的解决方案(考虑间接分支等),LLVM IR 比任何汇编器都“更高级别”。虽然可以按每个 BB 进行翻译。您可能需要检查 llvm-qemu 和 libcpu 项目等。
I doubt there will be universal solution (think about indirect branches, etc.), LLVM IR is much "higher level" than any assembler. Though it's possible to translate on per-BB basis. You might want to check llvm-qemu and libcpu projects among others.
只需发布一些有关将 ARM 二进制文件转换为 LLVM IR 的参考信息:
disarm - arm binary to llvm ir disassembler
https:// code.google.com/p/disarm/
但是,我没有尝试过,因此不确定它的质量和稳定性。其他人可以发布有关该项目的更多信息吗?
Just post some references on translating ARM binary to LLVM IR:
disarm - arm binary to llvm ir disassembler
https://code.google.com/p/disarm/
However, I have not tried it, thus not sure about its quality and stability. Anyone else may post additional information about this project?
有一个新项目,处于早期阶段,
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 编译回程序集,以获得具有相同功能的二进制文件。There is new project, being in some early phases, The
libbeauty
:https://github.com/jcdutton/libbeauty
Article about project: Libbeauty: Another Reverse-Engineering Tool, 24 December 2013, Michael Larabel - http://www.phoronix.com/scan.php?page=news_item&px=MTU1MTU
It only supports subset of
x86_64
as input now. One of the project goals - is to be able to compile the generated LLVM IR back to assembly to get the binary with same functionality.