O que é e por que você precisa conhecer agatha van helsing
Se você trabalha com análise de malware ou precisa investigar código JavaScript ofuscado em tráfego de rede, provavelmente já perdeu horas tentando entender o que um script realmente faz. A ferramenta que vai te ajudar com isso se chama agatha van helsing. Ela foi desenvolvida para desofuscação e análise estática de JavaScript malicioso, com foco em técnicas comuns como packers, eval-based payloads e encode-heavy ofuscação.
Como começar a usar agatha van helsing
O projeto está no GitHub e a instalação básica é direta. Você clona o repositório, instala as dependências com npm e roda os scripts de análise. O fluxo típico envolve passar um arquivo JS ofuscado para a ferramenta e deixar que ela extraia strings, identifique padrões de chamada e reconstrua a estrutura lógica do código. Uma coisa que a documentação oficial nem sempre deixa clara: a ferramenta funciona melhor quando você passa para ela um script que já foi parcialmente limpo. Se o arquivo tiver milhares de linhas de código morta ou ifdefs desnecessários, o tempo de processamento dispara e a saída pode ficar confusa. No meu caso, eu costumo rodar um pré-processamento com um simples parser AST para remover blocos mortos antes de jogar no Agatha. Isso reduz o tempo de análise de algo em torno de 20 minutos para cerca de 3 minutos em scripts médios.
Dentro das opções disponíveis, a flag que mais uso é a de extração de strings decodificadas combinada com a análise de fluxos de controle. Juntas, elas conseguem reconstruir boa parte da lógica de comunicação C2, especialmente quando o malware usa rotas de decodificação recursivas.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Pegadinhas que ninguém conta sobre a ferramenta
A principal limitação prática é que o Agatha não lida bem com ofuscação baseada em anti-análise runtime. Se o script detecta ambiente virtualizado ou usa técnicas de polyglot (código que é válido em múltiplos contextos), a análise estática simplesmente quebra ou gera saída errada. Já vi casos onde o malware injetava código diferencial dependendo da presença de um debugger, e a ferramenta puxava o payload de contra-inteligência em vez do payload real. Outro problema é a memória. Scripts muito grandes — digamos, mais de 500KB após a ofuscação — podem fazer o processo estourar a memória disponível. A solução que encontrei foi dividir o script em chunks menores usando um regex que identifica seções independentes, processar cada chunk separadamente e depois juntar os resultados manualmente. Funciona, mas exige paciência e alguns scripts de apoio seus.
agatha van helsing também não tem suporte nativo para JavaScript moderno com sintaxe ES6+ complexa como arrow functions aninhadas com captura de escopo. Quando encontra esses padrões, ele tende a perder o rastro das variáveis. A workaround que eu uso é transformar o código de volta para ES5 com o Babel antes de passar para a análise. É um passo extra, mas faz diferença significativa na qualidade do output.
Alternativas quando o Agatha não chega
Se o script que você está analisando usa ofuscação do tipo obfuscator.io com configurações pesadas, ou se tem proteção anti-tampering, o Agatha por si só não resolve. Nesses casos, combinar com ferramentas como de4js ou js-beautify como primeiro passo de normalização costuma dar melhores resultados. Às vezes o que você precisa não é de uma análise profunda, apenas de limpar a formatação para conseguir enxergar o padrão de ofuscação que está sendo usado. Depois disso, o Agatha entra como segunda camada para decodificar o que sobrou. O link para o projeto é github.com/3v15/flares-jois, onde você encontra o repositório com os scripts, readme atualizado e exemplos de uso. A comunidade é pequena mas ativa, então issues com casos específicos de malware costumam receber resposta dos mantenedores em poucos dias.
Resumindo o que funciona na prática: limpe o input antes, divida scripts grandes, transforme ES6 para ES5 se necessário, e use como parte de um pipeline junto com outras ferramentas. A ferramenta sozinha é capaz, mas o resultado melhora muito quando você trata ela como uma peça do fluxo e não como solução única.