Retargetable Decompiler,即反编译器前端用DSL(Domain Specific Language)/ADL(Architecture Description Language)实现了前端汇编指令的语义转化成中端指令,再定义处理器相关的编译器相关(ABI、Endian等),反编译器中端和后端几乎不用修改就能反编译该处理器的汇编指令,也就意味着,假设某二进制程序能被反汇编,Retargetable Decompiler则使它也能够被反编译。
用来生成代码的程序可被称为metaprogram(元程序),编写这种程序就称为metaprogramming(元编程)。
反编译器的前端DSL/ADL可称为元程序,通常需要考虑实现Disassemblers, Simulators/Emulators,Assemblers, 尤其是Disassemblers和Simulators/Emulators的实现。
当前有以下几种ADL语言:
NJMCT(New Jersey Machine Code Toolkit)使用的ADL程序,用函数式语言SML/NJ实现,并且用了一个非常奇怪的程序Icon。
反编译器Boomerang使用的ADL程序,用Lex/Yacc实现。
LLVM的代码生成工具,具有部分C++语言模板特性和函数式语言特性,根据此工具有了反汇编引擎Capstone和汇编引擎Keystone,由于该工具不支持Simulators/Emulators,因此Unicorn基于QEMU实现。
Binutils部分处理器的代码生成工具,用函数式语言Scheme实现,CGEN采用Guile运行环境,应该可以采用更流行的Racket,Chicken等。
Ghidra使用的ADL程序,继承扩展于SLED。在Java端用Antlr3实现,在C++端用Lex/Yacc实现,关于Assemblers的实现,Ghidra独自实现了LR语法分析工具。如果要改进SLEIGH的ADL文法实现,由于Antlr4 文法和实现分离,可以用Antlr4统一SLEIGH在Java和C++的ADL文法实现。
GDB的IGEN生成虚拟机的Semantics,GCC的代码生成工具等。
根据CGEN已实现的ADL描述来实现SLEIGH的处理器ADL。
Fujitsu FR30/FR80/FR81常应用于相机的主控制器,少量应用于汽车的ECU。本文根据CGEN的fr30.cpu部分实现SLEIGH的FR.sinc/FR.slaspec。
VM Context定义CGEN实现。
VM Context定义SLEIGH实现,VM Context标志位寄存器每个标志位不使用位域表示,而是每个位一个字节。虚拟机状态变量好像非必须。
指令位域定义CGEN实现,CGEN好像是用低位在前获取Instruction Fileds,不知道是不是和Instruction Endian相关。
指令位域定义SLEIGH实现,SLEIGH好像是用高位在前获取Instruction Fileds,不知道是不是和Instruction Endian相关。
指令操作数格式定义CGEN实现。
指令操作数格式定义SLEIGH实现,当前操作数格式只部分实现了以下三种(图片来自FR81用户手册):
常见的二元运算指令定义CGEN实现
常见的二元运算指令定义SLEIGH实现,语义转化有可能出错。
条件跳转指令定义CGEN实现
到底是用逻辑运算指令还是位运算指令实现条件跳转指令时标志位的计算?Ghidra官方类似的一些处理器实现是用逻辑运算指令,感觉要用位运算指令,好像有问题。
另一版本条件跳转指令定义SLEIGH实现,用逻辑运算实现条件跳转指令时标志位的计算,显式生成反编译器中端SSA PHI指令(好像非必须):
Ghidra二进制反编译器是第一个完成度极高的非学术界层面的开源Retargetable Decompiler,与二进制反编译器的事实标准IDA反编译器相比,IDA可能是为了多卖License,公开发行的反编译器却不是Retargetable Decompiler,本来大概价值2至4份License的反编译器卖成了至少价值5份License的价格,变成了一个处理器一个License,有些处理器还分成32位处理器和64位处理器,则需要两个License,需要的处理器反编译器越多,价格越高。Retargetable Decompiler是Ghidra二进制反编译器最大的优势。
好像有一些可视化工具可以编写处理器ADL,然后生成反汇编引擎,Ghidra官方一些处理器sinc/slaspec实现有工具生成的痕迹,有可能NSA内部也有类似的可视化工具用来编写反编译前端ADL,实际上,可视化工具开发可认为是基于模型的开发,是否可以采用Eclipse Modeling Framework+Acceleo实现Eclipse插件,用来可视化编写Ghidra反编译器前端ADL?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-6-18 00:02
被vasthao编辑
,原因: 描述错误更正