2

我花了很多时间阅读 LLVM 源代码树。这是一项令人印象深刻的工程!

无论如何,我一直在尝试将我拥有的一些 MachO Arm 二进制文件转换为 LLVM 位码以进行基本的静态分析。主要是,我想根据使用的寄存器在某些调用上创建反向静态切片。此外,我正在尝试对明显的常量进行前向传播(例如,从符号表中加载函数名并传递给寄存器)。

此时,我已经能够使用以下命令行转储文件并在本机 ARM 程序集中对其进行解析:

    bash-3.2$ llvm-objdump -d ~/code/osx/HelloWorldThin -triple=thumb
    -mattr=+thumb2,+32bit,+v7,+v6t2,+thumb-mode,+neon

    /Users/steve/code/osx/HelloWorldThin:   file format Mach-O arm

    Disassembly of section __TEXT,__text:
    _main:
        2fd4:       f0 b5            push    {r4, r5, r6, r7, lr}
        2fd6:       03 af            add     r7, sp, #12
        2fd8:       4d f8 04 8d      str     r8, [sp, #-4]!
        2fdc:       0d 46            mov     r5, r1
        2fde:       06 46            mov     r6, r0
        2fe0:       00 f0 fe ef      blx     #4092

……剪断了……

这很棒,因为它为我节省了大量编写解析器的时间!

在查看了 MachODump.cpp 之后,我看到这些被降低为 MCInst,从我理解的方式来看,它只是一个带参数的解析操作码。

所以我的问题是:

1)有没有办法从 ARM 转换为 LLVM(用于优化传递等)?不需要回传给ARM,只需要有一个分析结果。

1.5) 我注意到所有的分析操作都是在指令而不是 MCInst 上进行的,有没有办法键入提升并提供所需的信息?

2) 有没有办法模拟/模拟 ARM 或 LLVM 指令?我问是因为像切片和常量传播这样的事情需要数据流分析才能确定内存和寄存器中的内容。

像这样的操作需要跟踪从内存中加载和存储数据的方式以及寄存器。LLVM 能否理解这些分析指令的副作用?

    __text:000032DE                 LDR             R1, [R0] ; "viewDidLoad"
    __text:000032E0                 MOV             R0, SP
    __text:000032E2                 BLX             _objc_msgSendSuper2

3) 如果我似乎对 LLVM 中发生的事情有根本的误解,我希望得到任何反馈。

谢谢,如果我可以提供有关我的问题的更多信息,请告诉我。

4

2 回答 2

2

用于 ARM 二进制文件的静态分析。最好将每条 ARM 指令的语义直接转换为 LLVM IR,并在后者上应用数据流分析。例如,ADD rd, rd, rmARM 中的 an 可以转换为 LLVM IR %rd2 = add i32 %rd1, %rm1

将 ARM 机器代码反编译为 C(为了将其重新编译回 LLVM IR)既麻烦又不必要。请注意,反编译器之类的重点IDA Pro是二进制理解,而不是重新编译本身。因此,您将很难重新编译软件,甚至更难将您的分析结果链接到原始二进制文件。

以下链接可能有用:

  • Fracture是一个开源项目,试图将 ARM 二进制文件直接转换为 LLVM IR。
  • LLBT:是一个将 ARM 转换为 LLVM IR 的研究项目。然而,他们的目标是静态二进制重写而不是二进制分析。

请注意,如果您正在考虑分析剥离的二进制文件,则需要一个强大的反汇编程序。objdump可以在没有符号的二进制文件上发出过多的反汇编错误。

我正处于一个研究项目的早期阶段,我们开发了一种处理器描述语言,可以更容易地在 LLVM IR 中描述指令语义。当我们有更多结果时,我会更新这个答案。

于 2016-01-19T11:18:43.183 回答
0

对于 (1) - 不在 LLVM 的框架内。那里没有“反编译器”。您可以自由使用将机器代码转换为 C 的外部反编译器,然后使用 clang 将其编译为 LLVM IR。YMMV 当然,关于这种翻译的质量。

(1.5) 如果我明白你在问什么,那么不。Instruction并且MCInst是完全不同的动物,在抽象层次上相距甚远。阅读:http ://eli.thegreenplace.net/2012/11/24/life-of-an-instruction-in-llvm/

(2) 是的,LLVM 有一个可以从该lli工具中使用的解释器。它直接“模拟” LLVM IR 而不会降低它。

于 2013-01-30T23:51:28.820 回答