
Faça engenharia reversa de JavaScript ofuscado visualmente. Encadeie transformações, inspecione mudanças na AST, escreva plugins de desofuscação reutilizáveis.
Uma bancada visual para desofuscar JavaScript. Construa cadeias de transformação, percorra-as, escreva seus próprios plugins.


Este aplicativo revela a Árvore Sintática Abstrata (AST) de programas JavaScript. A ideia surgiu ao analisar uma amostra de malware relacionada ao obfuscatio.io, que me levou a aprender mais sobre o BabelJS para desofuscação. Se você já tentou fazer engenharia reversa de JS ofuscado (pense em bundles webpack, saída do obfuscator.io, amostras de malware empacotadas), sabe como é doloroso. Esta ferramenta permite que você:
npm install
npm start
# Open http://localhost:3000
É isso.
Barra lateral esquerda - Todas as transformações disponíveis (embutidas + sua receita como plugins) incluindo a cadeia de receita. (Pense no Cyberchef)
Centro - Editores de entrada/saída. Cole seu código ofuscado à esquerda e visualize o código transformado à direita.
Painéis direitos - Visualizador AST, analisador de escopo, resumo fácil de visualizar.

O BabelJS nos permite visualizar o escopo e as ligações. Isso é especialmente útil para ver se há variáveis não utilizadas, por exemplo. Esta visão também nos permite procurar locais onde uma variável está sendo referenciada.

Pressione o botão + ou pressione Ctrl+N para abrir o editor de script. As transformações são apenas código JS com acesso a:
// Available globals:
ast // The parsed Babel AST
traverse // Walk the tree: traverse({ Identifier(path) { ... } })
t // Babel types: t.isStringLiteral(node), t.identifier('x')
config // User config from the recipe card
stats // Track your changes: stats.replaced = 5
parser // Parse code: parser.parse('var x = 1')
generate // Generate code: generate(node).code
run // Eval helper: run('1+1') => 2 (DANGER. THIS IS MEANT TO BE RUN ON YOUR OWN MACHINE IN A SANDBOX)
Exemplo - remova todas as strings "debug" (StringLiteral):
// The following two will appear as parameter in recipe chain as seen in the next screenshot
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;
}
}
}
});
Você pode optar por:
A captura de tela abaixo mostra:

Observe que elas podem falhar dependendo da técnica de ofuscação e podem exigir scripts personalizados. Você também pode modificá-las e salvá-las como um novo script personalizado também.
Coloque seus próprios arquivos .js nas subpastas plugins/<category>/. Eles aparecerão na barra lateral agrupados por pasta.

Por exemplo:
Bracket-to-dot-notation.js → "Decode Strings")plugins/Utilities/ → categoria "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)
}
}
}
});
Existem dois métodos para adicionar parâmetros:
targetValue e removeMatches)const targetValue = config.targetValue || 'debug';
const removeMatches = config.removeMatches !== false;

Inclui:

| Tecla | Ação |
|---|---|
Ctrl+E | Alternar editor de script |
Ctrl+Shift+E | Alternar painel de avaliação (PERIGOSO) |
Ctrl+S | Salvar projeto |
OBSERVE QUE O INDEPENDENTE PODE TER PROBLEMAS SE HOUVER MUITOS NÓS ANINHADOS. A SOLUÇÃO ALTERNATIVA PODE NÃO FUNCIONAR ÀS VEZES.
Para construir com npm, podemos usar o seguinte
npm run build # Windows only
A saída vai para dist/. Copie a pasta plugins/ ao lado do executável se quiser suas transformações personalizadas.
Código profundamente aninhado (como JSFuck) pode estourar a pilha. O script de construção tenta aumentá-la automaticamente no Windows. Se você tiver estouros de pilha, tente executar a partir da fonte com npm start (usa --stack-size=65536)
Ainda não descobri como aumentar o tamanho da pilha ao construir em um executável independente. Por favor, me avise se você souber como!
Construído com:

Dúvidas? Problemas? Abra uma issue no GitHub.
| Nome | O que faz |
|---|
| Beautify | Formata o código de forma organizada |
| Constant Folding | 1 + 2 → 3, "a" + "b" → "ab" |
| Decode Strings | Decodes \x48\x65\x6c\x6c\x6f → "Hello" |
| Inline Array Values | Insere diretamente acessos simples a elementos de array |
| Inline String Array | Insere diretamente arrays de strings usados por ofuscadores |
| Opaque Predicate Removal | Remove condições sempre verdadeiras/falsas |
| Remove Comments | Remove todos os comentários do código |
| Remove IIFE | Desencapsula wrappers (function(){...})() |
| Remove Unused Code | Exclui variáveis e funções mortas |
| Simplify Literals | !0 → true, void 0 → undefined |