Le format de base ESE qui propulse SRUDB.dat
17/05/2026
L'Extensible Storage Engine est le moteur de base de données ISAM
embarqué de Microsoft, Jet Blue si vous lisez des docs internes. C'est
la couche de stockage de SRUM, du NTDS.dit d'Active Directory, des
magasins de boîtes Exchange, du vieux WebCacheV01.dat IE/Edge, du
Windows.edb de Windows Search, et de DHCP. Dès que vous savez lire
un fichier ESE, vous pouvez tous les lire ; il vaut donc la peine de
savoir comment il fonctionne avant d'analyser SRUDB.dat.
ESE en un paragraphe
Une série de pages de taille fixe (4 ou 8 Ko) organisées en B-trees, une par table. Les écritures passent d'abord par un journal en écriture anticipée, ce qui rend la récupération après crash possible. Le moteur est mono-processus : seul le service propriétaire détient le handle du fichier. Les tables sont décrites par un B-tree catalogue (id de table 0).
Anatomie sur disque
- Pages. 4 ou 8 Ko. La première page contient l'en-tête de la base
(signature
EFCDAB89, taille de page, signature de journal, état). La sortie deesentutl /mhlit cet en-tête. - B-trees. Un par table. Les pages internes contiennent des plages de clés et des pointeurs enfants ; les pages feuilles contiennent les lignes.
- Catalogue. Un B-tree spécial (id de table 0) décrivant toutes les autres tables : nom, numéro de page racine, définitions de colonnes.
- Valeurs longues. Les données de longueur variable trop grandes pour tenir en ligne vivent dans un arbre de valeurs longues séparé ; la ligne porte une clé de référence.
- Journaux de transactions. Fichiers
.logcontenant des écritures validées mais non encore flushées..chkest le checkpoint, jusqu'où le moteur a flushé.
Types de colonnes rencontrés dans SRUDB.dat
ESE a 19 types de colonnes. Ceux utilisés par SRUM :
| ID Type | Nom | Encodage |
|---|---|---|
| 1 | Bit | 1 octet (0/1) |
| 4 | Long | entier signé 32 bits |
| 7 | IEEEDouble | flottant 8 octets (utilisé pour les dates OLE) |
| 8 | DateTime | date variante OLE 8 octets |
| 11 | LongBinary | octets variables (souvent compressés XPRESS) |
| 12 | LongText | texte variable UTF-16 / cp1252 |
| 14 | UnsignedLong | entier non signé 32 bits |
| 15 | LongLong | entier signé 64 bits (souvent FILETIME) |
| 16 | GUID | 16 octets bruts (endianness mixte) |
Deux pièges à surveiller sur SRUM :
- La colonne
TimeStampde Application Resource Use est de type 8 (date OLE, flottant 8 octets). Une limite de seau à minuit UTC vaut44986.0, pas un FILETIME. Les outils qui supposent FILETIME pour toute colonne d'horodatage produisent des dates en l'an 4 000 000. - Les colonnes d'événement comme
ConnectStartTimesur Network Connectivity etEventTimestampsur Energy Usage sont des FILETIME de type 15. Un analyseur doit gérer les deux.
La même divergence piège les gens sur NTDS.dit et Exchange. Le type
compte.
Récupération depuis une base sale
ESE marque la base "dirty shutdown" chaque fois que le moteur n'a pas
écrit son enregistrement d'arrêt propre. Copier SRUDB.dat depuis un
hôte en direct garantit presque toujours cet état : DPS détenait le
handle et écrivait activement.
Un analyseur en lecture seule refusera soit l'en-tête sale, soit
sautera silencieusement les pages qui nécessitent un rejeu de
journaux. Le correctif est la récupération douce : rejouer les
fichiers .log contre la base avec esentutl /r. L'article
récupération de base sale
parcourt la ligne de commande.
Travaillez toujours sur une copie. esentutl /p (réparation dure) est
destructif : il peut écarter des lignes. Réservez-le aux cas où les
journaux ont entièrement disparu.
Compression XPRESS sur les colonnes variables
SRUM utilise la compression XPRESS sur les charges utiles de longueur
variable. La colonne SruDbIdMapTable.IdBlob est l'exemple évident :
les chemins d'applications UTF-16 se compressent souvent 3:1. Un
analyseur qui ne décompresse pas renvoie des chaînes parasites. La
charge utile compressée est précédée d'un octet magique (0x10 pour
XPRESS, 0x18 pour XPRESS Huffman).
Lire ESE en 2026
Choix concrets pour analyser ESE :
- libesedb (Joachim Metz, C). La bibliothèque open-source de référence. Sous-tend tout ce qui n'écrit pas son propre analyseur.
- ese_parser (Stroz Friedberg, Rust). Compile proprement vers
wasm32-unknown-unknown, et c'est ainsi que l'analyseur SRUM en navigateur fonctionne. - go-ese (Velocidex, Go). Utilisé par Velociraptor.
- esentutl.exe. Livré avec Windows. Utile pour la récupération, pas pour des lectures programmatiques.
Pour aller plus loin
Questions fréquentes
Que signifie ESE ?
Extensible Storage Engine. Microsoft l'appelle aussi Jet Blue en interne. C'est une base de données ISAM embarquée, transactionnelle, avec pages en B-tree.
Où ESE est-il utilisé en dehors de SRUM ?
Active Directory (NTDS.dit), Microsoft Exchange (magasins de boîtes aux lettres), cache Edge / Internet Explorer (WebCacheV01.dat), Windows Search (Windows.edb), et DHCP.
Puis-je ouvrir SRUDB.dat dans Microsoft Access ?
Non. Access utilise Jet Red, un moteur différent. ESE/Jet Blue a son propre format sur disque et nécessite un lecteur dédié comme libesedb, ese_parser, ou cet outil navigateur.
Le format ESE est-il documenté ?
Partiellement. Microsoft a open-sourcé le moteur ESE en 2021. Le projet libyal de Joachim Metz maintient la spécification communautaire la plus complète issue de l'ingénierie inverse.
Pourquoi les lignes SRUM sont-elles compressées ?
ESE supporte la compression XPRESS par colonne. SRUM l'utilise sur ses charges utiles de longueur variable (par exemple le IdBlob de SruDbIdMapTable) pour garder la base petite.