
Un offuscatore JavaScript basato su tecniche di offuscamento a indistinguibilità crittografica.
Questo progetto non raggiunge l'offuscamento indistinguibile. Non dovresti usare questo prodotto per proteggere segreti. Serve a scoraggiare il reverse engineering, non a prevenirlo
Un offuscatore JavaScript progettato per rendere il codice estremamente difficile da leggere e analizzare sia per umani che per LLM. Scritto in TypeScript. Implementa tecniche dalla ricerca crittografica sull'offuscamento sottoposta a revisione paritaria.
npm install
npm run build
# Utilizzo base
node dist/index.js input.js > output.js
# Con budget di token target (default: 2.000.000)
node dist/index.js --target-tokens 500000 input.js > output.js
# Offuscamento minimale (output piccolo)
node dist/index.js --target-tokens 10000 input.js > output.js
# Massimo gonfiaggio (10M token)
node dist/index.js --target-tokens 10000000 input.js > output.js
# Utilizzo di variabile d'ambiente
INPUT_FILE=input.js node dist/index.js > output.js
# Aiuto
node dist/index.js --help
| Opzione | Predefinito | Descrizione |
|---|---|---|
--target-tokens <n> | 2000000 | Dimensione target dell'output in token. Input piccoli vengono gonfiati fino a questo limite. Input grandi producono meno gonfiaggio per rimanere entro il budget. |
--help, -h | Mostra il messaggio di aiuto |
npm run build # Compila TypeScript in dist/
npm run start # Esegue l'offuscatore (legge input.js)
npm run test # Esegue la suite di test
npm run obfuscate-package # Esegue test di compatibilità su pacchetti npm
const { obfuscate } = require('./dist/obfuscator');
const code = 'function add(a, b) { return a + b; }';
const obfuscated = obfuscate(code);
// Con opzioni
const obfuscated = obfuscate(code, { targetTokens: 500000 });
L'offuscatore applica 20 trasformazioni in 4 fasi. Ogni stadio si basa sul precedente.
| Ordine | Trasformazione | File | Descrizione |
|---|---|---|---|
| 1 | Trappole Anti-Debug | transforms/antiDebug.ts | Inietta istruzioni eval("debugger") e 10-20 cicli setInterval con intervalli di numeri primi (5s-600s) che attivano ripetutamente breakpoint del debugger. Ogni istanza utilizza stringhe codificate uniche. |
| 2 | Inneschi per Programmi Punturati | transforms/tripwires.ts | Incorpora controlli nascosti che confrontano hash di parametri con valori segreti. 5 modelli di hash (impronta bit a bit, aritmetica modulare, charCodeAt, hash numerico, typeof+length). Attiva corruzione silenziosa dello stato, cicli infiniti o lancia eccezioni su input segreti. [Paper 4] |
| 3 | Iniezione di Rumore LPN | transforms/noiseInjection.ts | Aggiunge e annulla rumore casuale attraverso percorsi divisi in calcoli aritmetici. 6 modelli: add/sub, XOR, mul/div, variabile doppia divisa, catena di hash calcolata, rotazione di bit. I valori intermedi sono privi di significato senza tracciare l'intera cancellazione. [Paper 7] |
| Ordine | Trasformazione | File | Descrizione |
|---|---|---|---|
| 4 | Appiattimento del Flusso di Controllo | transforms/controlFlowFlattening.ts | Converte i corpi delle funzioni in macchine a stati while(true) { switch((_s * P) % M) { ... } } con invio aritmetico modulare — i valori dei case sono codificati tramite (idStato * moltiplicatore) % modulo usando parametri primi casuali. [Paper 3] |
| 5 | Predicati Opachi | transforms/opaquePredicates.ts | Inietta condizioni if che valutano sempre vero o falso ma sono matematicamente difficili da dimostrare (ad es., (x*x+x)%2===0). 15 formule di predicato tra aritmetica modulare, bit a bit e categorie di tipo. |
| 6 | Funzioni Proxy | transforms/proxyFunctions.ts | Instrada tutte le chiamate di funzione attraverso due dispatcher: _fc(fn, ...args) per chiamate semplici, _mc(obj, prop, ...args) per chiamate di metodo. Utilizza Function.prototype.apply catturato in una variabile locale per robustezza. |
| 7 | Esaurimento della Finestra di Contesto | transforms/contextExhaustion.ts | Avvolge le espressioni in ternari profondamente annidati con condizioni opache, catene di espressioni void e padding condizionale void. Costringe i LLM a sprecare token della finestra di contesto in rumore. |
| 8 | Fusione di Espressioni a Virgola | transforms/commaExpressions.ts | Comprime istruzioni di espressioni consecutive in singole espressioni a virgola: a(); b(); return c() diventa return a(), b(), c(). |
| Ordine | Passaggio | File | Descrizione |
|---|---|---|---|
| 9 | Passaggio 1: Catalogazione | passes/firstPass.ts | Attraversa l'AST e cataloga ogni identificatore, costruendo una mappa dei globali che assegna a ciascuno un nome Unicode casuale di 6-16 caratteri scelto da 16 intervalli di script (CJK, Hangul, Greco, Cirillico, Devanagari, Thai, Arabo, Katakana, ecc.). |
| 10 | Passaggio 2: Sostituzione | passes/secondPass.ts | Sostituisce tutti i nomi di identificatore con i loro equivalenti Unicode offuscati. Codifica gli argomenti di require() come String.fromCharCode(...). Codifica le sorgenti statiche di import/export come stringhe letterali con escape Unicode. Sostituisce i riferimenti a superClass delle classi, le espressioni di template literal, i pattern di destrutturazione. |
| 11 | Passaggio 3: Parametri Fittizi | passes/thirdPass.ts | Inietta 0-15 parametri casuali non utilizzati in ogni dichiarazione ed espressione di funzione. Salta le funzioni con parametri rest. Rimuove tutti i commenti. |