Ainda outro kit de ferramentas de descompilação do GameCube/Wii.
Decomp-toolkit funciona tanto como uma ferramenta de linha de comando para desenvolvedores quanto como substituto para várias partes do sistema de construção de um projeto de descompilação.
Para uso em um novo projeto de decomposição, consulte o DTK-Template, que fornece uma estrutura de projeto e um sistema de construção que usa decomp-toolkit sob o capô.
O objetivo de um projeto de decompilação correspondente é escrever o código C/C ++ que compila de volta ao mesmo binário do jogo original. Isso geralmente requer o uso do mesmo compilador que o jogo original. (Para Gamecube e Wii, Metrowerks CodeWarrior)
Ao compilar o código C/C ++, o compilador (no nosso caso, mwcceppc ) gera um arquivo de objeto ( .o ) para cada arquivo de origem. Este arquivo de objeto contém o código da máquina compilado, bem como as informações que o vinculador ( mwldeppc ) usa para gerar o executável final.
Uma maneira de verificar se nosso código é uma correspondência é pegando qualquer código que tenha sido descompilado e vinculando -o ao lado de partes do binário original que ainda não foram descompiladas. Primeiro, criamos objetos relocáveis do binário original:

(Fortemente simplificado)
Em seguida, cada objeto pode ser substituído por uma versão descompilada à medida que o código correspondente é gravado. Se o vinculador ainda gerar um binário que é byte por byte idêntico ao original, sabemos que o código descompilado é uma correspondência.
O decomp-toolkit fornece ferramentas para analisar e dividir o binário original em objetos relocáveis, além de gerar o script do vinculador e outros arquivos necessários para vincular o código descompilado.
Análise de limites da função
Descobra os limites da função com alta precisão. Usa várias heurísticas para desambiguar chamadas de cauda do fluxo de controle da função interna.
Análise de assinatura
Utiliza um banco de dados de assinatura embutido para identificar as funções e objetos comuns de metrowerks e SDK.
Isso também ajuda a Decomp-Toolkit gerar automaticamente divisões necessárias, como __init_cpp_exceptions .
Análise de realocação
Realiza análise de fluxo de controle e reconstrua as realocações com alta precisão.
Com alguns ajustes manuais (principalmente em dados), isso deve gerar objetos totalmente deslocáveis.
Análise de seção
Identifica automaticamente as seções DOL e REL com base em informações da análise de assinatura e realocação.
Análise de objetos
Tentativas de identificar o tipo e o tamanho dos objetos de dados analisando o uso.
Também tenta identificar literais de cordas, literais de cordas largas e tabelas de cordas.
Dividindo
Gera arquivos de objeto dividido na memória com base na configuração do usuário.
Para apoiar o rastreamento com mwldeppc.exe , quaisquer entradas de inspiração .ctors , .dtors , extab e extabindex são analisadas e divididas automaticamente junto com suas funções associadas. Isso garante que o vinculador gere corretamente essas seções sem nenhuma configuração adicional.
Uma classificação topológica é realizada para determinar a ordem final do link dos objetos divididos.
Redação de arquivos de objeto
Grava arquivos de objeto diretamente, sem o assembler necessário. (Bye Devkitppc!)
Se desejado, opcionalmente, grava arquivos compatíveis com assembler GNU ao lado dos arquivos de objeto.
Geração de script de ligação
Gera ldscript.lcf para mwldeppc.exe .
Crie uma biblioteca estática (.A) a partir dos objetos de entrada.
$ 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 @rspfileExtrai o conteúdo dos arquivos da biblioteca estática (.A).
Aceita vários arquivos, padrões globais (por *.a , arquivos de resposta (por exemplo, @rspfile ).
Opções:
-o , --out <output-dir> : diretório de saída. Padrões no diretório atual.-v , --verbose : saída detalhada.-q , --quiet : suprime toda a saída, exceto erros. # 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 outdirSímbolos C ++ Demangles CodeWarrior. Um invólucro fino para CWDemangle.
$ dtk demangle ' BuildLight__9CGuiLightCFv '
CGuiLight::BuildLight () const Os comandos disc são embaladores em torno da biblioteca NOD e sua ferramenta de linha de comando nodtool .
Exibe informações sobre imagens de disco.
Para listar o conteúdo de uma imagem de disco, use VFS LS.
Formatos de imagem de disco suportados:
$ dtk disc info /path/to/game.isoExtrai o conteúdo das imagens do disco para um diretório.
Consulte as informações do disco para formatos suportados.
Observação
O VFS CP é mais flexível e suporta imagens de disco.
$ dtk disc extract /path/to/game.iso [outdir] Por padrão, apenas a partição de dados principal é extraída.
Use a opção -p / --partition para escolher uma partição diferente.
(Opções: all , data , update , channel ou índice de partição)
Converte qualquer imagem de disco suportada em ISO bruto (GCM).
Se o formato estiver sem perdas, a saída será idêntica à imagem do disco original.
Consulte as informações do disco para formatos suportados.
$ dtk disc convert /path/to/game.wia /path/to/game.isoHashes o conteúdo de uma imagem de disco e a verifica em um banco de dados Redump embutido.
Consulte as informações do disco para formatos suportados.
$ dtk disc verify /path/to/game.isoAnalisa uma seção de informações de arquivo DOL e produz informações e símbolos.
Consulte o VFS LS para obter informações sobre a abstração do VFS.
$ dtk dol info input.dol
# or, directly from a disc image
$ dtk dol info ' disc.rvz:sys/main.dol 'Importante
Este comando deve ser usado como parte do sistema de construção de um projeto de decomposição.
Para um exemplo de estrutura do projeto e para documentação sobre a configuração, consulte DTK-TEMPLATE.
Analisa e divide um arquivo DOL em objetos relocáveis com base na configuração do usuário.
$ dtk dol split config.yml target Ferramenta de diferença simples para problemas em um elfo vinculado. (Sim, não Dol. É indigno.)
Tenta encontrar a diferença mais óbvia causando uma incompatibilidade.
Passe o arquivo de configuração do projeto e o caminho para o arquivo ELF vinculado para comparar.
$ dtk dol diff config.yml build/main.elfAplica símbolos atualizados de um ELF vinculado à configuração do projeto. (Novamente, mal nomeado.)
Útil depois de corresponder a um arquivo. Ele puxará informações de símbolos atualizadas do resultado final.
$ dtk dol apply config.yml build/main.elfGera um arquivo de configuração do projeto inicial de um DOL (& rels).
Passe o arquivo DOL e todos os arquivos REL vinculados a ele.
Ou, para jogos Wii, passe no selfile.sel . (Não RSOS)
$ dtk dol config main.dol rels/ * .rel -o config.ymlDumps Dwarf 1.1 Informações de um arquivo ELF. ( Não suporta o anão 2+)
$ dtk dwarf dump input.elfDesmonte um arquivo ELF não amarrado. Tentativas de dividir objetos e reconstruir automaticamente as realocações quando possível.
$ dtk elf disasm input.elf out Corrige os problemas com objetos construídos com assembler GNU para garantir a compatibilidade com mwldeppc.exe .
(asm) ao símbolo do arquivo. (Para corresponder o cálculo de progresso) # input and output can be the same
$ dtk elf fixup file.o file.oCria um arquivo DOL do arquivo ELF fornecido.
$ dtk elf2dol input.elf output.dol
# or, to ignore certain sections
$ dtk elf2dol input.elf output.dol --ignore debug_section1 --ignore debug_section2Processa arquivos de mapa CodeWarrior e fornece informações sobre símbolos e TUs.
$ 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.Imprima informações sobre um arquivo REL.
Consulte o VFS LS para obter informações sobre a abstração do VFS.
$ 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 'Mescla um arquivo DOL e associado ao Rels em um único arquivo ELF, adequado para análise em seu software de engenharia reversa favorita.
$ dtk rel info main.dol rels/ * .rel -o merged.elfAviso
Este comando ainda não está funcional.
Imprima informações sobre um arquivo RSO.
$ dtk rso info input.rsoAviso
Este comando ainda não suporta a criação de arquivos SEL.
Cria um arquivo RSO a partir de um arquivo ELF realocável.
Opções:
-o , --output <File> : Oput RSO Arquivo.-m , --module-name <Name> : nome do módulo (ou caminho). Padrão: Nome de entrada-e , --export <File> : Arquivo contendo nomes de símbolos exportados. (Newline separado) $ dtk rso make input.elf -o input.rsoCalcule e verifique os hashes SHA-1.
$ dtk shasum baserom.dol
949c5ed7368aef547e0b0db1c3678f466e2afbff baserom.dol
$ dtk shasum -c baserom.sha1
baserom.dol: OKDescompra arquivos compactados por NLZSS.
$ dtk nlzss decompress input.bin.lz -o output.bin
# or, for batch processing
$ dtk nlzss decompress rels/ * .lz -o relsObservação
O VFS LS é mais flexível e suporta arquivos da RARC.
Este comando agora é equivalente ao dtk vfs ls -r input.arc:
Lista o conteúdo de um arquivo RARC (mais antigo .arc).
$ dtk rarc list input.arcObservação
O VFS CP é mais flexível e suporta arquivos da RARC.
Este comando agora é equivalente ao dtk vfs cp input.arc: output_dir
Extrai o conteúdo de um arquivo RARC (mais antigo .arc).
$ dtk rarc extract input.arc -o output_dirObservação
O VFS LS é mais flexível e suporta arquivos U8.
Este comando agora é equivalente ao dtk vfs ls -r input.arc:
Extrai o conteúdo de um arquivo U8 (mais recente .arc).
$ dtk u8 list input.arcObservação
O VFS CP é mais flexível e suporta arquivos U8.
Este comando agora é equivalente ao dtk vfs cp input.arc: output_dir
Extrai o conteúdo de um arquivo U8 (mais recente .arc).
$ dtk u8 extract input.arc -o output_dirO Decomp-Toolkit possui uma abstração poderosa de sistema de arquivos virtual (VFS) que permite trabalhar com uma variedade de contêineres. Todas as operações acontecem na memória com sobrecarga mínima e nenhum arquivo temporário.
Recipientes suportados:
Os formatos de compressão suportados são tratados de forma transparente:
:nlzss no caminho) vfs ls lista o conteúdo de um contêiner ou diretório.
Opções:
-r , --recursive : liste recursivamente o conteúdo.-s , --short : apenas listar nomes de arquivos.Exemplos:
# 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 'Consulte o VFS LS para obter informações sobre a abstração do VFS.
vfs cp copia arquivos e diretórios recursivamente para o sistema de arquivos host.
Opções:
--no-decompress : Não descompacte os arquivos ao copiar.-q , --quiet : suprime toda a saída, exceto erros.Exemplos:
# 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: ' relsDescompra arquivos compactados por YAY0.
$ dtk yay0 decompress input.bin.yay0 -o output.bin
# or, for batch processing
$ dtk yay0 decompress rels/ * .yay0 -o relsCompressa os arquivos usando a compactação YAY0.
$ dtk yay0 compress input.bin -o output.bin.yay0
# or, for batch processing
$ dtk yay0 compress rels/ * -o relsDescompacte arquivos comprovados por YAZ0.
$ dtk yaz0 decompress input.bin.yaz0 -o output.bin
# or, for batch processing
$ dtk yaz0 decompress rels/ * .yaz0 -o relsCompressa os arquivos usando a compactação YAZ0.
$ dtk yaz0 compress input.bin -o output.bin.yaz0
# or, for batch processing
$ dtk yaz0 compress rels/ * -o relsImprima informações sobre um arquivo WAD.
$ dtk wad info input.wadObservação
O VFS CP é mais flexível e suporta arquivos WAD.
Este comando agora é equivalente ao dtk vfs cp input.wad: output_dir
Extrai o conteúdo de um arquivo WAD.
$ dtk wad extract input.wad -o output_dirVerifica o conteúdo de um arquivo WAD.
$ dtk wad verify input.wad