該項目的目的是實施由通過明確定義的界面相互作用的獨立組件組成的反編譯管道,如項目設計文檔中的進一步描述。
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的主要重點:類型分析。