Ayuda

Desofuscar JavaScript online: de código ofuscado a código legible

Un desofuscador de JavaScript deshace los trucos que dificultan la lectura del código. Este desempaqueta arrays de cadenas sencillos, calcula expresiones constantes, decodifica escapes hex y Unicode y renombra los nombres al estilo _0x; después muestra el resultado con sangría de 2 espacios. Lo hace leyendo el código, no ejecutándolo: tu JavaScript ni se ejecuta ni se sube, y parte de la ofuscación, que se detalla más abajo, se deja tal cual.


Cómo desofuscar JavaScript online

  1. Pega el código en JavaScript ofuscado. Hasta entonces el cuadro muestra «Pega aquí el JavaScript ofuscado…». El límite es de 5.000.000 de caracteres.
  2. Selecciona Opciones de desofuscación para abrir cuatro casillas, todas activadas por defecto: Desempaquetar arrays de cadenas, Evaluar constantes, Decodificar escapes hex y Unicode y Renombrar variables hex. Desmarca los pasos que no quieras.
  3. Pulsa Desofuscar. La pantalla Código desofuscado muestra el resultado como código resaltado de solo lectura.
  4. Lee las etiquetas que hay sobre el código. Indican qué ha cambiado, por ejemplo «3 accesos a array sustituidos», «5 expresiones simplificadas», «2 literales decodificados» o «4 variables renombradas». Si no se aplicó nada, la etiqueta dice «Aquí no había nada que desempaquetar ni simplificar, así que el código solo se ha reformateado.»
  5. Pulsa Copiar (el botón pasa a Copiado) o Descargar .js para guardar el código como desofuscado.js.
  6. Elige Editar código para volver a tu texto y ejecutarlo de nuevo con otras opciones.

Si el texto no es JavaScript válido, verás «Esto no es JavaScript válido: error de sintaxis en la línea N, columna M.» con la línea y la columna reales, y no se cambia nada.

Qué hace cada opción

Los pasos se ejecutan en ese orden, así que un acceso a un array puede desempaquetarse primero y luego unirse con sus vecinos al evaluar constantes. Los nombres de propiedades, las etiquetas y los nombres de import y export nunca se renombran, y la línea shebang del principio de un script se conserva.

Un ejemplo paso a paso

Esta entrada tiene un array de cadenas, un nombre de estilo hex, una propiedad entre comillas y una suma:

var _0x1a2b = ['hello', 'world', '\x68\x69']; function _0x3c(_0x4d) { console['log'](_0x1a2b[0] + ' ' + _0x1a2b[1], _0x4d, _0x1a2b[2]); } _0x3c(1 + 2 * 3);

Y este es el resultado:

function func1(arg1) { console.log("hello world", arg1, "hi"); } func1(7);

Las etiquetas dicen «3 accesos a array sustituidos», «5 expresiones simplificadas», «1 literal decodificado» y «2 variables renombradas». La salida real se reparte en varias líneas con sangría de 2 espacios.

Qué puede y qué no puede deshacer

La herramienta nunca ejecuta tu código, así que solo puede deshacer lo que se ve en el texto. Lo que necesita que el programa se ejecute antes se deja como está, en lugar de adivinarlo.

Es una ayuda para leer, no un escáner de seguridad. No comprueba si el código es dañino ni puede hacer seguro un código desconocido. Si un script viene de un sitio en el que no confías, no lo ejecutes solo porque el resultado se vea ordenado.

Por qué un array de cadenas rotado se queda como está

Muchos ofuscadores mueven los elementos de un array de cadenas con un bucle corto antes de la primera lectura, de modo que list[0] no es el primer elemento que ves en el código. Si se pusieran los elementos visibles, aparecería el texto equivocado en tu código.

Por eso la herramienta solo desempaqueta un array cuando cada uso es list[3] con un número dentro de rango, o list.length. Si el array se pasa a una función, se le añaden elementos, se reasigna o se lee con un índice que no puede calcular, ese array queda exactamente como está escrito.

Desminificar JavaScript y archivos grandes

El código minificado que no está ofuscado vuelve reformateado con sangría de 2 espacios, y la etiqueta indica que solo cambió el formato. Así funciona desminificar JavaScript aquí: nombres cortos como a y b no se renombran, porque no son de estilo hex y los nombres originales ya no existen. Si solo quieres dar formato a código que ya se lee bien, o embellecer también JSON, HTML y CSS, usa Formateador de código. Para volver a reducir hojas de estilo está Minificador de CSS, y para decodificar una cadena Base64 que hayas encontrado dentro de un script, Convertidor Base64.

Todo se ejecuta en un Web Worker, así que la página sigue respondiendo con archivos grandes. Las expresiones muy largas o muy anidadas pueden ser demasiado para la página, y entonces avisa de que el código es demasiado grande o tiene demasiados niveles anidados para procesarlo aquí.


Preguntas frecuentes

¿Cómo puedo desofuscar JavaScript?

Pega el código en «JavaScript ofuscado» y pulsa «Desofuscar». El código se convierte en un árbol de sintaxis, se desempaquetan los arrays de cadenas, se calculan las constantes, se decodifican los escapes, se renombran los nombres _0x y el árbol se vuelve a imprimir como código con sangría. Cópialo o pulsa «Descargar .js» para guardar desofuscado.js.

¿Hay un JavaScript deobfuscator que funcione online?

Sí, esta página lo es. Funciona en la pestaña de tu navegador: el código se analiza en un Web Worker y ni se sube ni se ejecuta. Trata arrays de cadenas sencillos, expresiones constantes, escapes hex y Unicode y nombres al estilo _0x. No deshace todos los tipos de ofuscación, y en esta página tienes la lista de lo que se queda como está.

¿Puede desofuscar código de obfuscator.io?

Solo las partes que no necesitan ejecutar código. Los escapes hex y Unicode se decodifican, las constantes se calculan y los nombres _0x se renombran a var1, func1 y arg1. El array de cadenas que obfuscator.io rota al arrancar con push(shift()), y las cadenas que se obtienen con una función decodificadora, se dejan como están, porque deshacerlas exige ejecutar el código.

¿Cómo se decodifican cadenas hex en JavaScript ofuscado?

Deja marcada «Decodificar escapes hex y Unicode» en «Opciones de desofuscación». Una cadena como \x68\u0069 pasa a hi, y un número hexadecimal como 0x1f pasa a 31. Solo se decodifican los escapes que están en el propio código; una cadena hex que el programa construye al ejecutarse, no.

¿Sirve también para desminificar JavaScript?

Sí, la salida siempre se vuelve a imprimir con sangría de 2 espacios, así que el código minificado se hace legible aunque no hubiera nada que desempaquetar. En ese caso el resultado muestra «Aquí no había nada que desempaquetar ni simplificar, así que el código solo se ha reformateado.» Los comentarios de la entrada se eliminan. Los nombres minificados como a y b no se pueden recuperar.

¿La herramienta ejecuta mi JavaScript?

No. El código solo se lee y se reescribe como texto. No hay eval, ni llamadas a Function, ni ejecución en la página ni en el Web Worker, y por eso los arrays rotados y las funciones decodificadoras se quedan como están. Tampoco es una comprobación de seguridad: el resultado se lee mejor, pero un escáner o un veredicto sobre malware es otro trabajo.

¿Por qué se quedó un array de cadenas en el resultado?

El array solo se desempaqueta cuando cada uso es un índice constante como list[3] o list.length. Si el código además lo rota, lo pasa a una función, le añade elementos o lo lee con un índice calculado, el array se deja intacto del todo, porque sustituir las lecturas ahí podría dar una cadena equivocada.

¿Qué hace «Renombrar variables hex»?

Da un nombre legible a nombres como _0x1a2b: var1 para variables, func1 para funciones y arg1 para parámetros. Cada uso se renombra a la vez, no se reutiliza ningún nombre que ya exista en el programa, y los nombres de propiedades y las etiquetas no se tocan. No puede recuperar los nombres originales, porque no están en el archivo.

¿Qué tamaño puede tener el código y qué pasa si hay un error?

Hasta 5.000.000 de caracteres. Si el código no es JavaScript válido, verás «Esto no es JavaScript válido: error de sintaxis en la línea N, columna M.» con los números reales, y no se cambia nada; tu texto sigue en el cuadro para que corrijas el punto.

¿Se sube mi código a algún sitio?

No. Analizar, reescribir e imprimir ocurre dentro de tu navegador, en un Web Worker, y no se envía nada a ningún servidor. Tampoco se ejecuta nunca el código.

Recomendado

Ayuda a mantener las herramientas gratis. ✨

Imágenes meramente ilustrativas. En calidad de Afiliado de Amazon, obtengo ingresos por las compras adscritas que cumplen los requisitos aplicables.