Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédente | Dernière révisionLes deux révisions suivantes | ||
back2root:reverse-engineering:future-crew-unreal-reverse-engineering-part-1 [2023/01/07 10:44] – supprimée - modification externe (Unknown date) 127.0.0.1 | back2root:reverse-engineering:future-crew-unreal-reverse-engineering-part-1 [2023/01/07 10:44] – ↷ Page déplacée de back2root:tutoriaux:future-crew-unreal-reverse-engineering-part-1 à back2root:reverse-engineering:future-crew-unreal-reverse-engineering-part-1 frater | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Future Crew Unreal Reverse Engineering - Part 1 ====== | ||
+ | ===== Intro ===== | ||
+ | |||
+ | La démo " | ||
+ | |||
+ | Cette démo et surtout la seconde a permis a ce groupe de devenir légendaire... Pour le 20eme anniversaire de " | ||
+ | |||
+ | {{youtube> | ||
+ | |||
+ | En farfouillant le net, je me suis rendu compte qu'il n' | ||
+ | |||
+ | La démo arrive sur un seul .exe de 2.400.825 bytes et était distribuée dans un fichier zip de 1.337.312 bytes (https:// | ||
+ | |||
+ | ce fichier .exe contient a démo, la musique ET les assets graphique. | ||
+ | |||
+ | ===== Deep dive dans le fichier ===== | ||
+ | |||
+ | En regardant le code de second reality et en lisant excellente review de Fabien, je me suis dit que unreal devait avoir la même structure. j'ai donc jeté un oeil sur l'exe via un petit utilitaire ' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Dans Second Reality, les parties et assets ne sont décrit que dans une série d' | ||
+ | |||
+ | Tout en parcourant le fichier, j'ai vu des chaînes de caractère, notamment " | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Il y a aussi une pattern très claire 16 octets pour le nom de fichier, et de 2 mots de 32 bits, soit un " | ||
+ | |||
+ | <code c> | ||
+ | typedef struct | ||
+ | { | ||
+ | char fname[16]; | ||
+ | unsigned long offset; | ||
+ | unsigned long size; | ||
+ | } FileDef; | ||
+ | </ | ||
+ | |||
+ | Toutefois, il y a un dernier " | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Sauf que à l' | ||
+ | |||
+ | 0x00C82FC0 (13119424) aucune idée de ce que cela représente, | ||
+ | 0x00000061 (97) : le nombre d' | ||
+ | 0x000066EB (26347) : la fin taille total du loader (code + header DOS) | ||
+ | |||
+ | Sur base de ce que l'on vient de découvrir, il est donc assez facile de lire le répertoire, | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | typedef struct | ||
+ | { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } FC_FILE_ENTRY; | ||
+ | |||
+ | |||
+ | FILE *fc_blob; | ||
+ | |||
+ | FC_FILE_ENTRY *fc_directory; | ||
+ | unsigned long fc_directory_size; | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | unsigned long fsize=0, dirstart=0; | ||
+ | unsigned long header[3], | ||
+ | | ||
+ | fc_blob = fopen(file," | ||
+ | if (!fc_blob) | ||
+ | { | ||
+ | puts(" | ||
+ | exit(1); | ||
+ | } | ||
+ | fseek(fc_blob, | ||
+ | fsize = ftell(fc_blob); | ||
+ | fseek(fc_blob, | ||
+ | fread(& | ||
+ | |||
+ | fseek(fc_blob, | ||
+ | fread(& | ||
+ | |||
+ | fc_directory_size = header[1]; | ||
+ | fc_directory = malloc(sizeof(FC_FILE_ENTRY)*fc_directory_size); | ||
+ | fread(fc_directory, | ||
+ | |||
+ | fclose(fc_blob); | ||
+ | |||
+ | for(i=0; | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Ce code devrait nous permettre de " | ||
+ | |||
+ | L' | ||
+ | |||
+ | Prochaine étape, l' | ||
+ | |||
+ | [TBC] | ||
+ | |||
+ | Références: | ||
+ | |||
+ | * Code source de Second Reality : https:// | ||
+ | * Code review par Fabien Sanglard : http:// | ||
+ | |||
+ | downloadable: | ||
+ | |||
+ | * Référence de la démo : http:// | ||
+ | * La démo Unreal de future Crew : https:// | ||
+ | * unp : http:// | ||
+ | | ||
+ | <nspages back2root/ |