Journalisation des blocs de script (4104) : guide forensique
Ce qu'enregistre l'événement 4104, comment Windows découpe les blocs longs, pourquoi des blocs de niveau Avertissement apparaissent sans journalisation complète, et comment les lire dans un dossier.
En bref. La journalisation des blocs de script enregistre le code réellement exécuté par PowerShell dans l'événement 4104, au sein de Microsoft-Windows-PowerShell/Operational. Elle capture le texte désobfusqué : une -EncodedCommand ou une ligne concaténée y figure sous forme développée. Les blocs longs sont répartis sur plusieurs événements 4104 partageant un ScriptBlockId ; reconstituez-les par MessageNumber/MessageTotal. Même stratégie désactivée, Windows journalise les blocs suspects au niveau Avertissement. Ouvrez le parseur pour les reconstituer et les décoder dans votre navigateur.
Ce qu'enregistre le 4104
La journalisation des blocs de script est apparue avec PowerShell 5.0 (Windows 10 / WMF 5.0). Activée, le moteur écrit la source de chaque bloc de script qu'il compile dans l'événement 4104. Microsoft indique qu'elle « enregistre les blocs de code au fur et à mesure de leur exécution » et que cela se produit après désobfuscation, ce qui déjoue l'essentiel des astuces d'encodage et de chaînes (Microsoft : about_Logging_Windows, PowerShell ❤ the Blue Team).
Chaque événement 4104 porte ces champs EventData :
| Champ | Signification |
|---|---|
ScriptBlockText | Le code de cette partie du bloc |
ScriptBlockId | Un GUID partagé par toutes les parties d'un bloc |
MessageNumber / MessageTotal | Cette partie n sur N |
Path | Le fichier de script, lorsque le bloc provient d'un .ps1 |
Reconstituer un bloc découpé
Le journal d'événements Windows plafonne la taille d'un événement ; PowerShell découpe donc un bloc long en plusieurs événements 4104. Ils portent tous le même ScriptBlockId et sont numérotés MessageNumber sur MessageTotal. Pour retrouver le script, on regroupe par ScriptBlockId, on ordonne par MessageNumber et on concatène les ScriptBlockText. Si une partie manque — sortie d'un journal circulaire ou jamais collectée — la reconstruction présente un trou, et toute interprétation du code doit en tenir compte. Le PowerShell Parser effectue ce regroupement et signale les blocs auxquels il manque une partie. Voir événement 4104 et journalisation des blocs de script dans le glossaire.
Blocs de niveau Avertissement sans la stratégie
Même quand la stratégie de journalisation des blocs de script n'est pas définie, PowerShell 5 journalise tout de même les blocs dont le contenu correspond à une liste interne de termes suspects — au niveau Avertissement (Niveau 3) plutôt que Verbose. Un environnement « sans journalisation » conserve donc souvent une trace partielle de l'activité la plus intéressante (Lee Holmes). Le parseur marque ces blocs de niveau Avertissement pour ne pas les prendre pour bénins.
Qu'en faire
Lisez le 4104 avec le journal classique Windows PowerShell et les autres identifiants d'événements, décodez toute commande encodée et corroborez avec l'historique PSReadLine et les transcriptions. Pour transformer un dossier de fichiers .evtx en une chronologie décodée et interrogeable sans rien installer, analysez-les dans votre navigateur.
FAQ
Qu'est-ce que l'événement 4104 ?
C'est l'événement de journalisation des blocs de script dans le journal Microsoft-Windows-PowerShell/Operational. Chaque 4104 enregistre un bloc de code PowerShell tel que le moteur l'a compilé, après résolution de toute commande -EncodedCommand ou obfuscation de chaînes.
Pourquoi des événements 4104 apparaissent-ils au niveau Avertissement alors que la journalisation est désactivée ?
PowerShell 5 journalise automatiquement au niveau Avertissement les blocs de script contenant des termes jugés suspects, même lorsque la stratégie est désactivée. La journalisation complète (Verbose) de chaque bloc nécessite la stratégie.
Comment les scripts longs sont-ils stockés ?
Un bloc long est réparti sur plusieurs événements 4104 partageant un même ScriptBlockId ; chacun porte MessageNumber sur MessageTotal. Reconstituez-les dans l'ordre pour retrouver le texte complet.