
Ingeniería inversa de JavaScript ofuscado visualmente. Encadena transformaciones, inspecciona cambios en el AST, escribe plugins de desofuscación reutilizables.
Un banco de trabajo visual para desofuscar JavaScript. Construye cadenas de transformación, recórrelas paso a paso, escribe tus propios plugins.


Esta aplicación revela el Árbol de Sintaxis Abstracta (AST) de un programa JavaScript. La idea surgió al analizar una muestra de malware relacionada con obfuscatio.io, lo que me llevó a aprender más sobre BabelJS para desofuscación. Si alguna vez has intentado aplicar ingeniería inversa a JS ofuscado (piensa en bundles de webpack, salida de obfuscator.io, muestras de malware empaquetadas), sabes que es doloroso. Esta herramienta te permite:
npm install
npm start
# Abre http://localhost:3000
Eso es todo.
Barra lateral izquierda - Todas las transformaciones disponibles (incorporadas + tu receta como plugins) incluyendo la cadena de recetas. (Piensa en Cyberchef)
Centro - Editores de entrada/salida. Pega tu código ofuscado a la izquierda y ve el código transformado a la derecha.
Paneles derechos - Visor de AST, analizador de ámbito, resumen fácil de ver.

BabelJS nos permite ver el ámbito y los enlaces. Esto es especialmente útil para ver, por ejemplo, si hay variables no utilizadas. Esta vista también permite buscar ubicaciones donde se referencia una variable.

Presiona el botón + o pulsa Ctrl+N para abrir el editor de scripts. Las transformaciones son solo código JS con acceso a:
// Variables globales disponibles:
ast // El AST de Babel analizado
traverse // Recorre el árbol: traverse({ Identifier(path) { ... } })
t // Tipos de Babel: t.isStringLiteral(node), t.identifier('x')
config // Configuración del usuario desde la tarjeta de receta
stats // Registra tus cambios: stats.replaced = 5
parser // Analiza código: parser.parse('var x = 1')
generate // Genera código: generate(node).code
run // Helper de evaluación: run('1+1') => 2 (PELIGRO. ESTÁ DISEÑADO PARA EJECUTARSE EN TU PROPIA MÁQUINA EN UN SANDBOX)
Ejemplo: eliminar todas las cadenas "debug" (StringLiteral):
// Los dos siguientes aparecerán como parámetros en la cadena de recetas, como se ve en la siguiente captura
const targetValue = config.targetValue || 'debug';
const removeMatches = config.removeMatches !== false;
traverse({
StringLiteral(path) {
if (path.node.value === targetValue) {
if (removeMatches) {
path.remove();
stats.removed = (stats.removed || 0) + 1;
}
}
}
});
Puedes elegir:
La captura siguiente muestra:

Ten en cuenta que pueden fallar dependiendo de la técnica de ofuscación y pueden requerir scripts personalizados. También puedes modificarlas y guardarlas como un nuevo script personalizado.
Coloca tus propios archivos .js en las subcarpetas plugins/<category>/. Aparecerán en la barra lateral agrupados por carpeta.

Por ejemplo:
Bracket-to-dot-notation.js → "Decode Strings")plugins/Utilities/ → categoría "nyx")/**
* Bracket to Dot Notation
* Changes things like console["log"] to console.log
*
* Category: utilities
*/
// Script Editor - Ctrl+Enter to run, Ctrl+E to close
// Use traverse(visitor) to modify the AST
// Access 't' for Babel types
traverse({
MemberExpression(path) {
if(path.node.computed === true){
// this is the bracket notation
prop = path.node.property
if(t.isStringLiteral(prop) &&
/^[a-zA-Z_][a-zA-Z_0-9]*$/.test(prop.value)
){
path.node.computed = false; // step 1
// step 2 change literal to identifier
path.node.property = t.identifier(prop.value)
}
}
}
});
Hay dos métodos para añadir parámetros:
targetValue y removeMatches):const targetValue = config.targetValue || 'debug';
const removeMatches = config.removeMatches !== false;

Incluye:

| Tecla | Acción |
|---|---|
Ctrl+E | Alternar editor de scripts |
Ctrl+Shift+E | Alternar panel de evaluación (PELIGROSO) |
Ctrl+S | Guardar proyecto |
TEN EN CUENTA QUE EL EJECUTABLE INDEPENDIENTE PUEDE TENER PROBLEMAS SI HAY MUCHOS NODOS ANIDADOS. ES POSIBLE QUE LA SOLUCIÓN ALTERNATIVA NO FUNCIONE SIEMPRE.
Para construir con npm, podemos usar lo siguiente:
npm run build # Solo Windows
La salida va a dist/. Copia la carpeta plugins/ junto al exe si quieres tus transformaciones personalizadas.
El código profundamente anidado (como JSFuck) puede desbordar la pila. El script de construcción intenta aumentarla automáticamente en Windows. Si obtienes desbordamientos de pila, intenta ejecutar desde el código fuente con npm start (usa --stack-size=65536).
No he descubierto cómo aumentar el tamaño de la pila al construir un ejecutable independiente. ¡Házmelo saber si sabes cómo!
Construido con:

¿Preguntas? ¿Problemas? Abre un issue en GitHub.
| Nombre | Qué hace |
|---|
| Beautify | Formatea el código de forma agradable |
| Constant Folding | 1 + 2 → 3, "a" + "b" → "ab" |
| Decode Strings | Decodifica \x48\x65\x6c\x6c\x6f → "Hello" |
| Inline Array Values | Inserta en línea accesos simples a elementos de arrays |
| Inline String Array | Inserta en línea arrays de cadenas usados por ofuscadores |
| Opaque Predicate Removal | Elimina condiciones siempre verdaderas/falsas |
| Remove Comments | Elimina todos los comentarios del código |
| Remove IIFE | Desenvuelve envoltorios (function(){...})() |
| Remove Unused Code | Elimina variables y funciones muertas |
| Simplify Literals | !0 → true, void 0 → undefined |