La FAQ de Moogle sur le hack PSX


1. Introduction
2. La base de tout : des 1 et des 0
3. Les secteurs, ou comment s'organise un CD
4. La FAT, ou comment s'organise une arborescence de fichiers
5. Et en pratique on fait comment ?
6. Guide de référence des outils
7. Crédits et remerciements


1. Introduction

Comment est née cette FAQ ?
L'idée de cette FAQ est née pendant les débuts du projet de la traduction de Final Fantasy Tactics. En voyant les projets de traduction de Chrono Cross et Legend of Mana, Le Boss m'a proposé de faire une trad de ce jeu, et il avait déjà trouvé quelques morceaux de texte sur le CD du jeu.Son idée était de modifier les fichiers contenant lestextes et de créer un nouvel ISO à partir des fichiers contenussur le CD et ceux modifiés, mais après plusieurs essais, ils'est avéré que cette méthode ne fonctionnait pas (à moins que je soit trop nul pour ça, ce qui est bien possible). C'est pourquoi j'ai pensé qu'il était nécessaire de trouver une autre méthode pour modifier ces fichiers, sans avoir à hackerl'ISO entier. Après avoirtravaillé sur cette nouvelle méthode(en partant de rien, la documentation étant très rare), je mesuis retrouvé chef de projet pour la trad de F

Quel jeu vais-je pouvoir hacker ?
FF Tactics, bien sûr (mais la trad est déjà en cours, désolé), ainsi que pas mal de jeux, mais pas tous. Pour savoir si vous pouvez utiliser cette méthode, insérez le CD du jeu à hacker dans votre lecteur CD ROM et regardez les fichiers qui s'y trouvent. Si vous voyez plein de petits fichiers, de préférence dans des répertoires, alors il ne devrait pas y avoir de problèmes pour appliquer cette méthode. Si vous voyez un gros fichier qui occupe presque tout le CD et deux petits à côté, ou pire, seulement deux petits fichiers (comme c'est le cas pour Chrono Cross), vous risquez d'avoir de sérieux problèmes avec cette méthode. Je chercheraispeut-être comment faire un jour, qui sait... En attendant,il va falloirfaire sans moi.

De quoi ai-je besoin ?
Pour commencer, prenez un PC sous Windows. Pour les accros du pingouin, il est nécessaire de recompiler les programmes que j'ai conçus. Ensuite, vous aurez besoin de cette fameuse suite d'outils en ligne de commande :
Sector Insert
Sector Extract
Sector Add
Sector Creator
Ces outils sont dispos avec leurs sources (pour pouvoir les modifier ou les compiler sur un autre système que Windows) sur le site de Génération 9.
Il serait aussi bon de s'équipper d'un éditeur hexadécimal tel que Hex Workshop, ainsi que de CDRWin (ou tout autre logiciel capable de créer un ISO).
Je vous conseille aussi CD Mage, un programme très utile pour manipuler les ISO.
Enfin, des connaissances en romhacking sont nécessaires, en tout cas si vous souhaitez traduire.


2. La base de tout : des 1 et des 0

Comme chacun sait, l'informatique fonctionne en binaire : tout est une suite de bits, de 1 et de 0. On regroupe ces bits par 8, ce qui donne des octets. Jusqu'ici, rien de bien compliqué, je pense que pas mal de monde sait ça. Un octet contient donc une valeur comprise entre 0 et 255 (2 puissance 8). Pour noter ces valeurs, on utilise le code hexadécimal, c'està dire une écriture des nombres en base 16. Au lieu d'utiliserles 10 chiffres de 0 à 9, on en utilise 16, de 0 à 9 puis A,B, C, D, E et F. On compte donc les chiffres de 0 à 9 normalement,puis A pour 10, B pour 11... jusqu'à F pour 15, puis 10 pour 16. Lesnombres de 0 à 255 vont donc de 0 à FF en hexadécimal.C'est plutôt cool, ça tombe pile ! Normal, c'est pour çaqu'on utilise l'hexa.
Comme le sujet de cette FAQ est le hack d'un ISO de CD, sachez que celui-ci n'est rien d'autre qu'une suite d'octets. Combien ? Beaucoup ! Dans la suite de cette FAQ, on utilisera toujours des nombres hexadécimaux pourreprésenter les octets.


3. Les secteurs, ou comment s'organise un CD

Afin de simplifier l'organisation d'un CD, on regroupe les octets par groupes appelés des secteurs. C'est un peu l'équivalent des clusters sous Windows, ou des inodes sous Unix. Un CD se compose donc d'une suitede secteurs numérotés de 0 à beaucoup. Il existe plusieurs formats de CD, nous n'étudierons ici que celui utilisé pour les CD PSX, surtout que je n'ai pas cherché à comprendre comment fonctionnent les autres. Chaque secteur fait très exactement 2352octets. Pour vous en convaincre, regardez la taille de votre ISO et divisezla par 2352, vous obtiendrez un chiffre rond, qui correspond au nombre desecteurs de votre ISO. Chaque secteur commence par 24 octets d'en-tête(ou header). Cet en-tête commence toujours par 00 FF FF FF FF FF FFFF FF FF FF 00. Ensuite, on trouve le numéro de l'header codésur 4 octets, puis 8 octets pour le sub-header (sous en-tête).

Pour calculer le numéro d'un header, c'est assez compliqué. Le dernier octet est toujours 02. Le premier numéro de secteur (0) est codé par 00 02 00 02. Le suivant (1), par 00 02 01 02, puis 00 02 02 02, etc... Là ou ça se corse, c'est quand on arrive à 00 02 09 02 (le secteur 9). On passe ensuite à 00 02 10 02. Logique ? Non, on est en hexadécimal ! On aurait dû avoir 00 02 0A 02 ! Il va donc falloir faire du décimal en hexa (ça se dit ça ?), ce qui complique un peu les choses. On continue donc jusqu'à 00 02 74 02, et de là, on passe à 00 03 00 02. Pourquoi ne pas avoir continué jusqu'à 00 02 99 02 ? Je n'en sais rien. Reprenons à 00 03 00 02. Ensuite vient 00 03 01 02... Jusqu'à 00 03 74 02, puis 00 04 00 02... Et ainsi jusqu'à 00 59 74 02. Précisons que le deuxième octet est lui aussi codé en "décimal en hexa" (on utilise pas les lettres du code hexa). On passe alors à 01 00 00 02. Et tout s'enchaîne de la même façon. Si vous examinez les sources de Sector Creator, vous remarquerez qu'un petit bout du code calcul cet header tout seul. A vous de l'utiliser comme vous le souhaitez : dans vos propres programmes ou pour comprendre les explications pas très claires qui précèdent.

Revenons à notre header, et plus précisément au sous-header. Il diffère selon le contenu du secteur. Voici quelques formats pour le sous-header :
00 00 08 00 00 00 08 00 : le secteur contient un fichier de données
00 00 89 00 00 00 89 00 : le secteur contient la fin d'un fichier
00 00 20 00 00 00 20 00 : le secteur ne contient rien
Il existe d'autres formats mais je ne les connais pas tous, à vous de chercher si vous en avez besoin.

Les 2048 octets qui suivent le header contiennent des données : fichier, piste audio, morceau de la FAT... Enfin bref, c'est le coeur du secteur,et la zone que l'on va chercher à modifier. Suivent ensuite 280 octets qui représentent l'ECC (Error Correction Code). Ils sont calculés en fonction du contenu du secteur, donc si vous y apportez des modifications, il faudra le recalculer. CD Mage s'occupe de ça sans problèmes.

Comment sont rangés les fichiers dans ces secteurs ? Comme on le verra dans le chapitre suivant, un fichier est représenté principalement par 2 attributs essentiels : sa taille et son numéro de secteur (il en existe d'autres comme la date, mais ça, on s'en fout). Le numéro de secteur désigne le premier secteur qui contient le fichier. Par exemple, prenons un fichier de 5000 octets, dont le numéro de secteur est 2000. Le secteur 2000 va donc contenir les 2048 premiers octets du fichier dans sa zone de données. Le secteur 2001, quant à lui, contiendra les 2048 octets suivants, et le secteur 2002, les 904 derniers octets (il aura comme sous-header 00 00 89 00 00 00 89 00). Le reste de la zone de données du secteur 2002 sera rempli de 00.


4. La FAT, ou comment s'organise une arborescence de fichiers

Les informations sur les fichiers ont besoin d'être stockées quelque part, et c'est dans la FAT qu'on trouvera tout ca. Les informations à stockées sont assez nombreuses (date et heure, attributs...), mais seules 3 seront vraiment utiles : le nom, la taille et le numéro de secteur. Pour trouver cette FAT, il est nécessaire d'extraire les premiers secteurs de l'ISO. Par exemple, voilà ce que contient le secteur 18 de l'ISO de FF Tactics :

Secteur 18

On remarque qu'il y a le nom des répertoires contenus sur le CD. On va donc chercher à retrouver leur contenu. Essayons par exemple avec le répertoire EVENT (en rouge). Les 4 octets en vert correspondent au numéro de secteur de ce répertoire, mais à l'envers (en codage Big Endian pour ceux qui connaissent).
On va donc extraire ce secteur (1683 en décimal). Voilà ce que donne le début du secteur :

Secteur 1683

On y retrouve bien le contenu du répertoire. Il nous faut maintenant rechercher les informations sur les fichiers. Prenons par exemple le premier, ATCHELP.LZW (en rouge). En vert, on retrouve sa taille (90325 octets), celle-ci étant écrite à l'envers puis à l'endroit (Big Endian puis Little Endian). Juste devant, on a le numéro de secteur, lui aussi inscrit deux fois. Celui-ci est facilement retrouvé grâce à CD Mage (dans le champ LBA du fichier).


5. Et en pratique on fait comment ?

Prenons un exemple : on veut modifier le fichier ATCHELP.LZW. Tout d'abord, on le récupère simplement sur le CD, on le modifie à la manière de n'importe quelle ROM classique (avec une recherche de table, de compression...). Prenons le cas où le fichier modifié ne fait plus 90325 octets, mais 100325. Le fichier original occupe 90325 / 2048 + 1 = 45 secteurs, et le nouveau en fait 100325 / 2048 + 1 = 49 secteurs. Il est donc impossible de réinsérer le nouveau fichier à son emplacement d'origine puisqu'il écraserais le fichier se trouvant juste après. Il va donc falloir le déplacer dans un espace libre. La plupart des CDs ne sont pas entièrement remplis, il reste donc largement de quoi mettre notre fichier à la fin du CD. Supposons qu'à partir du secteur 150000, il n'y a plus rien.
Tout d'abord, il faut convertir le fichier en secteurs, grâce à Sector Creator, sans oublier d'indiquer au programme le numéro du premier secteur (150000) afin qu'il puisse calculer son en-tête. On va ensuite réinsérer le fichier obtenu dans l'ISO avec Sector Insertor. Maintenant, il va falloir modifier la FAT pour qu'elle pointe vers ce nouvel emplacement. Une simple calculatrice pourra convertir en héxadécimal la nouvelle taille du fichier et son secteur (100325 devient 00 01 87 E5 et 150000 devient 00 02 49 F0). On modifie ces informations dans le secteur 1683 que l'on a déjà extrait, sans oublier qu'il faut les modifier à l'envers puis à l'endroit. On réinsère alors le nouveau secteur dans l'ISO. Il ne reste plus qu'à corriger l'ECC pour les secteurs que l'on a modifié. Pour cela, on utilise CD Mage. Ouvrez l'ISO et choisissez le menu "Action > Scan for corruption". Pour accélérer la recherche, on pourra spécifier une plage de secteurs réduite d'abord à l'interval 1683-1683 (un seul secteur), puis 150000-150050 (pour le fichier réinséré). Le programme affiche alors la liste des secteurs modifiés. Un simple click droit et l'option "Rebuild sector fields" recalculera l'ECC de chaque secteur, ce qui supprimera toutes les erreurs.
Et voilà ! L'ISO a été modifié et peut maintenant être utilisé avec son nouveau fichier.


6. Guide de référence des outils

Au début de la trad de FFT, je ne connaissais pas les outils tels que CD Mage qui permettent de faire beaucoup de choses sur un ISO. J'ai donc conçu quelques programmes assez simples en ligne de commande dont certains sont obsolètes car CD Mage fait la même chose. Mais la plupart offrent des possibilités inédites, c'est pouquoi je les diffuse ici, accompagnés de leurs sources afin qu'il soit possible de les modifier ou de les améliorer. Ils ne peuvent être utilisés qu'avec des images ISO classiques, pas les NRG de Nero.

Sector Extract : ce programme extrait un ou plusieurs secteurs d'un ISO. CD Mage possède une fonction semblable.
sector_extract    fichier_iso    no_secteur    nb_secteurs
fichier_iso est bien sûr le nom du fichier .iso. no_secteur est le numéro du premier secteur à extraire et nb_secteurs le nombre de secteurs à extraire.
Vous obtiendrez un fichier sectorXXXX.sec où XXXX est le numéro du premier secteur.

Sector Insert : ce programme réalise l'opération inverse, la réinsertion d'un ou plusieurs secteurs dans un ISO.
sector_insert    fichier.sec    fichier.iso    no_secteur
fichier.sec est le nom du fichier à insérer. Sa taille doit être un multiple de 2352. fichier.iso est le nom du fichier ISO, et no_secteur le numéro du premier secteur à réinsérer.

Sector Add : ce programme réalise la même chose que Sector Insert, excepté le fait qu'il insère le secteur à la fin de l'ISO, augmentant ainsi sa taille.
sector_insert    fichier.sec    fichier.iso

Sector Creator : ce programme convertit un fichier normal en un fichier secteur, en calculant automatiquement la valeur des en-têtes. Il est utilisé pour réinsérer un fichier modifié avec Sector Insert.
sector_creator    fichier    no_secteur
fichier est le nom du fichier en entrée, et no_secteur le numéro du premier secteur dans lequel doit se trouver le fichier.
Vous obtiendrez un fichier sectorXXXX.sec où XXXX est le numéro du premier secteur.


7. Crédits et remerciements

Cette FAQ a été rédigée par moi (Moogle). Je possède cependant un gros défaut : j'explique très mal. Si vous n'y comprenez rien, ça vient sûrement de là, mais n'hésitez pas dans ce cas à me demander des précisions, ainsi qu'à signaler des éventuelles erreurs.
Certains détails ont été volontairement omis pour simplifier les explications (comme par exemple l'ECC qui se compose en fait de plusieurs parties), et aussi parce qu'il y a certaines choses que je ne connais pas.

Remerciements
- Le Boss pour avoir été l'initiateur du projet FF Tactics
- GreatSkaori, Lezard et ToraKami pour avoir accepté d'y participer
- Speeder Speed pour m'avoir permis d'entrer dans un super groupe de traduction
- Tous les autres membres de Génération 9 : SOR, Androidlord, Senki T, CattiBri et tout ceux que j'oublie (désolé)
- Copernic et Anus Pee pour les FAQ qui m'ont permis de débuter dans le romhacking
- Skeud, pour sa FAQ sur l'ASM PSX que je n'ai malheureusement pas pu exploiter faute de matériel
- Asmo pour ses quelques conseils et son soutient
- Et tout ceux qui font vivre la scène du romhack francophone et international

Contact
moogle@net-up.com
Génération 9