另一个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