No edit summary |
No edit summary |
||
Line 31: | Line 31: | ||
* Récupération par index, c'est à dire par la position de l'offset du fichier dans la TOC. | * Récupération par index, c'est à dire par la position de l'offset du fichier dans la TOC. | ||
* Récupération par le nom dans le FD. | * Récupération par le nom dans le FD. | ||
* Récupération par un offset relatif à un endroit de la mémoire / du DVD / de l'AFS. Cette méthode est d'autant plus plausible du fait de l'alignement identique des [[MDT ( | * Récupération par un offset relatif à un endroit de la mémoire / du DVD / de l'AFS. Cette méthode est d'autant plus plausible du fait de l'alignement identique des [[MDT (Gotcha Force)|MDT]]/[[PZZ (Gotcha Force)|PZZ]] et de l'AFS (0x800). La récupération de la taille se fera alors facilement selon différentes méthodes (par le biais des headers de fichiers par exemple quand ils le permettent). | ||
L'application [https://github.com/Virtual-World-RE/NeoGF/tree/main/afstool afstool.py] (Virtual World RE) permet de manipuler le format de fichiers AFS. | L'application [https://github.com/Virtual-World-RE/NeoGF/tree/main/afstool afstool.py] (Virtual World RE) permet de manipuler le format de fichiers AFS. |
Revision as of 13:11, 17 April 2022
Le format de fichier AFS permet de packer un ensemble de fichier dans un seul et unique fichier. Il n'y a pas de compression. Tous les éléments (fichiers, et parties relatives au fonctionnement de l'AFS) sont alignés sur des blocks de 0x800 octets. En dehors des fichiers, l'AFS est en little endian.
Un AFS se compose de 4 parties :
- Le header
- 4 octets : magic number = "AFS\x00" ou "AFS\x20"
- 4 octets : nombre total de fichiers
- La Table Of Content (TOC) :
- un tableau avec pour chaque fichier :
- 4 octets : offset fichier
- 4 octets : taille fichier
- A la suite de ce tableau, 3 cas sont alors possibles :
- On trouve l'offset du filename directory (4 octets) et sa taille (4 octets).
- On trouve un padding (NULL bytes) puis l'offset du filename directory (4 octets) et sa taille (4 octets).
- On a tout simplement pas de filename directory (ni offset ni taille).
- un tableau avec pour chaque fichier :
- La partie qui contient l'ensemble des fichiers
- Le Filename Directory (FD) qui se constitue, pour chaque fichier, de :
- 32 octets : nom du fichier paddé avec des NULL bytes
- 2 octets : année
- 2 octets : mois
- 2 octets : jour
- 2 octets : heure
- 2 octets : minute
- 2 octets : seconde
- 4 octets : taille du fichier dans certains AFS, dans d'autres on retrouve une suite de file_offset, file_len, file_offset, file_len ... pour chaque entrée du FD, prenant le début du TOC dans l'ordre.
Le FD n'est pas obligatoirement présent dans le fichier AFS. Quand le FD est présent, on peut retrouver des fichiers portant un même nom et partageant des zones mémoires différentes. Le nom des fichiers peut aussi être un path relatif "../data/fichier" comme le démontre le jeu "Kidou Senshi Gundam - Gundam vs. Z Gundam (Japan)".
L'AFS est géré par l'exécutable principal (boot.dol). Théoriquement, les fichiers peuvent alors être récupérés de 3 manières pouvant être mélangées les unes les autres :
- Récupération par index, c'est à dire par la position de l'offset du fichier dans la TOC.
- Récupération par le nom dans le FD.
- Récupération par un offset relatif à un endroit de la mémoire / du DVD / de l'AFS. Cette méthode est d'autant plus plausible du fait de l'alignement identique des MDT/PZZ et de l'AFS (0x800). La récupération de la taille se fera alors facilement selon différentes méthodes (par le biais des headers de fichiers par exemple quand ils le permettent).
L'application afstool.py (Virtual World RE) permet de manipuler le format de fichiers AFS.