【问题标题】:Translation of machinecode into LLVM IR (disassembly / reassembly of X86_64. X86. ARM into LLVM bitcode)将机器码翻译成 LLVM IR(将 X86_64.X86.ARM 反汇编/重新组装成 LLVM 位码)
【发布时间】:2015-08-06 23:29:45
【问题描述】:

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

你有什么建议?

【问题讨论】:

  • 我检查了 llvm-objdump,但据我了解,它产生 x86_64/x86 汇编器 - 我想要的是 LLVM 汇编器。
  • 有很多针对 x86_86、x86、arm 的反汇编程序。也许一些带有目标“LLVM IR”的汇编编译器?
  • 那不是反汇编,那是翻译!
  • 至少对于您问题的 X86 部分,有blog.llvm.org/2010/01/x86-disassembler.html

标签: translation llvm assembly disassembly opcode


【解决方案1】:

mcsema 是一个生产质量的二元升降器。它采用 x86 和 x86-64 并将其静态“提升”到 LLVM IR。它得到积极维护,获得 BSD 许可,并拥有大量测试和文档。

https://github.com/trailofbits/mcsema

【讨论】:

  • 但它需要 IDA 的 PRO 许可证
【解决方案2】:

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

【讨论】:

  • 我看到你有 mentioned here 另一个 paper 与 x86 -> LLVM 翻译有关。感谢您的精彩参考。
  • 我提供的链接有问题。 git clone https://dslabgit.epfl.ch/git/s2e/s2e.git 无法克隆:/.
  • 我在 Ubuntu 10.10 上没有任何问题。确保您已安装 git 并正确的防火墙/代理设置。您也可以在项目网站 s2e.epfl.ch/embedded/s2e/index.html 上找到一些相关文档
  • 好的,现在可以了。可能是暂时的网络问题或服务器停机时间短。我很想尽快看看 RevGen :)。
  • 您好 osgx,您可以在 /tools/tools/static-translator 找到它。
【解决方案3】:

关于@bsa2000 提到的RevGen 工具,这篇最新论文"A compiler level intermediate representation based binary analysis and rewriting system" 指出了S2E 和Revinc 中的一些限制。

我把它们拉出来。

  1. 动态翻译的缺点:

    S2E [16] 和 Revnic [14] 提出了一种动态翻译的方法 使用 QEMU 从 x86 到 LLVM。与我们的方法不同,这些方法转换 动态到 LLVM 的代码块,这限制了 LLVM 的应用 一次只分析一个块。

  2. IR 不完整:

    Revnic [14] 和 RevGen [15] 通过合并翻译的 块,但恢复的 IR 不完整,仅对 当前执行;因此,各种整体方案分析将 提供不完整的信息。

  3. 没有抽象堆栈或推广信息

    此外,翻译后的代码保留了 关于堆栈布局的原始二进制文件。他们不提供任何 获取抽象堆栈或提升内存位置的方法 符号,这对于几个应用程序是必不可少的 源级分析。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • LLVM 能够捕获高级信息,恕我直言,这不是必需的。我相信可以存在解决方案-也许不是一种通用方法,但仍然存在。感谢伟大的参考:llvm-qemu 和 libcpu 看起来很有趣。 :)
    • 顺便说一句。如果有is possible LLVM to Javascript trsnalation and it's actually implemented,也可以进行另一个组装;)。问题,你什么时候会这样做:)。
    【解决方案5】:

    只需发布一些关于将 ARM 二进制文件转换为 LLVM IR 的参考资料:

    disarm - 将二进制文件武装到 llvm ir 反汇编程序

    https://code.google.com/p/disarm/

    但是,我没有尝试过,因此不确定它的质量和稳定性。其他人可以发布有关此项目的其他信息吗?

    【讨论】:

    • 好像作者撤了。。。幸好我有本地svn备份它的代码。
    【解决方案6】:

    有一个新项目,处于早期阶段,libbeautyhttps://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 编译回程序集,以获取具有相同功能的二进制文件。

    【讨论】:

    • 项目看起来不错!谢谢!
    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2022-07-25
    • 2015-09-28
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多