Skip to content

Horodatages PE : compilation, débogage et signature

Où un exécutable Windows stocke ses dates, lesquelles sont fiables, comment repérer builds reproductibles et timestomping, et comment les exploiter.

Publié le 5 min de lecture

En bref. Un fichier PE contient plusieurs dates : le TimeDateStamp COFF (la « date de compilation » classique), ses copies dans les répertoires de débogage et d'exports et, s'il est signé, une date de signature. Aucune ne fait foi à elle seule. Les builds reproductibles remplacent la valeur par une empreinte ; les attaquants la mettent à zéro, la rendent aléatoire ou la copient. C'est la cohérence entre les dates qui constitue le signal utile.

Où se trouvent les dates

DateEmplacementÉcrite parRemarques
Date de compilationTimeDateStamp de l'en-tête COFFlinkersecondes Unix, UTC
Date de débogagechaque entrée IMAGE_DEBUG_DIRECTORYlinkernormalement égale à la date de compilation
Date d'exportTimeDateStamp du répertoire d'exportslinkerDLL ; souvent égale, parfois 0
Date des ressourcesen-têtes du répertoire de ressourcescompilateur de ressourcesgénéralement 0
Date de signatureattribut signé Authenticode ou jeton d'horodatagesignataire ou autorité d'horodatageseule la date de la contre-signature / RFC 3161 est garantie

Le PE Parser les affiche toutes dans la vue d'ensemble d'un fichier et permet de filtrer toute une collection par date de compilation, de débogage ou de signature.

Builds reproductibles : quand l'horodatage est une empreinte

Depuis Windows 10, Microsoft compile une grande partie du système de sorte que les mêmes sources produisent les mêmes octets. Le champ d'horodatage contient alors une empreinte du contenu, ce qui explique que les fichiers système affichent des dates décalées de plusieurs décennies. Raymond Chen l'explique dans Why are the module timestamps in Windows 10 so nonsensical?. Ces binaires possèdent une entrée du répertoire de débogage de type 16, IMAGE_DEBUG_TYPE_REPRO. Le SDK .NET fait de même par défaut pour ses assemblies.

PE Parser détecte l'entrée REPRO, signale la valeur comme une empreinte et exclut le fichier du filtrage par date de compilation au lieu de le placer en 2089.

Des valeurs qui en disent long

  • 0 : certaines chaînes de compilation et de nombreux fichiers altérés. Examinez les autres dates.
  • 1992-06-19 22:22:17 UTC (0x2A425E19) : la valeur fixe écrite par les anciens linkers Borland Delphi — elle identifie la chaîne de compilation, pas une date.
  • Dans le futur (sans REPRO) : modifiée à la main, falsifiée, ou machine de build dont l'horloge était déréglée.
  • Avant 1995 : invraisemblable pour un fichier PE ; falsifiée ou aléatoire.
  • Date de compilation ≠ date de débogage de plus d'un jour : l'une des deux a été modifiée — signe classique de timestomping, car les outils qui patchent l'en-tête oublient souvent le répertoire de débogage.
  • Signé avant d'être compilé : impossible ; l'une des deux dates est fausse.

Exploiter les dates dans une investigation

  1. Regrouper, pas prouver. Des builds d'un même outil compilés à quelques jours d'intervalle et partageant un imphash renseignent sur le cycle de développement de l'attaquant. La collection d'échantillons de PE Parser contient deux builds de m64.exe compilés le 2026-09-03 et le 2026-09-12.
  2. Comparer avec l'hôte. Un binaire compilé après son apparition sur le disque (dates du système de fichiers, première observation dans Prefetch ou Amcache) a un en-tête falsifié.
  3. Accorder le plus de confiance à l'autorité d'horodatage. Un jeton RFC 3161 ou une contre-signature est émis par un tiers au moment de la signature ; l'attribut signingTime du signataire lui-même ne l'est pas (Authenticode hors ligne).
  4. Préciser le fuseau. Toutes les dates PE sont en UTC. Présentez-les en UTC dans les rapports et indiquez le fuseau de toute conversion en heure locale.

La barre de plage temporelle de PE Parser s'appuie sur ces champs pour un lot de fichiers : choisissez le champ, réglez From/To à la seconde près ou utilisez « around this time » à ±5 min / ±1 h / ±24 h à partir de n'importe quel fichier, et chaque compteur, liste et export suit la plage. Le guide du format PE replace ces dates dans le contexte des autres en-têtes.

FAQ

Où se trouve la date de compilation d'un exécutable Windows ?

Dans le champ TimeDateStamp de l'en-tête de fichier COFF, en secondes écoulées depuis le 1970-01-01 UTC. Le linker écrit généralement la même valeur dans les entrées du répertoire de débogage et dans le répertoire d'exports.

Pourquoi certains fichiers Windows ont-ils une date de compilation dans le futur ou très ancienne ?

Les chaînes de compilation Microsoft et .NET récentes produisent des builds reproductibles et stockent une empreinte du contenu dans le champ d'horodatage au lieu d'une date. Une entrée du répertoire de débogage de type REPRO signale ces fichiers.

Peut-on se fier à l'horodatage de compilation d'un PE ?

Pas à lui seul : c'est un simple champ que n'importe qui peut modifier. Comparez-le aux horodatages de débogage et d'exports, à la date de signature fournie par une autorité d'horodatage et aux dates du système de fichiers de la machine.

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.
Comment Authenticode signe un fichier PE, quels contrôles sont possibles à partir du seul fichier, et pourquoi signature valide ne veut pas dire fiable.
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.