egodeath
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.
Installazione
npm install
npm run build
Utilizzo da riga di comando
# 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
Opzioni
| 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 |
Script npm
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
API programmatica
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.
Fase 3: Passaggi sugli identificatori
Fase 4: Post-trasformazioni
Iniezione di Codice Morto
Il codice morto viene iniettato in più punti con due strategie di generazione:
Punti di iniezione del codice morto:
- Casi CFF morti dei switch (~30% extra per funzione, scalato in base al budget)
- Ramificazioni else dei predicati opachi
- Blocchi morti indipendenti in funzioni non-CFF (controllati dal budget)
Riferimenti a Ricerche Accademiche
Diverse trasformazioni sono ispirate dalla ricerca crittografica sull'offuscamento sottoposta a revisione paritaria:
Strumenti di Verifica
Due strumenti di verifica misurano la qualità dell'offuscamento, situati in src/verification/:
Test di Circuito Nullo (verification/nullCircuitTest.ts)
Offusca una funzione reale e una funzione "nulla" (stessa forma, non fa nulla), quindi confronta 14 metriche strutturali per valutare quanto siano distinguibili. Maggiore somiglianza = migliore offuscamento.
import { runNullCircuitTest } from './verification/nullCircuitTest';
const result = runNullCircuitTest(realCode, paramCount, stmtCount, threshold, targetTokens);
console.log('Similarità:', result.similarity); // 0.0-1.0
Test per Funzioni Non Offuscabili (verification/unobfuscatableTests.ts)
7 casi di test dalle dimostrazioni di impossibilità del Paper 1 che tentano di estrarre segreti da codice offuscato:
import { runAllTests, printSummary } from './verification/unobfuscatableTests';
console.log(printSummary(runAllTests(10000)));
Test: funzione punto (password), numeri magici, stringhe canarino, chiavi incorporate, URL, pattern regex, firme del flusso di controllo.
Budget di Dimensione dell'Output
L'opzione --target-tokens controlla la dimensione dell'output tramite un budget di gonfiaggio che scala l'iniezione di codice morto (la principale leva di volume). Trasformazioni controllate dal budget:
| Rapporto Budget | Trasformazioni Abilitate |
|---|
| > 3 | Anti-debug, inneschi, CFF, predicati opachi, fusione a virgola |
| > 5 | Funzioni proxy, codifica chiavi proprietà, iniezione rumore, auto-integrità |
| > 8 | Esaurimento finestra di contesto |
| > 10 | Codifica variabili globali |
Il moltiplicatore del codice morto scala da 1x (rapporto 30) a 150x (rapporto 1500+), controllando il numero e la dimensione dei casi switch morti e dei rami dei predicati opachi.
Struttura del Progetto
src/
index.ts Punto di ingresso CLI
obfuscator.ts Orchestratore della pipeline principale (20 trasformazioni)
options.ts Sistema di budget e opzioni
types.ts Definizioni dei tipi AST
random.ts Generazione di nomi Unicode casuali (6-16 caratteri, 16 intervalli di script)
ast.ts Funzioni factory per nodi AST
keywords.ts Scoperta dinamica delle parole chiave (globalThis + pacchetto window)
globals.ts Gestione dello stato globale (mappe a prototipo nullo)
substitute.ts Utility per la sostituzione degli identificatori
declarations.d.ts Dichiarazioni di tipo per moduli
passes/
firstPass.ts Catalogazione degli identificatori
secondPass.ts Sostituzione degli identificatori + codifica delle stringhe
thirdPass.ts Iniezione di parametri fittizi
transforms/
antiDebug.ts Trappole eval("debugger") + cicli setInterval
tripwires.ts Controlli per input segreti su programma punturato [Paper 4]
noiseInjection.ts Rumore aritmetico ispirato a LPN [Paper 7]
controlFlowFlattening.ts while/switch + invio aritmetico modulare [Paper 3]
opaquePredicates.ts 15 predicati matematici sempre vero/falso
proxyFunctions.ts Dispatcher per appiattimento del grafo delle chiamate
contextExhaustion.ts Rumore ternario/void per riempimento contesto LLM
commaExpressions.ts Fusione di istruzioni tramite operatore virgola
globalVariableEncoding.ts eval+replace per globali
propertyKeyEncoding.ts Accesso calcolato a proprietà con registri per ambito
numberEncoding.ts 11 strategie di codifica bit a bit/aritmetica
selfIntegrity.ts Controlli runtime anti-manomissione [Paper 10]
stringArrayExtraction.ts XOR a catena + errori sparsi posizionali [Papers 2, 9]
deadCodeInjection.ts Codice morto basato su template + mutazione [Paper 3]
verification/
nullCircuitTest.ts Valutazione qualità codice morto [Paper 10]
unobfuscatableTests.ts Casi di test per estrazione segreti [Paper 1]
__tests__/ 300+ test unitari in 21 suite
tools/
obfuscate-package.ts Test di compatibilità pacchetti npm basati su webpack
tests/
input*.js File di input di test originali
Test
# Esegue tutti i test
npm test
# Esegue una suite di test specifica
npx jest controlFlowFlattening
npx jest tripwires
npx jest noiseInjection
# Test contro pacchetti npm (clona repository, webpack-bundle, offusca, esegue test)
npm run obfuscate-package # Tutti i 10 pacchetti
npm run obfuscate-package -- minimist semver # Pacchetti specifici
Strumento di Test di Compatibilità
Lo strumento tools/obfuscate-package.ts testa l'offuscatore contro pacchetti npm reali:
- Clona il repository git del pacchetto
- Installa tutte le dipendenze (incluse devDependencies per il testing)
- Costruisce il pacchetto se ha uno script di build
- Usa webpack per creare un bundle del punto di ingresso principale della libreria in un singolo file CommonJS
- Esegue l'offuscatore sul file bundle
- Sostituisce il punto di ingresso principale della libreria con il bundle offuscato
- Esegue la suite di test della libreria contro la versione offuscata
Posizioni di output
| Percorso | Contenuto |
|---|
dist/obfuscated/<pacchetto>/bundle.js | Il bundle webpack offuscato per ogni pacchetto |
dist/obfuscated/report.json | Report JSON completo con dimensioni dei bundle, stato di offuscamento, output dei test |
Licenza
MIT - Copyright 2026 Nicholas Starke