首页
社区
课程
招聘
[原创]反编译原理(2)-中间表示
发表于: 2018-10-4 04:04 14704

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

2018-10-4 04:04
14704

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

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

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

简单概述GCCLLVM/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 称为RTLTarget Dependent LIR 称为MachineRTL

ASMInst

ASM LIR (汇编指令)称为ASMInst

LLVM/Clang

SelectionDAG/MachineDAG

Target Independent LIR 称为SelectionDAGTarget Dependent LIR称为MachineDAG

LLVM MIR

Target Independent LIR称为LLVM MIR(LLVM MachineIR)LLVM从4.0版本开始,后端LIR新增了MIRMachine 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称为TCGQemu已经有20种处理器二进制代码转化成TCG,有5种还有64位的,因此Qemu有25种前端HIR转化成中端MIR的源码实现。

Valgrind VEX

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

二进制逆向分析工具IR

IDA Pro MircoCode

IDA Pro,最好的反汇编工具,闭源,价格昂贵。中端MIR称为MircoCode,它是三元式格式,AT&T-like语法,当前有72条指令。IDA Pro SDK7.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 GimpleGCC RTL作为反编译器的Target Independent MIR;对于LLVM,由于反编译器Target Independent MIR采用SSA表现形式,排除SelectionDAG,可以选择LLVM IRLLVM MachineIR作为反编译器的Target Independent MIR。由于GCC源码使用了大量宏,并没有使用模板,还用很多独有的编译器特性,并不推荐复用其源码,所以,LLVM MachineIR个人觉得是反编译器中端Target Independent MIR的首选,其次是选择LLVM IR作为反编译器的中端Target Independent MIR

反编译器IR

Boomerang SSL

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

RetDec MIR


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

最后于 2018-10-4 04:33 被vasthao编辑 ,原因:
收藏
免费 2
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  junkboy   +2.00 2018/10/04
最新回复 (11)
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持

话说上一篇是  反编译原理(0) …
2018-10-4 09:07
0
雪    币: 28827
活跃值: (6682)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢,同样没找到(1),日后会补更吗?
2018-10-4 13:12
0
雪    币: 61
活跃值: (1046)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
科普好文,赞
2018-10-4 16:28
0
雪    币: 3425
活跃值: (1479)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
5

是不是论坛有BUG?看不到发新帖按钮,需要进入一个贴子后才有,编辑器只有Word和Markdown模式转化按钮、图片插入按钮、添加附件按钮、没有Markdown文件上传按钮?难道需要在PC平台才有完整版的编辑器,移动Android平台编辑器不完全?如图所示:

最后于 2018-10-6 03:29 被vasthao编辑 ,原因:
2018-10-6 03:28
0
雪    币: 3425
活跃值: (1479)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
6

反编译原理(1)-高级编译器设计原理内容比较空洞无物,对于反编译器的开发意义不大,可以从鲸书第1章了解,由于章节编排类似于鲸书目录,所以有了反编译原理(1)-高级编译器设计原理这章。

最后于 2018-10-6 03:38 被vasthao编辑 ,原因:
2018-10-6 03:38
0
雪    币: 15
活跃值: (197)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢,了解一下
2018-10-8 20:36
0
雪    币: 58782
活跃值: (21926)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
8
vasthao 是不是论坛有BUG?看不到发新帖按钮,需要进入一个贴子后才有,编辑器只有Word和Markdown模式转化按钮、图片插入按钮、添加附件按钮、没有Markdown文件上传按钮?难道需要在PC平台才有完整 ...
2018-10-8 21:15
0
雪    币: 413
活跃值: (122)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
9
mark
2018-12-10 14:38
0
雪    币: 83
活跃值: (1092)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
vasthao **反编译原理(1)-高级编译器设计原理**内容比较空洞无物,对于反编译器的开发意义不大,可以从鲸书第1章了解,由于章节编排类似于鲸书目录,所以有了**反编译原理(1)-高级编译器设计原理**这章。
有的是利用 污点分析 来去除混淆  还有的利用符号执行去掉混淆  那么能利用Z3约束求解去掉混淆吗  另外这些方法能去掉乱序吗 不太懂 我想研究一下 哪位大佬提点一下 该如何研究呢
2019-3-19 10:21
0
雪    币: 1359
活跃值: (2430)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
11
内容比较高深,学习中,感谢分享
2019-3-25 10:12
0
雪    币: 2375
活跃值: (433)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
junkboy 支持 话说上一篇是 反编译原理(0) …
clang和gcc,哪个生成的代码更容易被反编译?
2019-3-26 09:27
0
游客
登录 | 注册 方可回帖
返回