Skip to content

Script Block Logging de PowerShell (4104): guía forense

Qué registra el event ID 4104, cómo divide Windows los bloques de script largos en varios eventos, por qué aparecen bloques de nivel Warning sin el registro completo y cómo interpretarlo en un caso.

Publicado el 4 min de lectura

En resumen. El Script Block Logging registra el código que PowerShell ejecutó realmente en el event ID 4104, dentro de Microsoft-Windows-PowerShell/Operational. Captura el texto desofuscado, por lo que un -EncodedCommand o una línea de comando concatenada se almacena en su forma expandida. Los bloques largos se dividen en varios eventos 4104 que comparten un ScriptBlockId; reconstrúyalos según MessageNumber/MessageTotal. Incluso con la directiva desactivada, Windows registra los bloques sospechosos con nivel Warning. Abra el parser para reconstruirlos y decodificarlos en su navegador.

Qué registra el 4104

El Script Block Logging se añadió en PowerShell 5.0 (Windows 10 / WMF 5.0). Cuando está habilitado, el motor escribe en el event ID 4104 el código fuente de cada bloque de script que compila. Microsoft documenta que registra los bloques de código a medida que se ejecutan y que esto ocurre después de la desofuscación, por lo que neutraliza la mayoría de los trucos de codificación y de cadenas (Microsoft: about_Logging_Windows, PowerShell ❤ the Blue Team).

Cada evento 4104 contiene estos campos EventData:

CampoSignificado
ScriptBlockTextEl código de esta parte del bloque
ScriptBlockIdUn GUID compartido por todas las partes de un mismo bloque
MessageNumber / MessageTotalEsta es la parte n de N
PathEl archivo de script, cuando el bloque procede de un .ps1

Reconstruir un bloque dividido

El registro de eventos de Windows limita el tamaño de cada evento, por lo que PowerShell divide un bloque largo en varios eventos 4104. Todos llevan el mismo ScriptBlockId y se numeran como MessageNumber de MessageTotal. Para recuperar el script, agrupe por ScriptBlockId, ordene por MessageNumber y concatene el ScriptBlockText. Si falta alguna parte (porque se sobrescribió en un registro circular o porque nunca se recopiló), la reconstrucción tiene un hueco, y cualquier interpretación del código debe tenerlo en cuenta. El PowerShell Parser realiza esta agrupación por usted y señala los bloques a los que les falta una parte. Consulte event ID 4104 y Script Block Logging en el glosario.

Bloques de nivel Warning sin la directiva

Incluso cuando la directiva de Script Block Logging no está configurada, PowerShell 5 sigue registrando los bloques de script cuyo contenido coincide con una lista interna de términos sospechosos, con nivel Warning (nivel 3) en lugar de Verbose. Esto significa que un entorno "sin registro" a menudo conserva un registro parcial de la actividad más interesante (Lee Holmes). El parser marca estos bloques de nivel Warning para que no los confunda con actividad benigna.

Qué hacer con él

Lea el 4104 junto con el registro clásico Windows PowerShell y los demás event ID, decodifique cualquier comando codificado y corrobórelo con el historial de PSReadLine y las transcripciones. Para convertir una carpeta de archivos .evtx en una línea de tiempo decodificada y con búsqueda sin instalar nada, analícelos en su navegador.

Preguntas frecuentes

¿Qué es el event ID 4104?

Es el evento de Script Block Logging del registro Microsoft-Windows-PowerShell/Operational. Cada evento 4104 registra un bloque de código de PowerShell tal como lo compiló el motor, después de resolver cualquier -EncodedCommand u ofuscación de cadenas.

¿Por qué veo eventos 4104 de nivel Warning cuando el Script Block Logging está desactivado?

PowerShell 5 registra automáticamente con nivel Warning los bloques de script que contienen términos que considera sospechosos, incluso cuando la directiva de Script Block Logging está desactivada. El registro completo de todos los bloques, con nivel Verbose, requiere la directiva.

¿Cómo se almacenan los scripts largos?

Un bloque de script largo se divide en varios eventos 4104 que comparten un mismo ScriptBlockId; cada uno lleva MessageNumber de MessageTotal. Reconstrúyalos en orden para recuperar el texto completo.

Artículos relacionados

Un mapa de los event ID forenses de PowerShell en los registros Operational y clásico Windows PowerShell (4104, 4103, 400, 403, 600, 800) y de lo que demuestra cada uno.
Paso a paso: abra registros .evtx de PowerShell, el historial de PSReadLine y las transcripciones en un visor gratuito en el navegador, reconstruya los bloques de script, decodifique comandos codificados y exporte a CSV o JSON.
Cómo se estructuran las transcripciones de PowerShell, qué registra el encabezado, cómo funcionan las marcas de tiempo de los comandos con -IncludeInvocationHeader y cómo investigarlas.