
Um ofuscador de JavaScript baseado em técnicas de ofuscação de indistinguibilidade criptográfica.
Este projeto não alcança ofuscação de indistinguibilidade. Você não deve usar este produto para proteger segredos. Ele existe para dificultar a engenharia reversa, não para impedi-la
Um ofuscador de JavaScript projetado para tornar o código extremamente difícil de ler e analisar tanto para humanos quanto para LLMs. Escrito em TypeScript. Implementa técnicas de pesquisa criptográfica de ofuscação revisada por pares.
npm install
npm run build
# Uso básico
node dist/index.js input.js > output.js
# Com orçamento de tokens alvo (padrão: 2.000.000)
node dist/index.js --target-tokens 500000 input.js > output.js
# Ofuscação mínima (saída pequena)
node dist/index.js --target-tokens 10000 input.js > output.js
# Inchaço máximo (10M de tokens)
node dist/index.js --target-tokens 10000000 input.js > output.js
# Usando variável de ambiente
INPUT_FILE=input.js node dist/index.js > output.js
# Ajuda
node dist/index.js --help
| Opção | Padrão | Descrição |
|---|---|---|
--target-tokens <n> | 2000000 | Tamanho alvo da saída em tokens. Entradas pequenas são inchadas até esse limite. Entradas grandes produzem menos inchaço para permanecer dentro do orçamento. |
--help, -h | Exibe a mensagem de ajuda |
npm run build # Compila TypeScript para dist/
npm run start # Executa o ofuscador (lê input.js)
npm run test # Executa a suíte de testes
npm run obfuscate-package # Executa testes de compatibilidade contra pacotes npm
const { obfuscate } = require('./dist/obfuscator');
const code = 'function add(a, b) { return a + b; }';
const obfuscated = obfuscate(code);
// Com opções
const obfuscated = obfuscate(code, { targetTokens: 500000 });
O ofuscador aplica 20 transformações em 4 fases. Cada etapa se baseia na anterior.
| Ordem | Transformação | Arquivo | Descrição |
|---|---|---|---|
| 1 | Armadilhas Anti-Debug | transforms/antiDebug.ts | Injeta instruções eval("debugger") e 10-20 loops de setInterval com intervalos de números primos (5s-600s) que disparam repetidamente breakpoints de depuração. Cada instância usa strings codificadas únicas. |
| 2 | Armadilhas de Programa Perfurado | transforms/tripwires.ts | Embute verificações ocultas que comparam hashes de parâmetros com valores secretos. 5 padrões de hash (impressão digital bit a bit, aritmética modular, charCodeAt, hash numérico, typeof+length). Dispara corrupção silenciosa de estado, loops ocupados ou lança exceções em entradas secretas. [Paper 4] |
| 3 | Injeção de Ruído LPN | transforms/noiseInjection.ts | Adiciona e cancela ruído aleatório por meio de caminhos divididos em cálculos aritméticos. 6 padrões: add/sub, XOR, mul/div, divisão em variável dupla, cadeia de hash computada, rotação de bits. Valores intermediários são sem sentido sem rastrear a anulação completa. [Paper 7] |
| Ordem | Transformação | Arquivo | Descrição |
|---|---|---|---|
| 4 | Achatamento de Fluxo de Controle | transforms/controlFlowFlattening.ts | Converte corpos de funções em máquinas de estado while(true) { switch((_s * P) % M) { ... } } com despacho de aritmética modular — os valores de caso são codificados por meio de (stateId * multiplier) % modulus usando parâmetros primos aleatórios. [Paper 3] |
| 5 | Predicados Opacos | transforms/opaquePredicates.ts | Injeta condições if que sempre avaliam para verdadeiro ou falso, mas são matematicamente difíceis de provar (por exemplo, (x*x+x)%2===0). 15 fórmulas de predicado em categorias de aritmética modular, operações bit a bit e verificação de tipo. |
| 6 | Funções Proxy | transforms/proxyFunctions.ts | Roteia todas as chamadas de função por meio de dois despachantes: _fc(fn, ...args) para chamadas simples, _mc(obj, prop, ...args) para chamadas de método. Usa Function.prototype.apply capturado em uma variável local para maior resiliência. |
| 7 | Exaustão da Janela de Contexto | transforms/contextExhaustion.ts | Envolve expressões em ternários profundamente aninhados com condições opacas, cadeias de expressões void e preenchimento condicional com void. Força LLMs a desperdiçar tokens da janela de contexto com ruído. |
| 8 | Mesclagem de Expressões com Vírgula | transforms/commaExpressions.ts | Colapsa instruções de expressão consecutivas em expressões de vírgula únicas: a(); b(); return c() torna-se return a(), b(), c(). |
| Ordem | Passo | Arquivo | Descrição |
|---|---|---|---|
| 9 | Passo 1: Catalogação | passes/firstPass.ts | Percorre a AST e cataloga cada identificador, construindo um mapa de globais que atribui a cada um um nome Unicode aleatório de 6 a 16 caracteres extraído de 16 intervalos de scripts (CJK, Hangul, Grego, Cirílico, Devanágari, Tailandês, Árabe, Katakana, etc.). |
| 10 | Passo 2: Substituição | passes/secondPass.ts | Substitui todos os nomes de identificadores por seus equivalentes Unicode ofuscados. Codifica argumentos de require() como String.fromCharCode(...). Codifica fontes estáticas de import/export como literais de string com escape unicode. Substitui referências de superClass, expressões de template literal e padrões de desestruturação. |
| 11 | Passo 3: Parâmetros Fantasma | passes/thirdPass.ts | Injeta de 0 a 15 parâmetros aleatórios não utilizados em toda declaração e expressão de função. Ignora funções com parâmetros rest. Remove todos os comentários. |