Contexte
Le binaire original/vectobj/SBDepack est un outil propriétaire Team17 (Jason
Frecknall, 1997) pour décompresser un format custom utilise par Alien Breed 3D 2.
Aucun depacker public connu. L’utilisateur a uploadé le binaire pour reverse.
Travail effectué
- Parsing du format AmigaDOS hunk : script Python qui décode HUNK_HEADER,
identifie HUNK_CODE (3188 bytes) + HUNK_BSS (83456 bytes) + 4 RELOC32. - Désassemblage 68k via
m68k-linux-gnu-objdump -b binary -m m68k -D
(paquetbinutils-m68k-linux-gnu). - Analyse statique du main : identification des syscalls
ExecBase/DosBase, des variables globales (file handles, pointeurs buffers,
tailles, strings). - Identification du magic et du header :
– À offset 0xDE du code :cmpil #0x3D53423D, a0@-> magic ="=SB="
– À offset 0xF2 :movel a0@(4), d0-> uncompressedSize en LONG big-endian - API de la routine Decrunch (offset 0x1B4) extraite :
Decrunch(d0=src, a0=dst, a1=ws, a2=ws+16k, d1=flags) - Sous-routines internes localisées :
– 0x27AReadHeader, 0x2C4DecodeChunk, 0x39EBuildHuffmanTable
(linkw -116 bytes), 0x8B6DecodeMain.
– Algorithme : Huffman dynamique + LZ77, chunks de 32 KB.
Format SBDepack confirme
+0 4 bytes magic "=SB=" (0x3D 0x53 0x42 0x3D)
+4 4 bytes uncompressedSize UINT32 big-endian
+8 ... compressedPayload Huffman + LZ77 par chunks de 32 KB
Fichiers créés
docs/SBDEPACK_FORMAT.md: spécification complète du format, API d’appel,
liste des sous-routines, strings localisées, plan de reverse.docs/sbdepack/SBDepack.disasm.annotated.asm: désassemblage annoté du main
(0x000-0x178) et de l’entry point Decrunch (0x1B4-0x278), avec commentaires
sur les variables globales, les syscalls, le flow de la décompression. Sert
de point d’entrée pour qui voudra finir le reverse.docs/sbdepack/regenerate_disasm.sh: script qui re-génère le désassemblage
brut complet à partir du binaireoriginal/vectobj/SBDepack.docs/sbdepack/README.md: pointeurs et instructions.tools/extract/sbdepack/SBDepackHeader.java: parser du header (magic +
uncompressedSize). UtiliserecordJava. Méthodeparse(byte[]) -> ParsedHeader.tools/extract/sbdepack/SBDepackDecompressor.java: placeholder pour la
décompression. LanceUnsupportedOperationExceptionavec message clair.
Documente l’ordre de reverse recommandé et la convention d’appel originale.
Mises à jour
tools/extract/inventory/FileMagic.java: ajout de la détection du magic
=SB=. Le rapportoriginalInventorylistera désormais les fichiers
SBDepack-packed avec leuruncompressedSizeextraite du header.
État actuel
- Détection : opérationnelle.
- Parsing du header : opérationnel.
- Décompression : NON implémentée (placeholder).
Reste à faire (si nécessaire)
La décompression sera portée en Java uniquement si l’inventaire détecte
effectivement des fichiers SBDepack-packed dans original/. Sinon, c’est du
travail évité. À décider après exécution de ./gradlew originalInventory.
En cas de besoin urgent (workaround) : l’utilisateur peut lancer le binaire
SBDepack original dans un émulateur Amiga (FS-UAE, WinUAE) sur chaque fichier
packé, ou utiliser un outil tiers s’il existe.