Aller au contenu principal

Session 132sextus — Reverse engineering SBDepack (Team17)

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é

  1. Parsing du format AmigaDOS hunk : script Python qui décode HUNK_HEADER,
    identifie HUNK_CODE (3188 bytes) + HUNK_BSS (83456 bytes) + 4 RELOC32.
  2. Désassemblage 68k via m68k-linux-gnu-objdump -b binary -m m68k -D
    (paquet binutils-m68k-linux-gnu).
  3. Analyse statique du main : identification des syscalls
    ExecBase/DosBase, des variables globales (file handles, pointeurs buffers,
    tailles, strings).
  4. 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
  5. API de la routine Decrunch (offset 0x1B4) extraite :
    Decrunch(d0=src, a0=dst, a1=ws, a2=ws+16k, d1=flags)
  6. Sous-routines internes localisées :
    – 0x27A ReadHeader, 0x2C4 DecodeChunk, 0x39E BuildHuffmanTable
    (linkw -116 bytes), 0x8B6 DecodeMain.
    – 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 binaire original/vectobj/SBDepack.
  • docs/sbdepack/README.md : pointeurs et instructions.
  • tools/extract/sbdepack/SBDepackHeader.java : parser du header (magic +
    uncompressedSize). Utilise record Java. Méthode parse(byte[]) -> ParsedHeader.
  • tools/extract/sbdepack/SBDepackDecompressor.java : placeholder pour la
    décompression. Lance UnsupportedOperationException avec 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 rapport originalInventory listera désormais les fichiers
    SBDepack-packed avec leur uncompressedSize extraite 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *