
Reverse-Engineeren Sie visuell obfuskiertes JavaScript. Verketten Sie Transformationen, überprüfen Sie AST-Änderungen, schreiben Sie wiederverwendbare Deobfuscation-Plugins.
Eine visuelle Werkbank zum Entschleiern von JavaScript. Erstellen Sie Transformationsketten, durchlaufen Sie sie und schreiben Sie eigene Plugins.


Diese Anwendung zeigt den abstrakten Syntaxbaum (AST) von JavaScript-Programmen. Die Idee entstand bei der Analyse einer obfuscatio.io-verwandten Malware-Probe, was dazu führte, dass ich mehr über BabelJS zur Entschleierung lernte. Wenn Sie jemals versucht haben, verschleiertes JS zu reverse-engineeren (denken Sie an Webpack-Bundles, obfuscator.io-Ausgaben, gepackte Malware-Proben), wissen Sie, dass es mühsam ist. Dieses Tool ermöglicht Ihnen:
npm install
npm start
# Öffnen Sie http://localhost:3000
Das war's.
Linke Seitenleiste – Alle verfügbaren Transformationen (eingebaute + Ihre Rezeptur als Plugins) einschließlich der Rezeptkette. (Denken Sie an Cyberchef)
Mitte – Eingabe-/Ausgabe-Editoren. Fügen Sie Ihren verschleierten Code links ein und sehen Sie den transformierten Code rechts.
Rechte Panels – AST-Viewer, Bereichsanalysator, einfache Zusammenfassung.

BabelJS ermöglicht es uns, den Gültigkeitsbereich und die Bindungen anzuzeigen. Dies ist besonders nützlich, um z. B. ungenutzte Variablen zu erkennen. Diese Ansicht ermöglicht es uns auch, nach Stellen zu suchen, von denen aus eine Variable referenziert wird.

Drücken Sie die +-Taste oder Strg+N, um den Skript-Editor zu öffnen. Transformationen sind nur JS-Code mit Zugriff auf:
// Verfügbare Globals:
ast // Der geparste Babel-AST
traverse // Den Baum durchlaufen: traverse({ Identifier(path) { ... } })
t // Babel-Typen: t.isStringLiteral(node), t.identifier('x')
config // Benutzerkonfiguration aus der Rezeptkarte
stats // Änderungen verfolgen: stats.replaced = 5
parser // Code parsen: parser.parse('var x = 1')
generate // Code generieren: generate(node).code
run // Eval-Hilfsfunktion: run('1+1') => 2 (GEFAHR. SOLL AUF IHREM EIGENEN RECHNER IN EINER SANDBOX AUSGEFÜHRT WERDEN)
Beispiel – alle "debug"-Strings entfernen (StringLiteral):
// Die folgenden beiden werden als Parameter in der Rezeptkette erscheinen, wie im nächsten Screenshot zu sehen
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;
}
}
}
});
Sie können wählen:
Der Screenshot unten zeigt:

Beachten Sie, dass diese je nach Verschleierungstechnik fehlschlagen können und möglicherweise benutzerdefinierte Skripte erfordern. Sie können sie auch ändern und als neues benutzerdefiniertes Skript speichern.
Legen Sie Ihre eigenen .js-Dateien in plugins/<category>/-Unterordnern ab. Sie werden in der Seitenleiste nach Ordnern gruppiert angezeigt.

Zum Beispiel:
Bracket-to-dot-notation.js → "Decode Strings")plugins/Utilities/ → Kategorie "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)
}
}
}
});
Es gibt zwei Methoden, um Parameter hinzuzufügen:
targetValue und removeMatches)const targetValue = config.targetValue || 'debug';
const removeMatches = config.removeMatches !== false;

Enthält:

| Taste | Aktion |
|---|---|
Strg+E | Skript-Editor umschalten |
Strg+Umschalt+E | Eval-Panel umschalten (GEFÄHRLICH) |
Strg+S | Projekt speichern |
BEACHTEN SIE, DASS DIE STANDALONE-VERSION PROBLEME HABEN KANN, WENN ES VIELE VERSCHACHTELTE KNOTEN GIBT. DER WORKAROUND FUNKTIONIERT MÖGLICHERWEISE NICHT IMMER.
Um mit npm zu erstellen, können wir Folgendes verwenden
npm run build # Nur Windows
Die Ausgabe erfolgt in dist/. Kopieren Sie den plugins/-Ordner neben die exe, wenn Sie Ihre benutzerdefinierten Transformationen verwenden möchten.
Tief verschachtelter Code (wie JSFuck) kann den Stack sprengen. Das Build-Skript versucht, ihn automatisch unter Windows zu erhöhen. Wenn Sie Stack-Overflows erhalten, versuchen Sie, aus der Quelle mit npm start zu laufen (verwendet --stack-size=65536)
Ich habe nicht herausgefunden, wie ich die Stack-Größe erhöhen kann, wenn ich in eine ausführbare Standalone-Datei erstelle. Lassen Sie es mich wissen, wenn Sie wissen, wie!
Erstellt mit:

Fragen? Probleme? Öffnen Sie ein GitHub-Issue.
| Name | Was es tut |
|---|
| Beautify | Formatiert Code ordentlich |
| Constant Folding | 1 + 2 → 3, "a" + "b" → "ab" |
| Decode Strings | Dekodiert \x48\x65\x6c\x6c\x6f → "Hello" |
| Inline Array Values | Fügt einfache Array-Elementzugriffe inline ein |
| Inline String Array | Fügt von Verschleierern verwendete String-Arrays inline ein |
| Opaque Predicate Removal | Entfernt immer-wahre/falsche Bedingungen |
| Remove Comments | Entfernt alle Kommentare aus dem Code |
| Remove IIFE | Entfernt (function(){...})()-Wrapper |
| Remove Unused Code | Löscht tote Variablen und Funktionen |
| Simplify Literals | !0 → true, void 0 → undefined |