Bei mir sieht die Datei so aus:
$ hexdump -C data.fcg
00000000 ff 00 00 00 64 00 00 00 01 01 01 01 00 00 00 98 |....d...........|
00000010 21 00 00 06 00 00 00 6d 61 72 74 69 6e 91 04 00 |!......martin...|
00000020 00 07 00 00 00 6d 72 20 68 65 6c 69 a6 02 00 00 |.....mr heli....|
00000030 02 00 00 00 72 39 32 02 00 00 05 00 00 00 73 6f |....r92.......so|
00000040 6e 69 63 2e 02 00 00 05 00 00 00 6d 61 72 69 6f |nic........mario|
00000050 d3 01 00 00 09 00 00 00 61 63 74 72 61 69 73 65 |........actraise|
00000060 72 d0 01 00 00 04 00 00 00 6c 69 6e 6b 4e 01 00 |r........linkN..|
00000070 00 0a 00 00 00 68 65 72 6f 20 74 6f 6e 6d 61 7c |.....hero tonma||
00000080 00 00 00 09 00 00 00 76 69 63 20 76 69 70 65 72 |.......vic viper|
00000090 64 00 00 00 03 00 00 00 63 69 64 |d.......cid|
0000009b
cid hat genau 100 Punkte. Hexadezimal wären das 0x64. Außerdem ist „cid“ genau drei bzw. 0x03 Zeichen lang. Der Hexdump nach nach „vic viper“ sieht so aus:
64 00 00 00 03 00 00 00 63 69 64
Wir sehen also zwei 32-bit-Worte, beide Little Endian unsigned int, eines 3 eines 100 bzw. 0x64 gefolgt von einem drei Zeichen langen String. Damit ist das Format für die eigentliche Highscore klar: Punktzahl, Stringlänge, Name.
Dann schauen wir 15-Byte langen Anfang der Datei:
ff 00 00 00 64 00 00 00 01 01 01 01 00 00 00
Wenn man das als 32-bit-Wörter zu lesen versucht, dann hätten wir zum Beispiel 256 und 100 als little endian unsigned int. Danach vier Byte 0x01 und drei Byte 0x01. Eventuell sind sieben ein-Byte-Werte, vielleicht unsigned int oder gecastetes Bool.
Beim obigen Speicherstand hatte ich das Spiel ein einziges Mal gespielt, hatte Level 1 geschafft und bin in Level 2 gestorben. Nachdem ich Level drei geschafft hatte, wurde der Header zu:
ff 00 00 00 64 00 00 00 01 01 01 03 00 00 00
- Das zwölfte Byte scheint also die Anzahl der abgeschlossenen Level zu sein.
- Stelle ich von Stereo auf Mono, wird das neunte Byte von
0x01zu0x00. - Stelle ich die Auflösung von viel (1024×768) auf wenig (800×600) Pixel, wird das zehnte Byte von
0x01zu0x00. - Stelle ich Detailstufe von „hoch“ auf „niedrig“ wird das elfte Byte von
0x01zu0x00. - Die ersten beiden 32-Bitwörter repräsentieren die Lautstärken von Geräuschen und in 256 Stufen.
- Unklar sind mir die drei
0x00-Byte zwischen Levelstand und Highscore.
Werfen wir mal einen Blick auf deine Datei:
- Geräusche:
0xFF, also 255/255 = 100% (Ursprungzustand) - Musik:
0x64, also 100/255 = 39,2% (Ursprungzustand) - Tonkanäle:
0x01, also stereo - Auflösung:
0x01, also die höhere - Details:
0x01, also mit „Details hoch“ - Freigeschaltete Level:
0x16, also 22 Stück abgeschlossen - drei mysteriöse Bytes: alle drei
0x00, was auch immer das bedeutet
Kann man sich da irgendwie schon eintragen?
Wie bringt man die KI dazu, dir beim Reversen des Codes zu helfen?





