Ajuda

Desofuscar JavaScript online: de código ofuscado a código legível

Um desofuscador de JavaScript desfaz os truques que deixam o código difícil de ler. Este desempacota arrays de strings simples, calcula expressões constantes, decodifica escapes hex e Unicode e renomeia nomes no estilo _0x; depois mostra o resultado com recuo de 2 espaços. Ele faz isso lendo o código, não executando: seu JavaScript nunca é executado nem enviado, e parte da ofuscação, listada abaixo, é deixada como está.


Como desofuscar JavaScript online

  1. Cole o código em JavaScript ofuscado. Até lá, o campo mostra “Cole o JavaScript ofuscado aqui…”. O limite é de 5.000.000 de caracteres.
  2. Selecione Opções de desofuscação para abrir quatro caixas de seleção, todas ativadas por padrão: Desempacotar arrays de strings, Avaliar constantes, Decodificar escapes hex e Unicode e Renomear variáveis hex. Desmarque as etapas que você não quiser.
  3. Pressione Desofuscar. A tela Código desofuscado mostra o resultado como código destacado, somente para leitura.
  4. Leia as etiquetas acima do código. Elas dizem o que mudou, por exemplo “3 acessos ao array substituídos”, “5 expressões simplificadas”, “2 literais decodificados” ou “4 variáveis renomeadas”. Se nada foi aplicado, a etiqueta diz “Não havia nada para desempacotar ou simplificar, então o código foi apenas reformatado.”
  5. Pressione Copiar (ele vira Copiado) ou Baixar .js para salvar o código como desofuscado.js.
  6. Escolha Editar código para voltar ao seu texto e executar de novo com outras opções.

Se o texto não for JavaScript válido, você vê “Isto não é JavaScript válido: erro de sintaxe na linha N, coluna M.” com a linha e a coluna reais, e nada é alterado.

O que cada opção faz

As etapas rodam nessa ordem, então um acesso ao array pode ser desempacotado primeiro e depois unido aos vizinhos pela avaliação de constantes. Nomes de propriedades, rótulos e nomes de import e export nunca são renomeados, e a linha shebang no topo de um script é mantida.

Um exemplo passo a passo

Esta entrada tem um array de strings, um nome no estilo hex, uma propriedade entre aspas e uma soma:

var _0x1a2b = ['hello', 'world', '\x68\x69']; function _0x3c(_0x4d) { console['log'](_0x1a2b[0] + ' ' + _0x1a2b[1], _0x4d, _0x1a2b[2]); } _0x3c(1 + 2 * 3);

E este é o resultado:

function func1(arg1) { console.log("hello world", arg1, "hi"); } func1(7);

As etiquetas dizem “3 acessos ao array substituídos”, “5 expressões simplificadas”, “1 literal decodificado” e “2 variáveis renomeadas”. A saída real fica distribuída em várias linhas, com recuo de 2 espaços.

O que ele consegue e não consegue desfazer

A ferramenta nunca executa seu código, então só consegue desfazer o que está visível no texto. Tudo o que exige rodar o programa antes é deixado como está, em vez de ser adivinhado.

É um auxílio de leitura, não um scanner de segurança. Ele não verifica se o código é nocivo e não torna seguro um código desconhecido. Se um script veio de uma fonte em que você não confia, não o execute só porque a saída parece organizada.

Por que um array de strings rotacionado fica onde está

Muitos ofuscadores movem os itens de um array de strings com um laço curto antes da primeira leitura, então list[0] não é o primeiro item que você vê no código-fonte. Colocar os itens visíveis no lugar poria o texto errado no seu código.

Por isso a ferramenta só desempacota um array quando todo uso é list[3] com um número dentro do intervalo, ou list.length. Se o array é passado a uma função, recebe push, é reatribuído ou é lido com um índice que a ferramenta não consegue calcular, ele permanece exatamente como foi escrito.

Desminificar JavaScript e arquivos grandes

O código minificado que não está ofuscado volta reformatado com recuo de 2 espaços, e a etiqueta diz que só o layout mudou. É assim que desminificar JavaScript funciona aqui: nomes curtos como a e b não são renomeados, porque não são do estilo hex e os nomes originais se perderam. Para formatar um código que já é legível, ou para embelezar também JSON, HTML e CSS, use o Formatador de Código. Para reduzir folhas de estilo de novo há o Minificador de CSS, e para decodificar uma string Base64 encontrada dentro de um script, o Conversor Base64.

Tudo roda em um Web Worker, então a página continua responsiva com arquivos grandes. Expressões muito longas ou muito aninhadas podem ser demais para a página, e aí ela avisa que o código é grande demais ou aninhado demais para ser processado aqui.


Perguntas frequentes

Como desofuscar JavaScript?

Cole o código em “JavaScript ofuscado” e pressione “Desofuscar”. O código vira uma árvore de sintaxe, os arrays de strings são desempacotados, as constantes calculadas, os escapes decodificados, os nomes _0x renomeados, e a árvore é impressa de volta como código com recuo. Copie o resultado ou pressione “Baixar .js” para salvar desofuscado.js.

Existe um desofuscador de JavaScript que funcione online?

Sim, esta página é um. Ele roda na aba do seu navegador: o código é analisado em um Web Worker e nunca é enviado nem executado. Trata arrays de strings simples, expressões constantes, escapes hex e Unicode e nomes no estilo _0x. Ele não desfaz todo tipo de ofuscação, e a lista do que fica como está aparece nesta página.

Dá para desofuscar código do obfuscator.io?

Só as partes que não exigem executar código. Escapes hex e Unicode são decodificados, constantes calculadas e nomes _0x renomeados para var1, func1 e arg1. O array de strings que o obfuscator.io rotaciona na inicialização com push(shift()), e as strings obtidas por uma função decodificadora, ficam como estão, porque desfazê-las exigiria executar o código.

Como decodificar strings hex em JavaScript ofuscado?

Deixe marcada “Decodificar escapes hex e Unicode” em “Opções de desofuscação”. Uma string como \x68\u0069 vira hi, e um número hexadecimal como 0x1f vira 31. Só os escapes que estão no próprio código são decodificados; uma string hex que o programa monta ao rodar não é.

Ele também serve para desminificar JavaScript?

Sim, a saída é sempre impressa de novo com recuo de 2 espaços, então o código minificado fica legível mesmo quando não havia nada para desempacotar. Nesse caso o resultado mostra “Não havia nada para desempacotar ou simplificar, então o código foi apenas reformatado.” Os comentários da entrada são removidos. Nomes minificados como a e b não podem ser recuperados.

A ferramenta executa meu JavaScript?

Não. O código só é lido e reescrito como texto. Não há eval, nem chamada a Function, nem execução na página ou no Web Worker, e é por isso que arrays rotacionados e funções decodificadoras ficam como estão. Também não é uma verificação de segurança: a saída fica mais fácil de ler, mas um scanner ou um veredito sobre malware é outro trabalho.

Por que um array de strings ficou na saída?

O array só é desempacotado quando todo uso é um índice constante, como list[3] ou list.length. Se o código também o rotaciona, o passa a uma função, adiciona itens com push ou o lê com um índice calculado, o array é deixado intacto, porque substituir as leituras ali poderia dar a string errada.

O que “Renomear variáveis hex” faz?

Dá um nome legível a nomes como _0x1a2b: var1 para variáveis, func1 para funções e arg1 para parâmetros. Cada uso é renomeado junto, nenhum nome que já exista no programa é reaproveitado, e nomes de propriedades e rótulos nunca são tocados. Ele não consegue recuperar os nomes originais, que não estão no arquivo.

Qual o tamanho máximo do código e o que acontece se houver um erro?

Até 5.000.000 de caracteres. Se o código não for JavaScript válido, você vê “Isto não é JavaScript válido: erro de sintaxe na linha N, coluna M.” com os números reais, e nada é alterado; seu texto continua no campo para você corrigir o ponto.

Meu código é enviado para algum lugar?

Não. Analisar, reescrever e imprimir acontece dentro do seu navegador, em um Web Worker, e nada é enviado a um servidor. O código também nunca é executado.