Skip to content

Le format PE pour la réponse à incident

Ce qui compte dans un fichier PE Windows pour trier un EXE, une DLL ou un pilote suspect : en-têtes, sections, imports, ressources, signature, overlay.

Publié le Mis à jour le 6 min de lecture

En bref. Un exécutable Windows est une carte : un en-tête MS-DOS pointe vers l'en-tête PE, l'en-tête PE décrit comment charger le fichier, et une table des sections indique quels octets vont où. La plupart des questions d'un premier triage — qu'est-ce que c'est, qui l'a compilé, quand, que peut-il faire, est-il signé, cache-t-il quelque chose — trouvent leur réponse en lisant cette carte, sans rien exécuter. Le PE Parser le fait dans votre navigateur.

Cet article est le point d'entrée de la série. Il parcourt la structure dans l'ordre où l'analyste en a besoin, avec les noms de champs utilisés par la spécification PE Format de Microsoft.

La structure en un coup d'œil

PartieEmplacementCe qu'elle apporte
En-tête MS-DOSoffset 0, commence par MZe_lfanew, l'offset de l'en-tête PE ; le stub DOS et, souvent, le Rich header
Signature PE + en-tête de fichier COFFà e_lfanewmachine (x86, x64, ARM64), nombre de sections, TimeDateStamp, caractéristiques (EXE ou DLL)
En-tête optionneljuste aprèsPE32 ou PE32+, point d'entrée, base de l'image, sous-système, checksum, caractéristiques DLL (ASLR, DEP, CFG), 16 répertoires de données
Table des sectionsaprès l'en-tête optionnelnom, taille virtuelle et brute, offset dans le fichier et permissions de chaque section
Répertoires de donnéesà l'intérieur des sectionsimports, exports, ressources, certificats, débogage, TLS, load config, relocations, .NET
Overlayaprès la dernière sectiontout ce qui a été ajouté : charges utiles d'installeurs, archives, configuration, signatures

Tout est en little-endian. Les adresses à l'intérieur de l'image sont des RVA (adresses virtuelles relatives) ; la conversion d'une RVA en offset de fichier passe par la table des sections, ce qui explique qu'une table des sections endommagée mette en échec tous les outils à la fois.

En-têtes : identité et compilation

Le TimeDateStamp de l'en-tête COFF est l'horodatage de compilation classique, en secondes Unix. Il peut être falsifié, mis à zéro ou — dans les builds Microsoft et .NET récents — remplacé par une empreinte, comme l'explique l'article sur les horodatages PE. L'en-tête optionnel indique si le fichier est en 32 bits (valeur magique 0x10b, PE32) ou en 64 bits (0x20b, PE32+), où commence l'exécution (AddressOfEntryPoint) et quelles protections contre l'exploitation ont été demandées (DYNAMIC_BASE pour l'ASLR, NX_COMPAT pour le DEP, GUARD_CF pour Control Flow Guard).

Le champ CheckSum est ignoré pour les exécutables ordinaires mais obligatoire pour les pilotes. Un checksum stocké qui ne correspond plus au checksum recalculé suggère que des octets ont changé après l'édition de liens.

Sections : où vivent le code et les données

Un programme lié par les outils Microsoft comporte typiquement .text (code), .rdata (données en lecture seule et tables d'imports), .data, .pdata (données d'exception x64), .rsrc et .reloc. Trois points méritent l'attention :

  • Permissions. Une section à la fois inscriptible et exécutable est inhabituelle dans la sortie d'un compilateur et courante chez les packers.
  • Entropie. Une valeur proche de 8 bits par octet signale un contenu compressé ou chiffré. Dans une section de code, cela indique généralement du packing — voir détecter les exécutables packés.
  • Noms. Les noms sont du texte libre. UPX0/UPX1, .vmp0 ou .themida sont des indices, pas des preuves, et un packer peut être renommé.

Imports et exports : les capacités

Le répertoire d'imports liste chaque DLL et chaque fonction que le chargeur doit résoudre, puis inscrit leurs adresses dans l'import address table. Les imports offrent l'aperçu des capacités le plus rapide : WinHttpOpen signifie HTTP, CreateRemoteThread signifie du code dans un autre processus, RegSetValueExW signifie des écritures dans le registre. Très peu d'imports accompagnés de LoadLibrary/GetProcAddress suggèrent que les vrais imports sont résolus à l'exécution. La liste des imports fournit aussi l'imphash, utilisé pour regrouper les échantillons (imphash, Rich header et TLSH).

Les DLL exportent des fonctions par nom et par ordinal ; une DLL avec un seul export comme DllRegisterServer ou ServiceMain indique comment elle s'attend à être chargée.

Ressources, données de débogage et signature

Les ressources contiennent les informations de version (CompanyName, FileDescription, OriginalFilename), le manifeste (niveau de privilège demandé), les icônes, les boîtes de dialogue et les tables de chaînes — et parfois un exécutable embarqué. Un OriginalFilename différent du nom sur disque permet de repérer rapidement une usurpation de nom (masquerading).

Le répertoire de débogage contient généralement un enregistrement CodeView avec le chemin PDB, un GUID et un âge. Des chemins de build comme C:\Users\<name>\source\repos\… trahissent l'environnement de l'auteur (chemin PDB).

La table des certificats contient la signature Authenticode. Elle n'est pas mappée en mémoire et se trouve après les sections, ce qui explique qu'elle soit exclue de l'empreinte du fichier qui est signée. Ce qu'une signature prouve et ne prouve pas est traité dans Authenticode hors ligne.

Check-list de premier triage

  1. Calculez les empreintes (MD5, SHA-1, SHA-256) et interrogez vos sources de threat intelligence ; calculez l'imphash.
  2. Lisez les horodatages : compilation, débogage, signature. Sont-ils cohérents entre eux et avec l'incident ?
  3. Vérifiez la signature : présente, conforme au fichier, qui a signé, quand.
  4. Parcourez les imports et les chaînes à la recherche de capacités et d'indicateurs (URL, adresses IP, chemins, clés de registre).
  5. Examinez les sections : permissions, entropie, emplacement du point d'entrée ; recherchez un overlay.
  6. Lisez les informations de version et le chemin PDB ; comparez-les au nom et à l'emplacement du fichier.

Le PE Parser applique cette check-list à un fichier ou à toute une collection et explique chaque indicateur en termes simples. Il est uniquement statique : il décompresse UPX et extrait les exécutables cachés dans un fichier, mais les autres packers doivent être décompressés ailleurs, et rien de ce qu'il affiche ne constitue un verdict à lui seul.

FAQ

Qu'est-ce qu'un fichier PE ?

Portable Executable est le format de fichier des programmes et bibliothèques Windows : .exe, .dll, pilotes .sys, .scr, .cpl, .ocx et binaires EFI. Il commence par un en-tête MS-DOS (MZ), suivi de la signature PE, d'un en-tête de fichier COFF, d'un en-tête optionnel et d'une table des sections.

Quels champs PE comptent le plus lors d'un premier triage ?

Les empreintes et l'imphash pour les recherches de threat intelligence, les horodatages de compilation, de débogage et de signature, la table des imports, la table des sections avec l'entropie et les permissions, les informations de version, la signature Authenticode et toute donnée ajoutée après la dernière section (overlay).

Articles liés

Triage statique pas à pas d'exécutables Windows avec PE Parser, gratuit : charger des fichiers ou un ZIP, lire les indicateurs, comparer, exporter.
Repérer et copier les EXE, DLL et SYS suspects d'un hôte ou d'une image Windows sans les exécuter : PowerShell, Velociraptor, images disque, pièges.
Où un exécutable Windows stocke ses dates, lesquelles sont fiables, comment repérer builds reproductibles et timestomping, et comment les exploiter.