La décompilation de Ravenloft : Strahd's possession

Tout fichier suivant un format s'accompagne généralement d'une entête contenant des méta-données permettant de donner les caractéristiques techniques et/ou fonctionnelles du fichier.

Un programme exécutable ne fait pas exécution, cependant l'entête est différente suivant quel genre de programme il s'agit. Pour les programmes DOS l'entête est structurée de la manière suivante (basé sur cette description).

En préambule il faut se rappeler de trois choses concernant les programmes DOS :

  • ce sont des programmes 16 bits, cela signifie qu'un entier, un pointeur ou une adresse est stocké sur 16 bits soit 2 octets (contrairement à 4 ou 8 de nos jours) pour une plage de valeur allant de 0 à 65534.
  • la notion de page (ou bloc) représente 512 octets
  • la notion de paragraphe représente 16 octets
[caption]Entête de programme DOS[/caption]
Position Type / Taille Description
00~01 2 caractères (2 octets) Le nombre magique permettant d'identifier le fichier comme étant un programme. La valeur attendue est 'MZ' soit 0x4D5A. Certains anciens programmes utilisent aussi 'ZM', il sera bon de faire une assertion pour ce cas là.
02~03 entier non-signé (2 octets) La taille en octets réellement utilisée au sein de la dernière page du programme. Si 0 alors la dernière page est complètement utilisée
04~05 entier non-signé (2 octets) Le nombre de pages occupées par le programme.
06~07 entier non-signé (2 octets) Le nombre d'éléments dans la relocation table.
08~09 entier non-signé (2 octets) Le nombre de paragraphes occupés par l'entête. Cette taille inclut également les éléments de la relocation table et sert donc à calculer l'offset où commence le programme en lui-même.
10~11 entier non-signé (2 octets) Le nombre de paragraphes minimum de mémoire additionnelle requis pour pouvoir lancer l'application.
12~13 entier non-signé (2 octets) Le nombre de paragraphes maximum de la mémoire additionnelle.
14~15 entier non-signé (2 octets) Valeur initiale du registre SS. Cette valeur est relative.
16~17 entier non-signé (2 octets) Valeur initiale du registre SP.
18~19 entier non-signé (2 octets) Somme de contrôle. Apparemment inutilisé.
20~21 entier non-signé (2 octets) Valeur initiale du registre IP.
22~23 entier non-signé (2 octets) Valeur initiale du registre CS. Cette valeur est relative.
24~25 entier non-signé (2 octets) Offset du premier élément de la relocation table.
26~27 entier non-signé (2 octets) Le overlay number, un 0 indique que c'est le programme principal.

Le décorticage de l'entête d'un programme ouvre plusieurs chantiers :

  1. Les instructions machines qui vont suivre font un usage intensif des registres, il va falloir que je comprenne qui sert à quoi et comment les valuer. En particulier les valeurs de SS et CS qui sont dites relatives, il va falloir que je saches comment calculer leur valeur absolue.
  2. Pour comprendre ce que fait le programme il va sans doute être nécessaire de stocker l'état courant dudit programme comme si il était en cours d'exécution. Cela inclut l'état de la mémoire et aussi des registres.
  3. La relocation table est une sorte de conteneurs de variables globale, il va falloir la décortiquer elle aussi pour compléter l'étude de l'entête.
Laissez un commentaire

1 Commentaire

Laissez un commentaire

Vous devez être connecté pour commenter sur le Refuge. Identifiez-vous maintenant ou inscrivez-vous !


Marre des pubs ? Inscrivez-vous !