Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.
Revision as of 16:59, 12 January 2022 by Algoflash (talk | contribs)

Le DVD GameCube est au format GCM (renommé en iso) et peut se diviser en 6 parties :

  • boot.bin (Informations de base)
  • bi2.bin (Informations additionnelles)
  • apploader.img (Chargeur de l’exécutable principal)
  • fst.bin (FileStringTable)
  • boot.dol / elf (Exécutable principal)
  • Fichiers

Le fichier dol et la fst peuvent être l'un avant l'autre ou non. On retrouvera cependant souvent le dol avant la fst.


Le format GCReEx comporte les informations suivantes :

sys:
|- apploader.img
|- boot.bin (Information de base)
|- bi2.bin  (Information supplémentaires)
|- fst.bin  (FileStringTable)
\- main.dol ("Executable" DOL)
root:
|- banner.bnr
\+ ALL GAME DATA (AFS, etc)

Le format DiscEx comporte moins d'informations : sys:

|- apploader.img
|- boot.bin (Information de base du jeu)
\- bi2.bin  (Information supplémentaires)
game.iso : Copie repack de l'iso d'origine.

Structure du format GCM/ISO

boot.bin

Le fichier boot.bin est au début du DVD et a une taille de 0x440 octets. On y retrouve :

  • L'offset du fichier boot.dol par rapport au début du DVD, à l'offset boot.bin:0x420.
  • L'offset de la File String Table (fst.bin), à l'offset boot.bin:0x424.
  • La taille de la FST, à l'offset boot.bin:0x428

bi2.bin

Le fichier bi2.bin a une taille de 0x2000 octets et se situe à la suite du fichier boot.bin (donc à l'offset 0x440 de l'iso). Il contient des informations de debug.

boot.dol

Le fichier au format dol est un exécutable compilé pour l'architecture Gekko (powerpc). Son header fait 0x100 octets, et on trouvera la taille totale du dol en additionnant la taille du header et la taille de l'ensemble des 18 sections de celui-ci. A partir de l'offset 0x90, on trouvera 18 uint de 4 octets (big endian) contenant les tailles des 18 sections.

Apploader

L'apploader est un fichier, lancé par le BIOS de la GameCube (aussi appelé l'Initial Program Loader / IPL), qui permet de créer les différents espaces mémoires pour lancer l'exécutable du jeu (généralement au format dol). Il se situe à l'offset 0x2440, à la suite du fichier bi2.bin. Il portera un nom différent selon les programmes que l'on utilisera pour ouvrir l'image DVD du jeu : AppLoader.ldr / apploader.img (dolphin Emulator) etc.

La taille de l'apploader se calcul à partir de son header :

  • apploader_size à l'offset 0x14, donc à l'offset 0x2454 de l'iso GCM.
  • trailer_size à l'offset 0x18, donc à l'offset 0x458 de l'iso GCM. La trailer_size est un espace reservé à d'éventuelles évolutions de l'apploader.

Dolphin emulator trouve la taille en additionnant la taille de l'apploader et de son trailer et en y ajoutant 32 octets.

File String Table

La FST permet de packer l'arborescence de fichiers et de dossiers du jeu dans la suite de l'iso. Elle se divise en deux blocks :

  • Le premier contient les entrées de la FST (dossiers et fichiers). (Big endian)
  • Le second, le name_block, contient tous les noms des dossiers et des fichiers chacun terminés par un NULL byte (0x00). (Little endian)

Dans la première partie, on indexera tous les dossiers et les fichiers à partir du numéro 1. Chaque dossier ou fichier est traduit en 12 octets, et la toute première entrée est le nœud racine, portant l'index 0.

Les 12 octets d'une entrée pour un dossier :

  • 1 octet pour le type, dossier=0x01.
  • 3 octets uint pour l'offset du nom dans le name_block, commençant à l'offset 0 au début du name_block.
  • 4 octets uint pour l'index du dossier parent.
  • 4 octets uint pour l'index du dossier ou fichier suivant.

Les 12 octets d'une entrée pour un fichier :

  • 1 octet pour le type, fichier=0x01.
  • 3 octets uint pour l'offset du nom dans le name_block, commençant à l'offset 0 au début du name_block.
  • 4 octets uint pour l'offset du fichier par rapport au début de l'iso GCM.
  • 4 octets uint pour la taille du fichier.

Le nœud racine se situe au tout début de la fst, c'est un dossier avec les 3 octets de l'offset du nom et les 4 octets du dossier parent à 0x00. L'index du fichier suivant est égal au nombre total de dossiers et de fichiers du DVD. On trouvera alors l'offset du name_block en multipliant cet index par 12 et en y ajoutant 12 (taille du nœud racine).

L'alignement de l'ensemble des fichiers est important lors de la construction du boot.bin et de la fst. En effet, on alignera par exemple sur 4 octets, l'iso GCM ne fonctionnant pas au cas contraire.

Les DVD GCM JAP contiennent des caractères non utf-8 dans le name_block. L'application gcmtool.py, permettant de parser les iso GCM et de les patcher ne prends pas en charge ces jeux là. Dolphin Emulator extraira les fichiers en traduisant le charset original en utf-8.

Le tris des dossiers et fichiers est non sensible à la casse (tous les noms en majuscules), et fait apparaître les caractères spéciaux avant les lettres.

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.

gcmtool.py

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.

AFS Packer

AFS Packer est simple d'utilisation et fonctionnel. Ce logiciel permet d'extraire et patcher les fichier au format afs.
Open source & licence MIT.

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.

AFS Explorer

On évitera d'utiliser AFS Explorer dans les projets quand AFS Packer 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

L'ISO repack diffère de l'ISO originale, il est à déterminer ce qui cause cette différence. 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.

GC Rebuilder 1.1

Attention, ce projet n'est plus développé, et génère des fichiers à priori corrompus (exécutable principal par exemple). Code source : https://github.com/bsv798/gcrebuilder