另一個gamecube/Wii解次編譯工具包。
Decomp-toolkit既可以用作開發人員的命令行工具,又可以作為替代分解項目的構建系統的各個部分的替代品。
要在一個新的解放項目中使用,請參見DTK-Template,該項目提供了一個項目結構和構建系統,該系統使用引擎蓋下的Dempoom-toolkit。
匹配分解項目的目的是編寫C/C ++代碼,該代碼與原始遊戲完全相同。這通常需要使用與原始遊戲相同的編譯器。 (對於GameCube和Wii,Metrowerks CodeWarrior)
編譯C/C ++代碼時,編譯器(在我們的情況下, mwcceppc )為每個源文件生成對象文件( .o )。該對象文件包含編譯的計算機代碼,以及鏈接器( mwldeppc )用來生成最終可執行文件的信息。
驗證我們的代碼是一種匹配的一種方法是,將任何已分解的代碼與尚未分解的原始二進制部分鏈接在一起。首先,我們從原始二進制中創建可重新定位的對象:

(大量簡化)
然後,在編寫匹配代碼時,可以將每個對象替換為分解版本。如果鏈接器仍然生成一個與原始字節相同的二進制,那麼我們就會知道,分解代碼是匹配的。
Decomp-ToolKit提供了分析和將原始二進制的對象分析和將鏈接腳本和其他文件鏈接到分解代碼所需的文件的工具。
功能邊界分析
以高精度發現功能邊界。使用各種啟發式方法來消除內部功能控制流的尾巴呼叫。
簽名分析
利用內置簽名數據庫來識別常見的Metrowerks和SDK功能和對象。
這也有助於分解 - 靜止kit自動生成所需的拆分,例如__init_cpp_exceptions 。
搬遷分析
進行控制流分析,並以高精度進行重建重建。
通過進行一些手動調整(主要是在數據中),這將產生完全可移動的對象。
部分分析
根據簽名和搬遷分析的信息自動識別DOL和REL部分。
對象分析
試圖通過分析用法來識別數據對象的類型和大小。
還嘗試識別字符串文字,寬字的文字和字符串表。
分裂
基於用戶配置在內存中生成拆分對象文件。
為了支持.ctors mwldeppc.exe重新鏈接,分析並.dtors extab並自動拆分其相關extabindex 。這樣可以確保鏈接器將正確生成這些部分,而無需任何其他配置。
執行拓撲排序以確定拆分對象的最終鏈路順序。
對象文件編寫
直接寫入對象文件,不需要彙編器。 (BYE DEVKITPPC!)
如果需要,可以選擇地將GNU彙編器兼容的文件與對象文件一起寫入。
鏈接腳本生成
為mwldeppc.exe生成ldscript.lcf 。
從輸入對象創建一個靜態庫(.A)。
$ dtk ar create out.a input_1.o input_2.o
# or
$ echo input_1.o >> rspfile
$ echo input_2.o >> rspfile
$ dtk ar create out.a @rspfile提取靜態庫(.A)文件的內容。
接受多個文件,Glob模式(例如*.a )和響應文件(例如@rspfile )。
選項:
-o , --out <output-dir> :輸出目錄。默認為當前目錄。-v , --verbose :詳細輸出。-q , --quiet :抑制除錯誤以外的所有輸出。 # Extracts to outdir
$ dtk ar extract lib.a -o outdir
# With multiple inputs, extracts to separate directories
# Extracts to outdir/lib1, outdir/lib2
$ dtk ar extract lib1.a lib2.a -o outdirDemangles CodeWarrior C ++符號。一個用於CWDEMANGLE的薄包裝紙。
$ dtk demangle ' BuildLight__9CGuiLightCFv '
CGuiLight::BuildLight () constdisc命令是圍繞NOD庫及其nodtool命令行工具的包裝器。
顯示有關光盤圖像的信息。
要列出光盤映像的內容,請使用VFS LS。
支持的光盤圖像格式:
$ dtk disc info /path/to/game.iso將光盤圖像的內容提取到目錄。
有關支持格式,請參見光盤信息。
筆記
VFS CP更靈活,並支持光盤圖像。
$ dtk disc extract /path/to/game.iso [outdir]默認情況下,僅提取主要數據分區。
使用-p / --partition選項選擇不同的分區。
(選項: all , data , update , channel或分區索引)
將任何受支持的光盤映像轉換為RAW ISO(GCM)。
如果格式是無損的,則輸出將與原始光盤映像相同。
有關支持格式,請參見光盤信息。
$ dtk disc convert /path/to/game.wia /path/to/game.iso哈希磁盤圖像的內容並針對內置的沉積數據庫驗證它。
有關支持格式,請參見光盤信息。
$ dtk disc verify /path/to/game.iso分析DOL文件並輸出信息部分和符號信息。
有關VFS抽象的信息,請參見VFS LS。
$ dtk dol info input.dol
# or, directly from a disc image
$ dtk dol info ' disc.rvz:sys/main.dol '重要的
該命令旨在用作解碼項目的構建系統的一部分。
有關示例項目結構和配置上的文檔,請參見DTK-Template。
根據用戶配置分析並將DOL文件分解為可重新定位的對象。
$ dtk dol split config.yml target簡單的差異工具,用於鏈接的精靈中的問題。 (是的,不是dol。它被錯誤命名。)
試圖找到導致不匹配的最明顯差異。
傳遞項目配置文件,以及鏈接的Elf文件的路徑以進行比較。
$ dtk dol diff config.yml build/main.elf將更新的符號從鏈接的精靈應用於項目配置。 (再次被錯誤命名。)
匹配文件後很有用。它將從最終結果中獲取更新的符號信息。
$ dtk dol apply config.yml build/main.elf從DOL(&RELS)生成初始項目配置文件。
傳遞DOL文件,以及與之鍊接的任何REL文件。
或者,對於Wii Games,請傳遞selfile.sel 。 (不是RSO)
$ dtk dol config main.dol rels/ * .rel -o config.yml從小精靈文件轉輸入矮人1.1信息。 (不支持矮2+)
$ dtk dwarf dump input.elf拆卸一個未折疊的代碼ELF文件。嘗試在可能的情況下自動拆分對象並重建重建。
$ dtk elf disasm input.elf out修復了GNU彙編器構建的對象的問題,以確保與mwldeppc.exe的兼容性。
(asm)後綴。 (用於匹配進度計算) # input and output can be the same
$ dtk elf fixup file.o file.o從提供的Elf文件中創建DOL文件。
$ dtk elf2dol input.elf output.dol
# or, to ignore certain sections
$ dtk elf2dol input.elf output.dol --ignore debug_section1 --ignore debug_section2處理CodeWarrior地圖文件並提供有關符號和TU的信息。
$ dtk map entries Game.MAP ' Unit.o '
# Outputs all symbols that are referenced by Unit.o
# This is useful for finding deduplicated weak functions,
# which only show on first use in the link map.
$ dtk map symbol Game.MAP ' Function__5ClassFv '
# Outputs reference information for Function__5ClassFv
# CodeWarrior link maps can get very deeply nested,
# so this is useful for emitting direct references
# in a readable format.打印有關REL文件的信息。
有關VFS抽象的信息,請參見VFS LS。
$ dtk rel info input.rel
# or, directly from a disc image
$ dtk rel info ' disc.rvz:files/RELS.arc:amem/d_a_tag_so.rel '將DOL文件和關聯的REL合併到單個ELF文件中,適用於您喜歡的逆向工程軟件中的分析。
$ dtk rel info main.dol rels/ * .rel -o merged.elf警告
該命令尚不正常。
打印有關RSO文件的信息。
$ dtk rso info input.rso警告
此命令尚未支持創建SEL文件。
從可重新定位的精靈文件中創建一個RSO文件。
選項:
-o , --output <File> :輸出RSO文件。-m , --module-name <Name> :模塊名稱(或路徑)。默認值:輸入名稱-e , --export <File> :包含導出的符號名稱的文件。 (Newline分離) $ dtk rso make input.elf -o input.rso計算和驗證SHA-1哈希。
$ dtk shasum baserom.dol
949c5ed7368aef547e0b0db1c3678f466e2afbff baserom.dol
$ dtk shasum -c baserom.sha1
baserom.dol: OK解壓縮NLZSS壓縮文件。
$ dtk nlzss decompress input.bin.lz -o output.bin
# or, for batch processing
$ dtk nlzss decompress rels/ * .lz -o rels筆記
VFS LS更靈活,並支持RARC檔案。
現在,此命令等於dtk vfs ls -r input.arc:
列出了RARC(較舊的.arc)存檔的內容。
$ dtk rarc list input.arc筆記
VFS CP更靈活,並支持RARC檔案。
現在,此命令等於dtk vfs cp input.arc: output_dir
提取RARC(較舊的.arc)存檔的內容物。
$ dtk rarc extract input.arc -o output_dir筆記
VFS LS更靈活,並支持U8檔案。
現在,此命令等於dtk vfs ls -r input.arc:
提取u8(新.arc)存檔的內容。
$ dtk u8 list input.arc筆記
VFS CP更靈活,並支持U8檔案。
現在,此命令等於dtk vfs cp input.arc: output_dir
提取u8(新.arc)存檔的內容。
$ dtk u8 extract input.arc -o output_dirDecomp-Toolkit具有功能強大的虛擬文件系統(VFS)抽象,可讓您使用各種容器。所有操作都在記憶中以最小的開銷和沒有臨時文件發生在內存中。
支持的容器:
支持的壓縮格式是透明處理的:
:nlzss ) vfs ls列出了容器或目錄的內容。
選項:
-r , --recursive :遞歸列出內容。-s , --short :僅列出文件名。示例:
# List the contents of the `amem` directory inside `RELS.arc` in a disc image
$ dtk vfs ls ' disc.rvz:files/RELS.arc:amem '
# List the contents of `RELS.arc` recursively
$ dtk vfs ls -r ' disc.rvz:files/RELS.arc: '
# All commands that accept a file path can also accept a VFS path
$ dtk rel info ' disc.rvz:files/RELS.arc:amem/d_a_tag_so.rel '
# Example disc image within a disc image
$ dtk dol info ' disc.rvz:files/zz_demo.tgc:sys/main.dol '有關VFS抽象的信息,請參見VFS LS。
vfs cp將文件和目錄遞歸地複製到主機文件系統。
選項:
--no-decompress :複製時請勿解壓縮文件。-q , --quiet :抑制除錯誤以外的所有輸出。示例:
# Extract a file from a nested path in a disc image to the current directory
$ dtk vfs cp ' disc.rvz:files/RELS.arc:amem/d_a_tag_so.rel ' .
# Directories are copied recursively, making it easy to extract entire archives
$ dtk vfs cp ' disc.rvz:files/RELS.arc: ' rels
# Or, to disable automatic decompression
$ dtk vfs cp --no-decompress ' disc.rvz:files/RELS.arc: ' rels解壓縮YAY0壓縮文件。
$ dtk yay0 decompress input.bin.yay0 -o output.bin
# or, for batch processing
$ dtk yay0 decompress rels/ * .yay0 -o rels使用YAY0壓縮壓縮文件。
$ dtk yay0 compress input.bin -o output.bin.yay0
# or, for batch processing
$ dtk yay0 compress rels/ * -o rels解壓縮YAZ0壓縮文件。
$ dtk yaz0 decompress input.bin.yaz0 -o output.bin
# or, for batch processing
$ dtk yaz0 decompress rels/ * .yaz0 -o rels使用YAZ0壓縮壓縮文件。
$ dtk yaz0 compress input.bin -o output.bin.yaz0
# or, for batch processing
$ dtk yaz0 compress rels/ * -o rels打印有關WAD文件的信息。
$ dtk wad info input.wad筆記
VFS CP更靈活,並支持WAD文件。
現在,此命令等於dtk vfs cp input.wad: output_dir
提取WAD文件的內容。
$ dtk wad extract input.wad -o output_dir驗證WAD文件的內容。
$ dtk wad verify input.wad