
Ein JavaScript-Obfuskator basierend auf kryptografischen Indistinguishability-Obfuskationstechniken
Dieses Projekt erreicht keine Ununterscheidbarkeits-Verschleierung. Sie sollten dieses Produkt nicht zum Schutz von Geheimnissen verwenden. Es dient dazu, Reverse Engineering abzuschrecken, nicht zu verhindern
Ein JavaScript-Verschleierer, der entwickelt wurde, um Code sowohl für Menschen als auch für LLMs extrem schwer lesbar und analysierbar zu machen. Geschrieben in TypeScript. Implementiert Techniken aus peer-reviewter kryptografischer Verschleierungsforschung.
npm install
npm run build
# Grundlegende Verwendung
node dist/index.js input.js > output.js
# Mit Ziel-Token-Budget (Standard: 2.000.000)
node dist/index.js --target-tokens 500000 input.js > output.js
# Minimale Verschleierung (kleine Ausgabe)
node dist/index.js --target-tokens 10000 input.js > output.js
# Maximale Aufblähung (10M Tokens)
node dist/index.js --target-tokens 10000000 input.js > output.js
# Verwendung der Umgebungsvariable
INPUT_FILE=input.js node dist/index.js > output.js
# Hilfe
node dist/index.js --help
| Option | Standard | Beschreibung |
|---|---|---|
--target-tokens <n> | 2000000 | Zielgröße der Ausgabe in Tokens. Kleine Eingaben werden bis zu dieser Grenze aufgebläht. Große Eingaben erzeugen weniger Aufblähung, um innerhalb des Budgets zu bleiben. |
--help, -h | Hilfemeldung anzeigen |
npm run build # Kompiliere TypeScript nach dist/
npm run start # Führe den Verschleierer aus (liest input.js)
npm run test # Führe die Testsuite aus
npm run obfuscate-package # Führe Kompatibilitätstests gegen npm-Pakete aus
const { obfuscate } = require('./dist/obfuscator');
const code = 'function add(a, b) { return a + b; }';
const obfuscated = obfuscate(code);
// Mit Optionen
const obfuscated = obfuscate(code, { targetTokens: 500000 });
Der Verschleierer wendet 20 Transformationen in 4 Phasen an. Jede Stufe baut auf der vorherigen auf.
| Reihenfolge | Transformation | Datei | Beschreibung |
|---|---|---|---|
| 1 | Anti-Debug-Fallen | transforms/antiDebug.ts | Injiziert eval("debugger")-Anweisungen und 10-20 setInterval-Schleifen mit Primzahl-Intervallen (5s-600s), die wiederholt Debugger-Breakpoints auslösen. Jede Instanz verwendet eindeutige codierte Zeichenfolgen. |
| 2 | Punkturierte Programm-Tripwires | transforms/tripwires.ts | Bettet versteckte Prüfungen ein, die Parameter-Hashes mit geheimen Werten vergleichen. 5 Hash-Muster (bitweiser Fingerabdruck, modulare Arithmetik, charCodeAt, numerischer Hash, typeof+length). Löst stille Zustandskorruption, busy loops oder wirft bei geheimen Eingaben. [Paper 4] |
| 3 | LPN-Rauschinjektion | transforms/noiseInjection.ts | Fügt zufälliges Rauschen in arithmetische Berechnungen hinzu und hebt es durch getrennte Pfade wieder auf. 6 Muster: add/sub, XOR, mul/div, geteilte Doppelvariable, berechnete Hash-Kette, Bit-Rotate. Zwischenwerte sind ohne Verfolgung der vollständigen Aufhebung bedeutungslos. [Paper 7] |
| Reihenfolge | Transformation | Datei | Beschreibung |
|---|---|---|---|
| 4 | Kontrollfluss-Abflachung | transforms/controlFlowFlattening.ts | Wandelt Funktionskörper in while(true) { switch((_s * P) % M) { ... } }-Zustandsautomaten um mit modularer arithmetischer Disposition — Fallwerte werden durch (stateId * multiplier) % modulus unter Verwendung zufälliger Primparameter codiert. [Paper 3] |
| 5 | Undurchsichtige Prädikate | transforms/opaquePredicates.ts | Injiziert if-Bedingungen, die immer true oder false ergeben, aber mathematisch schwer zu beweisen sind (z. B. (x*x+x)%2===0). 15 Prädikatformeln in den Kategorien modulare Arithmetik, bitweise Operatoren und Typüberprüfung. |
| 6 | Proxy-Funktionen | transforms/proxyFunctions.ts | Leitet alle Funktionsaufrufe über zwei Verteiler: _fc(fn, ...args) für einfache Aufrufe, _mc(obj, prop, ...args) für Methodenaufrufe. Verwendet Function.prototype.apply, das in einer lokalen Variablen erfasst wird, für Robustheit. |
| 7 | Kontextfenster-Erschöpfung | transforms/contextExhaustion.ts | Wickelt Ausdrücke in tief verschachtelte ternäre Operatoren mit undurchsichtigen Bedingungen, void-Ausdrucksketten und bedingte void-Padding. Zwingt LLMs, Kontextfenster-Tokens für Rauschen zu verschwenden. |
| 8 | Komma-Ausdruckszusammenlegung | transforms/commaExpressions.ts | Fasst aufeinanderfolgende Ausdrucksanweisungen zu einzelnen Komma-Ausdrücken zusammen: a(); b(); return c() wird zu return a(), b(), c(). |
| Reihenfolge | Durchlauf | Datei | Beschreibung |
|-------|------|-------------|
| 9 | Durchlauf 1: Katalogisierung | passes/firstPass.ts | Durchläuft den AST und katalogisiert jeden Identifikator, erstellt eine Globals-Karte, die jedem einen zufälligen 6-16 Zeichen langen Unicode-Namen zuweist, der aus 16 Skriptbereichen (CJK, Hangul, Griechisch, Kyrillisch, Devanagari, Thai, Arabisch, Katakana usw.) stammt. |
| 10 | Durchlauf 2: Ersetzung | passes/secondPass.ts | Ersetzt alle Identifikatornamen durch ihre verschleierten Unicode-Äquivalente. Codiert require()-Argumente als String.fromCharCode(...). Codiert statische import/export-Quellen als Unicode-escaped String-Literale. Ersetzt superClass-Referenzen von Klassen, Vorlagenliteral-Ausdrücke, Destrukturierungsmuster. |
| 11 | Durchlauf 3: Dummy-Parameter | passes/thirdPass.ts | Injiziert 0-15 zufällige ungenutzte Parameter in jede Funktionsdeklaration und jeden Ausdruck. Überspringt Funktionen mit Rest-Parametern. Entfernt alle Kommentare. |