Desofuscador de PowerShell

Pega un comando o script de PowerShell ofuscado. Se decodifica capa a capa en tu navegador — nada se sube, nada se ejecuta — y el resultado se muestra como texto inerte, con los patrones sospechosos listados como pistas a verificar.

La ofuscación de PowerShell esconde lo que hace un script detrás de capas: un -EncodedCommand en Base64, compresión gzip, códigos de caracteres, concatenación de cadenas, el operador de formato -f y escapes con acento grave — cada capa se retira por turno hasta que queda texto legible, o el punto donde el desenrollado estático se detiene. Esta herramienta retira esas capas una a una y muestra cada paso, para que veas lo que dice el script sin ejecutarlo. Si el script viene de un registro de eventos de Windows, el visor EVTX lee el archivo .evtx y marca los eventos 4104; para otros registros de texto, el analizador de registros encuentra las líneas que importan. El artículo compañero cómo desofuscar scripts de PowerShell explica las capas y el flujo de trabajo seguro en prosa.

Última actualización:

Hasta 200 KB (.txt o .ps1). El archivo se lee en tu navegador y nunca sale de tu dispositivo. Nada se ejecuta.

🔒 Tu script se desenrolla en tu navegador y nunca sale de tu dispositivo. Sin cuenta, sin subidas, sin llamadas al servidor — y nada aquí se ejecuta jamás.

Qué pasa con el script que pegas

Nada sale de tu navegador. El script se desenrolla localmente con JavaScript en esta página: sin subidas, sin llamadas al servidor, sin almacenamiento, sin cuenta. Esto importa porque un script sospechoso nunca debe pegarse en un chat — un chat puede ejecutarlo, citarlo o guardarlo — y nunca debe ejecutarse para ver qué hace. Al cerrar la página se descarta.

Lo que un resultado limpio NO demuestra

Un resultado limpio no es prueba de seguridad. Significa que ninguna capa conocida se aplicó y ningún indicador coincidió — una cadena construida dinámicamente, un payload cifrado o un valor que solo existe en tiempo de ejecución no se pueden desenrollar estáticamente, y un script sin indicadores puede seguir siendo malicioso.

Un indicador no es prueba de malicia. Las cunas de descarga, IEX y los comandos codificados tienen usos legítimos en administración y despliegue; cada coincidencia es una pista a verificar en contexto, no un veredicto.

Nunca ejecutes un script desconocido para averiguar qué hace. Decodifícalo de forma inerte, entrega el resultado a tu EDR o a un sandbox, y trata el texto decodificado con la misma sospecha que la forma codificada — es evidencia, no un certificado de salud.

Cómo funciona el desenrollado

La herramienta prueba ocho capas en orden, una por paso, y repite hasta que ninguna capa se aplica o se han retirado diez capas: extracción de -EncodedCommand (Base64 a UTF-16LE, con UTF-8 como alternativa); un blob Base64 simple; descompresión gzip o deflate (la entrada puede venir envuelta en Base64 primero); secuencias de códigos [char] y [char[]]; concatenación de cadenas con comillas mixtas y varias líneas; el operador de formato -f; eliminación de escapes con acento grave; y un listado de marcadores ${...} y $variable, que nunca se resuelven porque sus valores solo existen en tiempo de ejecución. Cada paso muestra el texto antes y después, con el recuento de caracteres.

Lo que la herramienta NO hace: nunca ejecuta nada — el resultado es texto inerte, y la página no puede ejecutarlo ni por accidente. No puede desenrollar cadenas construidas dinámicamente, payloads cifrados ni valores que solo existen en tiempo de ejecución, y no juzga si un script es seguro: los indicadores son coincidencias de patrones, y un script que derrota a todas las capas se reporta como "no se pudo desenrollar más", nunca como limpio.

El registro de bloques de script (evento 4104) registra el texto del script que PowerShell realmente ejecutó, pero los scripts largos se dividen en fragmentos de unos 4 KB, cada uno con un ScriptBlockId, un MessageNumber y un MessageTotal. La pestaña de reensamblaje agrupa los fragmentos por ScriptBlockId, los ordena por MessageNumber, los une y marca cualquier parte que falte — un grupo con 2 de 3 partes y la parte 2 ausente está incompleto, y el texto que falta no se puede adivinar. El texto reensamblado alimenta el mismo desofuscador.

Preguntas frecuentes

¿Por qué el resultado se muestra como texto inerte en lugar de un script ejecutable?

Porque el objetivo de la desofuscación es leer un script sospechoso, no ejecutarlo. El texto decodificado puede seguir descargando y ejecutando un payload — mostrarlo como texto inerte con un botón de copia te permite inspeccionarlo, compartirlo con tu EDR o un sandbox, y no arriesgarte nunca a un doble clic.

La herramienta se detuvo con "no se pudo desenrollar más". ¿Y ahora?

El texto restante usa una capa que esta herramienta no conoce, construye sus cadenas en tiempo de ejecución, o está cifrado — el desenrollado estático llegó a su límite. No lo ejecutes para averiguarlo: entrega la forma codificada y la decodificación parcial a tu EDR o a un sandbox, y trata la capa desconocida como motivo de sospecha, no como un resultado limpio.

¿Qué hago con los indicadores?

Trata cada uno como una pregunta, no como una respuesta. Una cuna de descarga pregunta a dónde apunta la URL y si ese host es el esperado; un patrón de evasión de AMSI pregunta por qué el script intenta cegar el escáner; un comando codificado pregunta qué escondía la codificación. Verifica cada uno en contexto — en tu EDR, tus registros y la máquina de la que vino el script — antes de decidir nada.