PARTIE 2 : Vérifier la validité d'un fichier PE
Date de publication : 08/09/2005
Par
Iczelion (Iczelion's Win32 Assembly Homepage)
Traduction et adaptation par Olivier Lance (Accueil)
Dans cette partie, nous verrons comment vérifier qu'un fichier donné respecte le format .
Article original :
Retour à
Tutoriel précédent :
Tutoriel suivant :
Théorie
Comment savoir si un fichier est un fichier PE valide ?
C'est une question à laquelle il est difficile de répondre. Cela dépend du temps que vous voulez passez à faire la
vérification. Vous pouvez vérifier chaque donnée de chaque structure définie dans les spécifications du format PE,
ou simplement vous satisfaire de la vérification des données cruciales que ces structures contiennent.
La plupart du temps, il est relativement inutile de vérifier les données une à une dans le fichier. Si les
structures principales sont valides, on peut considérer le fichier comme un fichier PE valide. Nous nous bornerons
à cette considération.
La principale structure que nous vérifierons est l'entête PE lui-même. Nous avons donc besoin d'en savoir un peu
plus à son sujet, du point de vue programmation.
L'entête PE est en fait une structure appelée TImageNtHeaders. Sa définition dans l'unité Windows.pas
de Delphi est la suivante :
_IMAGE_NT_HEADERS = packed record
Signature: DWORD;
FileHeader: TImageFileHeader;
OptionalHeader: TImageOptionalHeader;
end;
TImageNtHeaders = _IMAGE_NT_HEADERS; |
- Signature est un DWord contenant la valeur $50, $45, $00, $00. Pour être plus clair, il contient le texte
"PE" suivi de deux zéros terminaux. Ce membre est la signature PE, nous l'utiliserons donc dans le processus de
vérification.
- FileHeader est une structure qui contient des informations à propos de l'organisation physique du fichier
PE, comme le nombre de sections, la machine pour laquelle le fichier est destiné etc.
- OptionalHeader est une structure qui contient des informations supplémentaires sur l'organisation du fichier
PE. Malgré le terme "Optional" figurant dans son nom, il est toujours présent.
Notre but est maintenant clair. Si la valeur de la signature de l'entête PE est égale à "PE" suivie de deux zéros,
alors le fichier est un fichier PE valide. En réalité, à des fins de comparaison, Microsoft a défini quelques constantes
nommées IMAGE_XX_SIGNATURE que l'on peut facilement utiliser :
IMAGE_DOS_SIGNATURE = $5A4D;
IMAGE_OS2_SIGNATURE = $454E;
IMAGE_OS2_SIGNATURE_LE = $454C;
IMAGE_VXD_SIGNATURE = $454C;
IMAGE_NT_SIGNATURE = $00004550; |
La question est maintenant : comment savoir où se trouve l'entête PE ?
La réponse est simple : l'entête DOS MZ contient l'offset dans le fichier de l'entête PE. L'entête DOS MZ est
défini par la structure TImageDosHeader. Vous pouvez en consulter la composition dans l'unité
Windows.pas. Le membre _lfanew de la structure TImageDosHeader contient l'offset de l'entête PE.
Les étapes sont donc les suivantes :
- Vérifier que le fichier a un entête DOS MZ valide en comparant le premier Word du fichier avec la valeur IMAGE_DOS_SIGNATURE.
- Si le fichier a un entête DOS valide, utiliser la valeur contenue dans le membre _lfanew pour trouver l'entête PE.
- Comparer le premier DWord de l'entête PE avec la valeur IMAGE_NT_SIGNATURE. Si les deux valeurs concordent, alors on peut considérer le fichier comme un fichier PE valide.
Exemple
La fonction suivante renvoie True si le fichier donné en paramètre est un fichier PE, False s'il n'est pas valide
ou s'il y a un problème lors de la lecture du fichier :
function IsValidPE(Fichier: String): Boolean;
var
EnteteDOS: TImageDosHeader;
EntetePE : TImageNtHeaders;
FStream : TFileStream;
begin
Result := True;
If not FileExists(Fichier) then
begin
Result := False;
Exit;
end;
FStream := TFileStream.Create(Fichier, fmOpenRead);
try
try
FStream.ReadBuffer(EnteteDOS, SizeOf(EnteteDOS));
If EnteteDOS.e_magic <> IMAGE_DOS_SIGNATURE then
Result := False
else
begin
FStream.Seek(EnteteDOS._lfanew, soFromBeginning);
FStream.ReadBuffer(EntetePE, SizeOf(EntetePE));
If EntetePE.Signature <> IMAGE_NT_SIGNATURE then
Result := False;
end;
except
On Exception do
Result := False;
end;
finally
FStream.Free;
end;
end; |
Liens


Copyright © 2005 Olivier Lance. Aucune reproduction, même partielle, ne peut être faite
de ce site et de l'ensemble de son contenu : textes, documents, images, etc
sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.