使用LLVM解释ARM/MachO以进行分析和优化?

使用LLVM解释ARM/MachO以进行分析和优化?,arm,llvm,static-analysis,slice,mach-o,Arm,Llvm,Static Analysis,Slice,Mach O,我花了大量时间阅读LLVM源代码树。这是一项令人印象深刻的工程 无论如何,我一直在尝试将一些MachO-Arm二进制文件转换为LLVM位代码,以便进行基本的静态分析。主要是,我想根据使用的寄存器,在某些调用上创建向后的静态片。此外,我还尝试向前传播明显的常量(例如,从符号表加载函数名并传递到寄存器) 此时,我已经能够使用以下命令行转储文件并在本机ARM程序集中解析它: bash-3.2$ llvm-objdump -d ~/code/osx/HelloWorldThin -triple=

我花了大量时间阅读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中发生的事情有一个基本的误解,我希望得到任何反馈

谢谢,如果我能提供更多关于我的问题的信息,请告诉我。

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

(1.5)如果我理解你的要求,那就不是了。
指令
MCInst
是完全不同的动物,它们的抽象层次相去甚远。请阅读以下内容:


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

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

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

以下链接可能有用:

  • 是一个开源项目,试图将ARM二进制文件直接转换为LLVM IR
  • :是一个将ARM转换为LLVM IR的研究项目。然而,他们的目标是静态二进制重写,而不是二进制分析
请注意,如果您正在考虑分析剥离的二进制文件,则需要一个健壮的反汇编程序
objdump
会在没有符号的二进制文件上发出太多反汇编错误


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

非常感谢您的回答!为每个ARM指令创建LLVMIR翻译会有任何明显的问题吗?(除了大量的工作)。@SteveHanna我不是这方面的专家,但我认为这是可能的,因为Asm-->C反编译器确实存在。您在这段时间内找到了更多关于这方面的信息吗?我正在寻找你问题1的答案。谢谢