该项目的目的是实施由通过明确定义的界面相互作用的独立组件组成的反编译管道,如项目设计文档中的进一步描述。
git clone https://github.com/decomp/decomp
cd decomp
go install -v ./...请参阅示例/演示中的示例用法,以及有关更多详细信息的评论。
从高级的角度来看,分解管道的组件在概念上分为三个模块。首先,前端将源语言(例如x86汇编)转换为LLVM IR;独立于平台的低级中间表示。其次,中端结构LLVM IR通过识别高级控制流原始素(例如预测试环,2向条件)。最后,后端将结构化的LLVM IR转换为高级目标编程语言(例如GO)。
以下海报总结了分解管道的当前功能,使用独立组件的组成来翻译LLVM IR进行。
将机器代码(例如X86组件)转换为LLVM IR。
第三方前端组件。
对LLVM IR执行控制流分析,以识别高级控制流原始原始(例如预测试循环)。
https://godoc.org/github.com/decomp/decomp/cmd/ll2dot
控制流程图生成工具。
从LLVM IR组件( *.ll-> *.dot)生成控制流程图。
https://godoc.org/github.com/decomp/decomp/cmd/restructure
控制流恢复工具。
从控制流图( *.dot-> *.json)中恢复控制流原始。
将结构化的LLVM IR转换为高级目标语言(例如GO)。
https://godoc.org/github.com/decomp/decomp/cmd/ll2go
GO代码生成工具。
分配LLVM IR组件以获取源代码( *.ll-> *.go)。
https://godoc.org/github.com/decomp/decomp/cmd/go-post
转到后处理工具。
后处理GO源代码使其更加惯用( *.go-> *.go)。
版本0.2的主要重点:项目范围的汇编速度。
开发不合格组件应该很有趣。
取决于巨大的C ++库与开发不合格组件的乐趣之间似乎存在反相关性。
解码管道的0.2版通过利用纯GO编写的LLVM IR库来解决此问题。在此发布之前,项目范围内的汇编可能需要几个小时才能完成。现在,他们在不到1分钟的时间内完成 - 所有将来发行的硬限制。
初始版本。
版本0.1的主要重点:组成译本。
分解器应是可组合的和开源的。
分解管道应由单个组件组成,每个组件都有一个目的和明确定义的输入和输出。
Decomp项目的0.1版探讨了由独立组件组成的分解管道的可行性,以及将这些组件暴露于最终用户的潜力。
有关进一步的背景,请参阅使用LLVM IR设计文档的构图解说。
版本0.3的主要重点:类型感知的二进制提升。
分解器依靠高质量的二进制提升。
二进制提升前端的输出IR质量从根本上决定了整个代偿管道的产出质量。
版本0.3旨在通过实施类型感知的二进制提升前端来提高输出LLVM IR的质量。
版本0.4的主要重点:控制流分析。
分解器应恢复高水平的控制流原语。
低水平组件和高级源代码之间的主要区别之一是使用高级控制流原始图。例如1路,2路和N向条件( if , if-else和switch ),预测试循环( while do-while )。
版本0.4旨在使用强大的控制流分析算法恢复高级控制流原始。
版本0.5的主要重点:容错。
分解器应该是强大的。
解说组件应对意外状态和不完整的分析做出良好的反应。
版本0.5专注于稳定性,并试图使用半真实世界软件(请参阅挑战性问题系列)来测试解码管道。
版本0.6的主要重点:数据流分析。
版本0.7的主要重点:类型分析。