Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

GameCube Tooling: Difference between revisions

No edit summary
No edit summary
Line 19: Line 19:


=== [https://github.com/Virtual-World-RE/NeoGF/tree/main/afstool afstool.py] (Virtual World RE) ===
=== [https://github.com/Virtual-World-RE/NeoGF/tree/main/afstool afstool.py] (Virtual World RE) ===
 
<div class="toccolours mw-collapsible mw-collapsed">
Script Python3 pour unpack/pack/rebuild le format de fichier [[AFS (Format de fichier)|AFS]]. La reconstruction de la Table of content (TOC) et du Filename directory (FD) est possible avec le contrôle de l'ensemble des paramètres possible du format.
Script Python3 pour unpack/pack/rebuild le format de fichier [[AFS (Format de fichier)|AFS]]. La reconstruction de la Table of content (TOC) et du Filename directory (FD) est possible avec le contrôle de l'ensemble des paramètres possible du format.
 
<div class="mw-collapsible-content">
==== Manuel Utilisateur ====
==== Manuel Utilisateur ====
'''Unpack source_afs.afs''' dans le nouveau dossier par défaut ''source_afs''. Si optional_dest_folder est précisé, on unpack dans ''optional_dest_folder''. Si l'AFS comporte un FD, on utilisera la date de modification (mtime) de l'OS pour stocker la date du fichier.
'''Unpack source_afs.afs''' dans le nouveau dossier par défaut ''source_afs''. Si optional_dest_folder est précisé, on unpack dans ''optional_dest_folder''. Si l'AFS comporte un FD, on utilisera la date de modification (mtime) de l'OS pour stocker la date du fichier.
Line 59: Line 59:
==== afs_rebuild.conf ====
==== afs_rebuild.conf ====
Chaque offset ou index est écrit en hexadécimal avec le préfixe '''0x''': 0xabcdef. On utilisera la valeur '''auto''' quand c'est possible.
Chaque offset ou index est écrit en hexadécimal avec le préfixe '''0x''': 0xabcdef. On utilisera la valeur '''auto''' quand c'est possible.
===== [Default] section =====
===== [Default] section =====


Line 86: Line 87:
     '''unknown''' : La valeur est inconnue. On utilisera la valeur Null.
     '''unknown''' : La valeur est inconnue. On utilisera la valeur Null.


==== afs_rebuild.csv''' ====
==== afs_rebuild.csv ====
'''afs_rebuild.csv''' contient des entrées décrivant comment packer les fichiers du dossier '''root''' dans l'AFS. Chaque valeur d'offset ou d'index est stocké en hexadécimal avec le préfixe '''0x''' : 0xabcdef. On utilisera la valeur '''auto''' pour les indexes et offsets quand c'est possible. Les offsets doivent être alignés sur la valeur 0x800 (2048). On mettra une ligne par fichier sélectionné sur lequel on veut ajouter des contraintes pour le pack en utilisante le format : "unpacked_filename/index/offset/packed_filename", par exemple : "dummy (5).bin/0x12/0x80000/dummy.bin". On pourra utiliser la valeur '''auto''', par exemple : "dummy (5).bin/auto/auto/dummy.bin". Pour chaque block vide, on ajoutera seulement un couple offset/length avec des valeurs alignées à 0x800, par exemple : "0x80000/0x5000".
'''afs_rebuild.csv''' contient des entrées décrivant comment packer les fichiers du dossier '''root''' dans l'AFS. Chaque valeur d'offset ou d'index est stocké en hexadécimal avec le préfixe '''0x''' : 0xabcdef. On utilisera la valeur '''auto''' pour les indexes et offsets quand c'est possible. Les offsets doivent être alignés sur la valeur 0x800 (2048). On mettra une ligne par fichier sélectionné sur lequel on veut ajouter des contraintes pour le pack en utilisante le format : "unpacked_filename/index/offset/packed_filename", par exemple : "dummy (5).bin/0x12/0x80000/dummy.bin". On pourra utiliser la valeur '''auto''', par exemple : "dummy (5).bin/auto/auto/dummy.bin". Pour chaque block vide, on ajoutera seulement un couple offset/length avec des valeurs alignées à 0x800, par exemple : "0x80000/0x5000".


Quand on configurera le rebuild, on supprimera toutes les lignes contenant des fichiers qui n'ont pas de contrainte du fichier '''afs_rebuild.csv'''. Ensuite on mettra la valeurs '''auto''' aux offsets et indexes qui n'ont pas de contraintes. Lors du rebuild, le fichier '''filename_resolver.csv''' est automatiquement supprimé. On conservera les changements de noms de fichiers en ajoutant des entrées avec unpacked_filename et index (et packed_filename si le FD est présent) dans ce fichier.
Quand on configurera le rebuild, on supprimera toutes les lignes contenant des fichiers qui n'ont pas de contrainte du fichier '''afs_rebuild.csv'''. Ensuite on mettra la valeurs '''auto''' aux offsets et indexes qui n'ont pas de contraintes. Lors du rebuild, le fichier '''filename_resolver.csv''' est automatiquement supprimé. On conservera les changements de noms de fichiers en ajoutant des entrées avec unpacked_filename et index (et packed_filename si le FD est présent) dans ce fichier.
 
</div></div>
Open source & licence MIT.
Open source & licence MIT.



Revision as of 10:43, 22 April 2022

← Gotcha Force

Outils

Emulateur Dolphin

Dolphin permet l'extraction des fichiers de l'iso GameCube. On pourra l'utiliser en mode debug : Exécution pas à pas des instructions powerpc, breakpoints, inspection / dumps mémoires etc.

Dolphin Memory Engine

Dolphin Memory Engine se sert des dumps dolphin (en mode débug : ajoutez -d lors de l'exécution de dolphin) afin de mettre des noms sur des adresses mémoires fixes lors de l'exécution. Ceci permettra de partager des travaux de reverse engineering sur la mémoire du jeu.

Doku sur la génération de symboles : https://github.com/sepalani/MHTrIDA/wiki/Symbols

Support python pour dolphin emulator

Support python pour le scripting d'IA / CPU. L'api permet entre autre de lire ou écrire en mémoire.

gcmtool.py (Virtual World RE)

gcmtool.py permet de manipuler les fichiers gamecube (format iso GCM). On pourra extraire l'ensemble des fichiers du jeu, ainsi que les fichiers relatif au fonctionnement du format GCM. Sa qualité principale, c'est de permettre de patcher la FST et le fichier boot.bin avec un nouveau fichier boot.dol, un nouvel apploader.img, ainsi que des fichiers du jeu ajoutés, supprimés ou modifiés. Il permet d'aligner l'ensemble des offsets des fichiers selon une valeur passée en argument. On choisira un alignement de 4 par défaut. Les fichiers du DVD sont aussi positionnés de manière optimisée pour réduire la taille de l'iso GCM à son minimum.

Open source & licence MIT.

afstool.py (Virtual World RE)

Script Python3 pour unpack/pack/rebuild le format de fichier AFS. La reconstruction de la Table of content (TOC) et du Filename directory (FD) est possible avec le contrôle de l'ensemble des paramètres possible du format.

Manuel Utilisateur

Unpack source_afs.afs dans le nouveau dossier par défaut source_afs. Si optional_dest_folder est précisé, on unpack dans optional_dest_folder. Si l'AFS comporte un FD, on utilisera la date de modification (mtime) de l'OS pour stocker la date du fichier.

afstool.py --unpack source_afs.afs optional_dest_folder

Pack source_folder dans le nouveau dossier par défaut source_folder.afs. Si optional_dest_file.afs est précisé, on pack dans optional_dest_file.afs. Si l'AFS comporte un FD, on utilisera la date de modification (mtime) de l'OS pour mettre à jour la date du fichier dans l'AFS. La taille maximal de chaque fichier est déterminée par l'offset suivant dans l'AFS (fichier ou fichier système). Sans FD, il n'y a pas de restriction sur la taille du dernier fichier de l'AFS. Les noms dans le FD restent inchangés par cette commande.

afstool.py --pack source_folder optional_dest_file.afs

Reconstruit le système de fichier de l'AFS d'un dossier AFS unpack en utilisant les fichiers afs_rebuild.conf et afs_rebuild.csv. Voir afs_rebuild.conf ci-dessous pour plus d'informations.

afstool.py --rebuild source_folder

Affiche les stats de l'AFSou du dossier unpack de l'AFS. Donne l'ensemble des informations sur le header, la TOC, le FD, l'ensemble du mapping mémoire trié par offsets (fichiers et fichiers systèmes), les informations sur l'espace d'adressage, les noms de fichiers dupliqués groupés par nom.

afstool.py --stats path

Arborescence des fichiers extraits

Le dossier root contient l'ensemble des fichiers de l'AFS.

Le dossier sys contient l'ensemble des fichiers système de l'AFS et les fichiers généré par le programme pour les différentes manipulation de l'AFS :

   tableofcontent.bin - Fichier système TOC : Ce fichier peut être directement édité, ce sera géré par la commande --pack.
   filenamedirectory.bin - Fichier système FD : Ce fichier est créé seulement s'il y a un FD dans l'AFS.
   filename_resolver.csv - Créé quand plusieurs fichiers ont le même nom dans le FD.
   afs_rebuild.conf - Modifier ce fichier pour rebuild l'AFS.
   afs_rebuild.csv - Modifier ce fichier en prenant en compte les configurations du fichier afs_rebuild.conf pour reconstruire l'AFS.

filename_resolver.csv

La commande --pack ne modifie pas les noms dans le FD. Ce fichier est utilisé dans le pack pour détecter automatiquement les fichiers du dossier root qui ont été renommés et permettre de garder leur index initial dans la TOC (et le FD). Ce fichier est généré automatiquement quand :

  • le FD est présent et comporte des doublons dans les noms ; les fichiers extraits sont alors renommés "filename (N).ext" avec N:Entier,
  • le FD est absent, les fichiers sont alors nommés par leur index, par exemple : "00000000" pour le tout premier fichier.

Chaque ligne du csv contient un couple "index/unpacked_filename". On peut utiliser ce csv pour renommer les fichiers, par exemple: "0/my_new_filename.ext".

afs_rebuild.conf

Chaque offset ou index est écrit en hexadécimal avec le préfixe 0x: 0xabcdef. On utilisera la valeur auto quand c'est possible.

[Default] section

AFS_MAGIC : 0x41465300 ou 0x41465320

files_rebuild_strategy : auto, index, offset ou mixed

files_rebuild_strategy est utilisé pour organiser les fichiers (indexes, offsets, nom packés si le FD est présent) dans l'AFS. La stratégie de rebuild utilise le fichiers afs_rebuild.csv généré automatiquement durant l'unpack. Si le fichier du dossier root est absent du fichier afs_rebuild.csv, toutes les valeurs seront alors générées automatiquement. 4 stratégies sont disponibles :

   auto : Rebuild automatiquement tous les indexes et les offsets des fichiers en utilisant packed_filename pour spécifier le nom du fichier dans le FD (s'il est présent). Les indexes et offsets dans le fichier afs_rebuild.csv seront ignorées.
   index : Garde les indexes des fichiers spécifiés (utilise le nom packed_filename si le FD est présent). Les offsets seront ignorés.
   offset : Garde les offsets des fichiers spécifiés (utilise le nom packed_filename si le FD est présent). Les indexes seront ignorés.
   mixed : Garde les indexes et offsets des fichiers spécifiés (utilise le nom packed_filename si le FD est présent).

filename_directory : True si le FD est présent, False sinon. Si la valeur est True, la section [FilenameDirectory] doit être présente.

[FilenameDirectory] section

toc_offset_of_fd_offset : L'offset dans la TOC de l'offset du FD est à la fin de la TOC. Dans certains AFS, on retrouve un pad à la fin de la série d'offset/length. On utilisera la valeur auto quand c'est possible.

fd_offset : Le FD est à la fin de l'AFS. On utilisera la valeur auto quand c'est possible.

fd_last_attribute_type : Le type des 4 derniers octets de chaque entrée du FD. 4 valeurs sont possibles :

   length : On utilise la taille du fichier.
   offset-length : On utilise la série "offset/length/offset/length...".
   0xabcdef : On utilise une constante hexadécimale.
   unknown : La valeur est inconnue. On utilisera la valeur Null.

afs_rebuild.csv

afs_rebuild.csv contient des entrées décrivant comment packer les fichiers du dossier root dans l'AFS. Chaque valeur d'offset ou d'index est stocké en hexadécimal avec le préfixe 0x : 0xabcdef. On utilisera la valeur auto pour les indexes et offsets quand c'est possible. Les offsets doivent être alignés sur la valeur 0x800 (2048). On mettra une ligne par fichier sélectionné sur lequel on veut ajouter des contraintes pour le pack en utilisante le format : "unpacked_filename/index/offset/packed_filename", par exemple : "dummy (5).bin/0x12/0x80000/dummy.bin". On pourra utiliser la valeur auto, par exemple : "dummy (5).bin/auto/auto/dummy.bin". Pour chaque block vide, on ajoutera seulement un couple offset/length avec des valeurs alignées à 0x800, par exemple : "0x80000/0x5000".

Quand on configurera le rebuild, on supprimera toutes les lignes contenant des fichiers qui n'ont pas de contrainte du fichier afs_rebuild.csv. Ensuite on mettra la valeurs auto aux offsets et indexes qui n'ont pas de contraintes. Lors du rebuild, le fichier filename_resolver.csv est automatiquement supprimé. On conservera les changements de noms de fichiers en ajoutant des entrées avec unpacked_filename et index (et packed_filename si le FD est présent) dans ce fichier.

Open source & licence MIT.

doltool.py

Script python 3 qui permet de manipuler le format de fichier dol. Il permet aussi d'obtenir des stats détaillées sur le dol et sa composition, ou encore de patcher un dol en utilisant un fichier d'Action Replay Codes.

Open source & licence MIT.

AFSPacker

AFSPacker est simple d'utilisation et fonctionnel. Ce logiciel permet d'extraire et patcher les fichier au format AFS.

  • AFSPacker considère les 4 derniers octets des entrées du FD comme inconnus. Ces octets sont parfois utilisés pour décrire la taille des fichiers packés.
  • Il n'est pas possible de spécifier l'offset de l'offset de la FD dans la TOC. En effet, cet offset peut être placé directement après la TOC, ou après un padding suite à la TOC. Ceci peut éventuellement être important si l’exécutable principal gère les fichiers avec un offset de fichier hardcodé relatif au début de l'AFS.
  • Les dates ne sont pas gardées lors de l'extraction, ce qui produit une perte de données à chaque repack.

Open source & licence MIT.

AFS Explorer

On évitera d'utiliser AFS Explorer dans les projets quand afstool.py peut être utilisé. En effet, les conditions d'utilisation sont restrictives et la ligne de commande est absente. Les sources ne sont à priori pas accessibles, ce qui est un autre point limitant.

GameCube Iso Tools

Outil de manipulation d'iso GameCube. Permet d'extraire l'iso dans un dossier au format GCReEx ou DiscEx. Permet ensuite de repack dans une ISO.
Note : L'iso repack est automatiquement "compressée" sous windows. Le dossier de destination doit être créé au préalable.

Commandes :
gcit.exe iso.iso -f gcreex -d extract -q
gcit.exe extract\Game_folder -f fulliso -d repack.iso -q

Dolphin Emulator renvoie une erreur sur repack.iso : "repack.iso n'est pas un fichier GCM/ISO valide, ou n'est pas une ISO GC/Wii." Au format GCReEx, on remarque que le padding à la fin de l'apploader est différent de celui généré par Dolphin Emu. De même, de nombreux fichiers sont extraits avec gcit.exe avec un padding ajouté à la fin comparé à la taille réelle indiquée dans le fst.bin du DVD.

Wiimms ISO Tool

wit permet de manipuler les ISO GameCube. Sur windows, on pourra utiliser wit sans passer par l'installation en utilisant le fichier bin/wit.exe.

Extraction des fichiers d'une ISO (au format fst) : wit extract mkw.iso --dest=mkw/

Attention, le rapack dans l'iso via la commande copy ne produit à priori pas la même ISO (fichier de + de 4 Go). A voir si des options permettent de reproduire la bonne ISO.

https://github.com/Wiimm/wiimms-iso-tools

Open source & license GPL v2+.

GC Rebuilder 1.1

Attention, ce projet n'est plus développé, et la taille de l'exécutable principal n'est pas la bonne.

Code source : https://github.com/bsv798/gcrebuilder

La ligne de commande est présente mais aucune documentation précise n'est fournie.

GeckoLoader

Gecko Loader permet de patcher un dol en utilisant une liste d'Action Replay Codes ou de GeckoCodes. Le logiciel permet aussi de Hook des fonctions (VI etc.).

On aura par exemple un patch du .bss avec du bytecode powerpc et des valeurs à patcher. L'EntryPoint est changé pour arriver sur ce nouveau code et après chargement en mémoire le code modifie les valeurs en mémoire.

Ceci est une mauvaise pratique car le .bss contient les variables non initialisées (int a;). Normalement elles doivent être à Null / 0. Aussi pour les codes en écriture seule, on préfèrera patcher quand c'est possible directement les sections .text ou .data du dol.

Open source & licence GPL v3.

Catégorie:GameCube Catégorie:Outils Catégorie:Gotcha Force