Qué registran los logs de PowerShell
PowerShell genera varios rastros independientes. Script Block Logging (evento 4104, en el log Microsoft-Windows-PowerShell/Operational) registra el código realmente ejecutado: el texto del script desofuscado, dividido en varios eventos 4104 en el caso de bloques largos. El registro de módulos (4103) registra los detalles de ejecución de la canalización. El log clásico "Windows PowerShell" registra el ciclo de vida del motor y de los proveedores (400/403/600) y, con una directiva, la ejecución de la canalización (800).
Fuera de los registros de eventos, PSReadLine mantiene un historial en texto plano de todo lo escrito en una consola interactiva, y Start-Transcript (o la directiva de transcripción) escribe la transcripción completa de una sesión en un archivo de texto. En conjunto, constituyen uno de los registros más ricos de lo que un operador —o un intruso— hizo en un equipo Windows.
Dónde se almacena
- C:\Windows\System32\winevt\Logs\Microsoft-Windows-PowerShell%4Operational.evtx — Script Block Logging (4104) y registro de módulos (4103).
- C:\Windows\System32\winevt\Logs\Windows PowerShell.evtx — eventos clásicos de motor/proveedor/canalización (400/403/600/800).
- C:\Users\<user>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt — historial de comandos interactivos, por usuario.
- C:\Users\<user>\Documents\PowerShell_transcript.<host>.<random>.<timestamp>.txt — transcripciones, si están habilitadas.
Por qué es importante en una investigación
- Script Block Logging captura el código tal como lo vio PowerShell, por lo que un -EncodedCommand o un one-liner ofuscado queda registrado en su forma expandida; además, este analizador decodifica por usted las capas codificadas y comprimidas.
- La reconstrucción de los 4104 por ScriptBlockId y MessageNumber/MessageTotal recompone los scripts largos que Windows dividió en muchos eventos y señala cualquier parte que falte.
- El historial de PSReadLine y las transcripciones capturan actividad interactiva que puede no pasar nunca por un archivo de script, incluidos errores tipográficos y comandos abandonados.
- Los hallazgos señalan download cradles, evasiones de AMSI/ETW, manipulación del registro y de Defender, evasión de la directiva de ejecución, ventanas ocultas, degradaciones del motor y ofuscación habitual, como pistas que verificar, no veredictos.
Limitaciones
- Script Block Logging está desactivado por defecto; sin él quizá solo vea los bloques de nivel Advertencia que Windows marcó por su cuenta, además del log clásico y el historial.
- El historial de PSReadLine no tiene marcas de tiempo: su orden es la única cronología y puede ser mucho más antiguo que los logs.
- Las horas de las transcripciones son la hora local del equipo sin zona horaria; las de los registros de eventos están en UTC.
- Los logs se sobrescriben y pueden borrarse; esta herramienta señala los comandos de borrado, pero no puede recuperar eventos ya eliminados.
Cómo obtener los archivos
- Exporte los dos registros de eventos de PowerShell con wevtutil epl (o recopile todos los .evtx con KAPE / Velociraptor) y copie el historial de PSReadLine y las transcripciones de cada usuario.
- El servicio EventLog mantiene los logs abiertos en un equipo en vivo, así que use una exportación en lugar de una copia simple.
- Conserve la estructura de carpetas Users\<name>\ para que el historial y las transcripciones se atribuyan a la cuenta correcta.
Preguntas frecuentes
¿Se suben mis archivos a algún sitio?
No. El analizador, incluido el lector de .evtx, está escrito en Rust compilado a WebAssembly y se ejecuta en un Web Worker en su navegador. No existe ningún endpoint de subida y nunca se ejecuta nada de un script.
¿Decodifica -EncodedCommand y scripts ofuscados?
Sí. El -EncodedCommand en base64 se decodifica desde UTF-16LE, y las capas adicionales (cargas gzip/deflate, códigos [char], concatenación de cadenas, el operador de formato -f y el escape con acentos graves) se deshacen y se muestran como texto inerte. Nunca ejecuta el script.
¿Cómo reconstruye un bloque de script repartido en varios eventos?
Windows divide un bloque de script largo en varios eventos 4104 que comparten un ScriptBlockId, cada uno con MessageNumber de MessageTotal. El analizador agrupa por ScriptBlockId, ordena por MessageNumber, concatena el texto y señala cualquier parte que falte.
¿Y si Script Block Logging estaba desactivado?
Seguirá viendo el log clásico de Windows PowerShell (eventos de motor y canalización), el historial de PSReadLine y las transcripciones que haya. Windows también registra con nivel Advertencia los bloques de script que considera sospechosos aunque el registro completo esté desactivado, y también se capturan.
¿Qué archivos debo recopilar?
Microsoft-Windows-PowerShell%4Operational.evtx y Windows PowerShell.evtx de winevt\Logs, el ConsoleHost_history.txt de cada usuario y cualquier PowerShell_transcript.*.txt. La guía de recopilación integrada ofrece exportaciones con un solo comando.