Introduction
Les fichiers exécutables (.EXE) du systèmes d'exploitation DOS contiennent des informations communes permettant de savoir de quel façon il est chargé en mémoire. Il s'agit d'une structure de données de 28 octets situé au début du fichier exécutable de format MZ. Les deux premiers caractères sont la signature pour indiquer qu'il s'agit d'un fichier exécutable et les 13 mots suivants correspondent à des champs de données.
Visualisateur d'entête EXE
Voici un petit programme écrit en Turbo Pascal permettant d'afficher le contenu de cette entête sous forme de chiffre hexadécimal et décimal :
- Program EXEHEAD;
-
- Type
- ExeHeaderRec=Record
- Signature:Array[0..1]of Char;
- LengthRem:Word;
- LengthPages:Word;
- NumReloc:Word;
- HeaderSize:Word;
- MinHeap:Word;
- MaxHeap:Word;
- StackSeg:Word;
- StackPtr:Word;
- CheckSum:Word;
- IpInit:Word;
- CodeSeg:Word;
- RelocOfs:Word;
- OverlayNum:Word;
- End;
-
- Var
- Fich:File;
- Header:ExeHeaderRec;
-
- Procedure Help;Begin
- Writeln;
- Writeln('EXEHEAD: Visualisateur d''entete EXE');
- Writeln;
- Writeln('SYNTAXE: EXEHEAD program.exe');
- Writeln;
- End;
-
- Function WordToHex(Number:Word):String;
- Const Hexa:Array[0..15] of Char=('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
- Begin
- WordToHex:=Hexa[Hi(Number) shr 4]+Hexa[Hi(Number) and $F]+Hexa[Lo(Number) shr 4]+Hexa[Lo(Number) and $F];
- End;
-
- BEGIN
- If((ParamCount = 0)or(ParamCount > 1))Then Help
- Else
- Begin
- Assign(Fich, ParamStr(1));
- Reset(Fich,1);
- BlockRead(Fich,Header,SizeOf(Header));
- Close (Fich);
- WriteLn;
- Writeln('Analyse de l''entete...');
- WriteLn;
- If(Header.Signature[0]='M') and (Header.Signature[1]='Z')Then Begin
- WriteLn('Signature du fichier : ',Header.Signature[0],Header.Signature[1]);
- WriteLn('Taille de la dernière page : ' ,WordToHex(Header.LengthRem),'h, ',Header.LengthRem);
- WriteLn('Nombres de pages : ' ,WordToHex(Header.LengthPages),'h, ', Header.LengthPages);
- WriteLn('Entrées de la table de relocalisation : ' ,WordToHex(Header.NumReloc),'h, ', Header.NumReloc);
- WriteLn('Paragraphes de l''en-tête : ',WordToHex(Header.HeaderSize),'h, ', Header.HeaderSize);
- WriteLn('MINALLOC : ' ,WordToHex(Header.MinHeap),'h, ', Header.MinHeap);
- WriteLn('MAXALLOC : ' ,WordToHex(Header.MaxHeap),'h, ', Header.MaxHeap);
- WriteLn('SS initial (Segment de la pile) : ' ,WordToHex(Header.StackSeg),'h, ', Header.StackSeg);
- WriteLn('SP initial (Taille de la pile) : ' ,WordToHex(Header.StackPtr),'h, ',Header.StackPtr);
- WriteLn('Sommation de contrôle : ' ,WordToHex(Header.CheckSum),'h, ',Header.CheckSum);
- WriteLn('IP initial : ' ,WordToHex(Header.IpInit),'h, ',Header.IpInit);
- WriteLn('CS initial : ' ,WordToHex(Header.CodeSeg),'h, ',Header.CodeSeg);
- WriteLn('Deplacement de la table de relocalisation : ' ,WordToHex(Header.RelocOfs),'h, ',Header.RelocOfs);
- WriteLn('Nombre du segment de recouvrement : ' ,WordToHex(Header.OverlayNum),'h, ',Header.OverlayNum);
- End
- Else
- Begin
- WriteLn('Analyse impossible, le fichier n''est pas d''un type MZ');
- End;
- End;
- END.
Vous compilez le programme et ensuite vous exécutez la commande suivante pour lui demander de visualiser le contenu du fichier de sa propre entête EXE :
EXEHEAD exehead.exe |
vous obtiendrez alors un résultat ressemblant à ceci :
Analyse de l'entete... Signature du fichier : MZ Taille de la dernière page : 0000h, 0 Nombres de pages : 000Dh, 13 Entr?es de la table de relocalisation : 0087h, 135 Paragraphes de l'en-tête : 0024h, 36 MINALLOC : 042Eh, 1070 MAXALLOC : A42Eh, 42030 SS initial (Segment de la pile) : 01AAh, 426 SP initial (Taille de la pile) : 4000h, 16384 Sommation de contrôle : 0000h, 0 IP initial : 0431h, 1073 CS initial : 0000h, 0 Deplacement de la table de relocalisation : 001Ch, 28 Nombre du segment de recouvrement : 0000h, 0 |
Voir également
Fichiers - Lexique des extensions de fichier - Fichier EXE - Format de fichier MZ