
Esegui reverse engineering di JavaScript offuscato visivamente. Combina trasformazioni, ispeziona i cambiamenti dell'AST, scrivi plugin di deoffuscamento riutilizzabili.
Un banco da lavoro visivo per deoffuscare JavaScript. Costruisci catene di trasformazione, percorrile passo dopo passo, scrivi i tuoi plugin.


Questa applicazione rivela l'Abstract Syntax Tree (AST) di un programma JavaScript. L'idea è nata analizzando un campione di malware correlato a obfuscatio.io, che mi ha portato a imparare di più su BabelJS per la deoffuscazione. Se hai mai provato a fare reverse engineering di JS offuscato (pensa: bundle webpack, output di obfuscator.io, campioni di malware impacchettati), sai quanto sia doloroso. Questo strumento ti permette di:
npm install
npm start
# Apri http://localhost:3000
Tutto qui.
Barra laterale sinistra - Tutte le trasformazioni disponibili (integrate + la tua ricetta come plugin), inclusa la catena della ricetta. (Pensa a Cyberchef)
Centro - Editor di input/output. Incolla il codice offuscato a sinistra e visualizza il codice trasformato a destra.
Pannelli di destra - Visualizzatore AST, analizzatore di scope, riepilogo facile da consultare.

BabelJS ci permette di visualizzare lo scope e i binding. Ciò è particolarmente utile, ad esempio, per individuare variabili inutilizzate. Questa vista consente anche di cercare le posizioni in cui una variabile viene referenziata.

Premi il pulsante + o premi Ctrl+N per aprire l'editor di script. Le trasformazioni sono semplici codice JS con accesso a:
// Globali disponibili:
ast // L'AST Babel parsato
traverse // Cammina l'albero: traverse({ Identifier(path) { ... } })
t // Tipi Babel: t.isStringLiteral(node), t.identifier('x')
config // Configurazione utente dalla card della ricetta
stats // Tieni traccia delle modifiche: stats.replaced = 5
parser // Parsa codice: parser.parse('var x = 1')
generate // Genera codice: generate(node).code
run // Helper per eval: run('1+1') => 2 (PERICOLOSO. È INTESO PER ESSERE ESEGUITO SULLA TUA MACCHINA IN UNA SANDBOX)
Esempio - rimuovere tutte le stringhe "debug" (StringLiteral):
// Le due righe seguenti appariranno come parametri nella catena della ricetta come mostrato nello screenshot successivo
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;
}
}
}
});
Puoi scegliere di:
Lo screenshot seguente mostra:

Nota che queste potrebbero fallire a seconda della tecnica di offuscamento e potrebbero richiedere script personalizzati. Puoi anche modificarle e salvarle come nuovo script personalizzato.
Inserisci i tuoi file .js nelle sottocartelle plugins/<categoria>/. Appariranno nella barra laterale raggruppati per cartella.

Ad esempio:
Bracket-to-dot-notation.js → "Decode Strings")plugins/Utilities/ → categoria "nyx")/**
* Bracket to Dot Notation
* Changes things like console["log"] to console.log
*
* Category: utilities
*/
// Script Editor - Ctrl+Enter per eseguire, Ctrl+E per chiudere
// Usa traverse(visitor) per modificare l'AST
// Accedi a 't' per i tipi Babel
traverse({
MemberExpression(path) {
if(path.node.computed === true){
// questa è la notazione con parentesi
prop = path.node.property
if(t.isStringLiteral(prop) &&
/^[a-zA-Z_][a-zA-Z_0-9]*$/.test(prop.value)
){
path.node.computed = false; // passo 1
// passo 2: cambia literal in identifier
path.node.property = t.identifier(prop.value)
}
}
}
});
Ci sono due metodi per aggiungere parametri:
targetValue e removeMatches)const targetValue = config.targetValue || 'debug';
const removeMatches = config.removeMatches !== false;

Include:

| Tasto | Azione |
|---|---|
Ctrl+E | Attiva/disattiva editor di script |
Ctrl+Shift+E | Attiva/disattiva pannello eval (PERICOLOSO) |
Ctrl+S | Salva progetto |
NOTA CHE L'ESEGUIBILE STANDALONE POTREBBE AVERE PROBLEMI SE CI SONO MOLTI NODI ANNIDATI. IL WORKAROUND POTREBBE NON FUNZIONARE A VOLTE.
Per compilare con npm, possiamo usare il comando:
npm run build # Solo Windows
L'output va in dist/. Copia la cartella plugins/ accanto all'eseguibile se vuoi le tue trasformazioni personalizzate.
Il codice profondamente annidato (come JSFuck) può far esplodere lo stack. Lo script di build cerca di aumentarlo automaticamente su Windows. Se ottieni overflow dello stack, prova a eseguire dal sorgente con npm start (usa --stack-size=65536)
Non ho ancora capito come aumentare la dimensione dello stack quando si compila in un eseguibile standalone. Fammi sapere se sai come fare!
Costruito con:

Domande? Problemi? Apri una issue su GitHub.
| Nome | Cosa fa |
|---|
| Beautify | Formatta il codice in modo ordinato |
| Constant Folding | 1 + 2 → 3, "a" + "b" → "ab" |
| Decode Strings | Decodifica \x48\x65\x6c\x6c\x6f → "Hello" |
| Inline Array Values | Inline semplici accessi a elementi di array |
| Inline String Array | Inline array di stringhe usate dagli offuscatori |
| Opaque Predicate Removal | Rimuove condizioni sempre vere/false |
| Remove Comments | Elimina tutti i commenti dal codice |
| Remove IIFE | Elimina i wrapper (function(){...})() |
| Remove Unused Code | Cancella variabili e funzioni morte |
| Simplify Literals | !0 → true, void 0 → undefined |