
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.
| 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 |
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.