Le format Portable Executable.pdf

(3186 KB) Pobierz
Le format Portable Executable
Sommaire
Introduction au format Portable Executable
1. Bref historique
2. Vue globale
1. Illustration
En-tête PE
1. Dos Stub / Compatibilité DOS
1. En-tête DOS
2. Exécuteur DOS
2. Image Nt Headers / En-têtes Nt
1. Signature PE
2. Image File Header / En-tête de fichier image
3. Optional Header / En-tête optionnelle
3. Sections Headers / En-tête des sections
Section "Importations"
1. Présentation
2. Explication théorique
1. Image Import Descriptor
1. Pourquoi deux fois le même champ ?
2. ImageThunkData / Import Lookup Table
1. Types d'exportation
1. Importation ordinale
2. Importation par le nom
3. Hint/Name Table
3. Illustration
Section "Exportations"
1. Présentation
2. Explication théorique
1. Types d'exportation
1. Exportation ordinale
2. Exportation par le nom
3. Application au contexte
2. Tableaux pointés
3. Illustration
1 sur 26
Le format Portable Executable
La section "Relocations"
1. Introduction
2. Explication théorique
1. Fixup Block / Bloc de correctifs
Ajouter une section
1. Explication théorique
1. Incrémentation du NumberOfSections
2. Incrémentation du SizeOfImage
3. Ajout de l'en-tête de section
4. Ajout de la section
2. Illustrations
Les constantes des fichiers PE
1. Notations et valeurs
2. Le champ "Machine" / ImageFileHeader.Machine
3. Le champ "Characteristics" / ImageFileHeader.Characteristics
4. Le champ "SubSystem" / OptionalHeader.SubSystem
5. Le champ "DLL Characteristics" / OptionalHeader.DLLCharacteristics
6. Le champ "Characteristics" / ImageSectionHeader.Characteristics
7. Les types correctif de la section "Relocations"
Types d'adresses
1. Présentation
2. Définitions
3. Calculs
1. Données exemples
2. RVA -> Offset
3. Offset -> RVA
4. RVA -> VA -> RVA
Introduction au format Portable Executable
24/01/2006
yarocco
1. Bref historique
Le format PE (pour Portable Executable) est un format de fichier utilisé chez Microsoft pour les pilotes, les
programmes, les DLL et autres fichiers executables. On comprend mieux le nom de ce format quand on remonte
son histoire.En effet, Microsoft a voulu un fichier qui soit portable. Non pas qu'on puisse le passer d'un PC à un
Mac sans modification mais plutôt qu'il puisse être porté sous les differents systemes que Windows NT supporte,
car à la base Windows NT n'est pas seulement prévu pour les systemes à base de x86 sous Win32, il était destiné à
2 sur 26
Le format Portable Executable
aussi supporter d'autres architectures tels que la serie des Motorola 68000, des Intel 64 ou encore même des Power
PC. Il fallait donc élaborer des structures communes pour ces architectures.
Le PE est une de ces structures. Il est capable avec quelques modifications mineures d'être porté sous quelques
architectures différentes. Ce format n'est pas né du néant mais dérive en partie du format COFF que l'on retrouve
dans UNIX. Il y apporte quelques modifications dont je ne peux pas vous faire la liste ici, faute de spécification
pour ce format de fichier (peut être lors d'une MAJ de cet article). Mais une chose est sûre, c'est que Microsoft
désirait un nouveau fichier exécutable qui permettrait d'exploiter la machine à son maximum. En effet, l'ancêtre du
PE posait d'énormes restrictions mémoire et pouvait poser problème lorsque les différentes sections étaient trop
longue (par exemple les sections Ressources ou Code). Le format PE fut developpé pour combler ces lacunes et il
est aujourd'hui encore utilisé (près de 13 ans après sa création) et risque encore de durer un certains temps vu que la
technologie .Net utilise ce format et il a dejà subit quelques modifications pour s'adapter au 64 bits.
2. Vue globale
Les fichiers au format PE peuvent être divisé en plusieurs parties :
Une partie pour assurer de fonctionner dans un environnement viable. Cette partie contient le kit necessaire
pour charger un programme sous DOS et indiquer que le dit programme n'est pas fait pour être éxécuté sous
ce système. Cette partie est là principalement pour indiquer aux utilisateurs qu'il faut changer de système s'ils
désirent utiliser le programme.
Une partie où l'on trouve l'en-tête d'un "Fichier Image Nt" (Image File Nt), aussi appellée en-tête PE, où sont
stockées les informations nécessaires au loader pour charger le fichier en mémoire. En effet, il faut savoir que
le fichier n'est pas chargé tel quel en mémoire, la structure sur le disque peut être totalement differente de
celle une fois chargée en mémoire. Pour permettre un chargement correct du fichier, il faut donner des
indications au loader :où se charge telle ou telle section, quelle taille faut t-il reserver et quelques autres
parametres sont obligatoires pour la "mapping" (chargement en mémoire) du fichier et c'est dans cette partie
que se trouvent les informatiosn. Après cette entête, il y a des informations sur les differentes sections que
comporte le fichier. Ce sont donc les entêtes des sections qui comportent elles aussi des informations pour
leur chargement en mémoire.
Une autre partie où l'on trouve les sections. Les sections sont en fait des sortes de repertoires dans lesquels
sont regroupées des données ayant la même fonctionnalité, du code ou des ressources par exemple, sous un
même attribut, qui peut être en lecture seule et écriture par exemple. Il faut donc bien voir ce système de
sections qui est présent tout le reste du fichier. Ces sections contiennent le code, quelques informations sur le
chargement en mémoire du fichier ou encore des informations de débogage.
1. Illustration
Voici un fichier au format Portable Executable tel qu'on peut en trouver partout sur n'importe quelle machine
étant équipée d'un Windows 95 au minimum.
3 sur 26
Le format Portable Executable
En-tête PE
Explication de l'en-tête et des sous-en-têtes du format PE
24/01/2006
yarocco
1. Dos Stub / Compatibilité DOS
1. En-tête DOS
Il s’agit ici d’un en-tête qui permet au format PE de rester compatible avec DOS (dans une certaine limite…).
Je passerai donc cet en-tête qui est pour nous pas du tout intéressant car exploitable que sous DOS.
Il faut juste savoir qu'il commence toujours par la série de caractères "MZ" et que son dernier champ
"e_lfanew", à l’offset $3C (50), contient l'adresse de l’en-tête PE à proprement parler. Il n’y a pas de constante
ou de champs qui référence l’offset de l’en-tête PE car le compilateur doit inclure dans l’image du code qui sera
exécuté lors d’un chargement du programme sous DOS.
2. Exécuteur DOS
C’est ici qu’on retrouve le fameux « This program must be run under Win32 » (et parfois sa version française).
Le compilateur peut donc mettre autant de code qu’il veut du moment que le champ "e_lfanew" pointe vers
l’en-tête PE.
2. Image Nt Headers / En-têtes Nt
Dès que cet en-tête commence, on doit normalement trouvé une signature qui confirme qu'il s'agit bien d'un fichier
PE.
1. Signature PE
4 sur 26
Le format Portable Executable
Elle est de la forme "PE#0#0", et donne en hexadécimal : "45 50 00 00", c'est-à-dire un "P", un "E" suivit par 2
octets nuls. Si la signature n’est pas bonne, le loader refusera de charger l’exécutable.
2. Image File Header / En-tête de fichier image
Il s’agit ici du premier en-tête qui est intéressant, en effet on trouve ici le nombre de sections et quelques
caractéristiques du fichier.
Machine : Word
On trouve tout d’abord ce champ qui indique le type de machine qui a servit à compiler le fichier qu’on lit.
Voir la correspondance des constantes PE.
NumberOfSection : Word
Il s’agit du nombre de sections qui sont dans l’exécutable. Ce champ est très important et ne peut pas être
changé sans autre changement dans le fichier. La valeur "standard" de ce champ est $10 (16).
TimeDateStamp : DWord
Date et heure de création du fichier. Ce champ est presque inutile de nos jours car beaucoup de compilateurs
mettent de fausses valeurs.
PointerToSymbolTable : DWord
Il s’agit de l’offset de la table des symboles. Les symboles servent au débogage d'un programme en général. Ils
permettent de récupérer les noms des fonctions, leurs paramètres et autres détails qui sont effacés lors de la
compilation.
NumberofSymbols : DWord
Il s’agit d’un champ qui donne des informations sur le fichier. Voir la correspondance des constantes PE.
3. Optional Header / En-tête optionnelle
Comme je l'ai lu souvent: "Cet en-tête n'a d'optionnel que le nom."
Je pense qu'elle a été nommée ainsi car c'est un rajout par rapport à la structure des fichiers COFF.
Magic : Word
Il s’agit d’un champ qui sert à différencier un fichier image 32 bits d’un fichier image 64bits.
Pour un fichier 32 bits, le champ doit être : $10B.
Pour un fichier 64 bits, le champ doit être : $20B
Si le fichier est pour les 64 bits, il y a quelques changements dont je ne parlerais pas pour le moment.
MajorLinkerVersion : Byte
Comme son nom l’indique, donne la version majeure du linker.
MinorLinkerVersion : Byte
Sans commentaire.
SizeOfCode : DWord
Donne la taille des sections qui ont du code mais peut être totalement faux si la constante
"IMAGE_FILE_LINE_NUMS_STRIPPED" est dans les characteristics du fichier. En principe, c’est la taille de
la section ".Code" ou ".Text".
5 sur 26
Zgłoś jeśli naruszono regulamin