Skip to content

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.

Publié le 3 min de lecture

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 :

ChampSignification
ScriptBlockTextLe code de cette partie du bloc
ScriptBlockIdUn GUID partagé par toutes les parties d'un bloc
MessageNumber / MessageTotalCette partie n sur N
PathLe 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.

Articles connexes

Cartographie des identifiants d'événements PowerShell utiles à l'investigation, entre le journal Operational et le journal classique Windows PowerShell — 4104, 4103, 400, 403, 600, 800 — et ce que prouve chacun.
Pas à pas : ouvrir les journaux .evtx PowerShell, l'historique PSReadLine et les transcriptions dans une visionneuse gratuite en navigateur, reconstituer les blocs de script, décoder les commandes encodées et exporter en CSV ou JSON.
Structure des transcriptions PowerShell, contenu de l'en-tête, fonctionnement des horodatages de commandes avec -IncludeInvocationHeader, et comment les investiguer.