100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > linux 中间代码反编译 [原创]反编译原理(2)-中间表示

linux 中间代码反编译 [原创]反编译原理(2)-中间表示

时间:2021-08-28 22:38:28

相关推荐

linux 中间代码反编译 [原创]反编译原理(2)-中间表示

中间语言

通常情况下,反编译器和编译器一样,都分成前端、中端和后端三个部分,每一部分都有1-2种中间语言。如果使用3种中间语言,则前端中间语言定义为Target Dependent HIR,中端中间语言定义为Target Independent MIR,后端中间语言定义为Target Dependent LIR;如果使用4-6种中间语言,则前端中间语言定义为Target Dependent HIR和Target Independent HIR,中端中间语言称为Target Independent VMIR和Target Independent MIR,后端中间语言定义为Target Independent LIR和Target Dependent LIR。中间语言转换过程如下:

Target Dependent HIR → Target Independent HIR(Option) → Target Independent VMIR(Option) → Target Independent MIR → Target Independent LIR(Option) → Target Dependent LIR

表现形式

中间语言主要有三种表现形式:三元式或四元式、DAG、SSA,最常见的表现形式是SSA。

编译器

简单概述GCC和LLVM/Clang两种开源编译器的中间语言。

前端HIR

GCC

C/C++ AST

Target Dependent HIR 称为C/C++ AST

Generic

Target Independent HIR 称为Generic

LLVM/Clang

C/C++ AST

Target Dependent HIR 称为C/C++ AST

中端MIR

GCC

Gimple

Target Independent MIR 称为Gimple

LLVM/Clang

LLVM IR

Target Independent MIR 称为LLVM IR

后端LIR

GCC

RTL/MachineRTL

Target Independent LIR 称为RTL,Target Dependent LIR 称为MachineRTL

ASMInst

ASM LIR (汇编指令)称为ASMInst

LLVM/Clang

SelectionDAG/MachineDAG

Target Independent LIR 称为SelectionDAG,Target Dependent LIR称为MachineDAG

LLVM MIR

Target Independent LIR称为LLVM MIR(LLVM MachineIR)。 LLVM从4.0版本开始,后端LIR新增了MIR(Machine IR),用于未优化编译器的代码生成,未来会用于优化编译器的代码生成

MachineInstr

Target Dependent LIR称为MachineInstr

MCInst

ASM LIR (汇编指令)称为MCInst

总结

GCC

中间语言转化流程如下:

C/C++ AST → Generic → Gimple→ RTL/MachineRTL → ASMInst

LLVM/Clang

中间语言转化流程如下:

C/C++ AST → LLVM IR → SelectionDAG/MachineDAG or LLVM MIR → MachineInstr → MCInst

反编译器

因为反编译是编译的逆过程,也就是说反编译器的前端HIR是编译器的后端LIR,反编译器的中端MIR是编译器的中端MIR,反编译器的后端LIR是编译器的前端HIR,中间语言转化流程如下:

Decompiler Target Dependent HIR(Compiler Target Dependent LIR) → Decompiler Target Independent MIR(Compiler Target Independent MIR/Compiler Target Independent LIR) → Decompiler Dependent LIR(Compiler Dependent HIR)

前端Target Dependent HIR

反编译器前端Target Dependent HIR直接是二进制程序反汇编后的汇编指令。

中端Target Independent MIR

在反编译器实现过程中,中端Target Independent MIR的实现非常重要,当前有非常多的IR可以作为反编译器的中端Target Independent MIR,大概有以下几种类型:

虚拟机/模拟器/仿真机 IR

Qemu TCG

Qemu的中端MIR称为TCG,Qemu已经有20种处理器二进制代码转化成TCG,有5种还有64位的,因此Qemu有25种前端HIR转化成中端MIR的源码实现。

Valgrind VEX

Valgrind的中端MIR称为VEX,Valgrind已经有6种处理器二进制代码转化成VEX,4种还有64位的,因此Valgrind有10种前端HIR转化成中端MIR的源码实现。

二进制逆向分析工具IR

IDA Pro MircoCode

IDA Pro,最好的反汇编工具,闭源,价格昂贵。中端MIR称为MircoCode,它是三元式格式,AT&T-like语法,当前有72条指令。IDA Pro SDK从7.1版本开始,已经有部分中端MIR相关操作的API。

Binary Ninja LLIL

Binary Ninja,类似于IDA Pro的反汇编工具,闭源,价格比IDA Pro便宜。中端MIR称为LLIL,自行了解学习。

Rose Sage III

Rose,类似于IDA Pro的反汇编框架工具,开源。中端MIR称为Sage III,自行了解学习

Radare2 ESIL

Radare2,类似于IDA Pro的反汇编框架工具,开源。中端MIR称为ESIL,自行了解学习

BinNavi REIL

BinNavi,类似于IDA Pro的反汇编界面框架工具,开源。中端MIR称为REIL,自行了解学习

Miasm MIR

Miasm,开源,中端MR有些类似Valgrind VEX,自行了解学习

代码生成器IR

Cretonne IL

Cretonne,用于WASM虚拟机JIT编译器的实现,开源。中端MIR称为Creton IL,类似于LLVM IR,自行了解学习

Firm IL

Firm,可用于编译器的实现,开源,自行了解学习

符号执行IR

Angr IR

Angr,使用Valgrind VEX作为中端MIR,开源,自行了解学习

KLEE IR

KLEE,使用LLVM IR作为中端MIR,开源,自行了解学习

Triton IR

Triton,开源,自行了解学习

编译器IR

LLVM MachineIR/LLVM IR or GCC RTL/GCC Gimple

最好是选择编译器的中端Target Independent MIR或后端Target Independent LIR作为反编译器的中端Target Independent MIR,这样就可以复用控制流分析、数据流分析、优化等相关源码。对于GCC,可以选择GCC Gimple或GCC RTL作为反编译器的Target Independent MIR;对于LLVM,由于反编译器Target Independent MIR采用SSA表现形式,排除SelectionDAG,可以选择LLVM IR或LLVM MachineIR作为反编译器的Target Independent MIR。由于GCC源码使用了大量宏,并没有使用模板,还用很多独有的编译器特性,并不推荐复用其源码,所以,LLVM MachineIR个人觉得是反编译器中端Target Independent MIR的首选,其次是选择LLVM IR作为反编译器的中端Target Independent MIR

反编译器IR

Boomerang SSL

Boomerang,一个完成度很高的开源反编译器,中端MIR称为SSL,自行了解学习。

RetDec MIR

RetDec,开源,采用LLVM IR作为中端MIR,自行了解学习

Hex-Rays Decompiler MIR

IDA Pro反编译插件Hex-Rays Decompiler是反编译器的事实标准,采用IDA Pro官方定义的MircoCode作为中端MIR,自行了解学习

后端Target Dependent LIR

采用编译器的前端Target Dependent HIR。一个C/C++函数源代码经过编译器前端词法和语法分析后生成C/C++ AST,它就是编译器的前端Target Dependent HIR,也是反编译器的后端Target Dependent LIR

总结

综上所述,反编译器中间语言的转化流程如下:

Decompiler Target Dependent HIR(LLVM MCInst or GCC ASMInst) → Decompiler Target Independent MIR(LLVM MachineIR/LLVM IR or GCC RTL/GCC Gimple) → Decompiler Target Dependent LIR (C/C++ AST)

代码生成

一个通用的反编译器最好是可配置的,对于不同处理器平台反编译的实现,它的中端和后端实现几乎可以不用更改,而是在前端转化成二进制代码成中端IR,从而实现反编译。

第4章将说明如何实现从前端的汇编指令Target Dependent HIR语义转化成中端Target Independent MIR。

最后于 -10-4 04:33

被vasthao编辑

,原因:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。