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.
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
| Date | Emplacement | Écrite par | Remarques |
|---|---|---|---|
| Date de compilation | TimeDateStamp de l'en-tête COFF | linker | secondes Unix, UTC |
| Date de débogage | chaque entrée IMAGE_DEBUG_DIRECTORY | linker | normalement égale à la date de compilation |
| Date d'export | TimeDateStamp du répertoire d'exports | linker | DLL ; souvent égale, parfois 0 |
| Date des ressources | en-têtes du répertoire de ressources | compilateur de ressources | généralement 0 |
| Date de signature | attribut signé Authenticode ou jeton d'horodatage | signataire ou autorité d'horodatage | seule 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
- 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.execompilés le 2026-09-03 et le 2026-09-12. - 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é.
- 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
signingTimedu signataire lui-même ne l'est pas (Authenticode hors ligne). - 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.