Desofuscador de PowerShell

Cole um comando ou script de PowerShell ofuscado. Ele é decodificado camada a camada no seu navegador — nada é enviado, nada é executado — e o resultado é mostrado como texto inerte, com os padrões suspeitos listados como pistas a verificar.

A ofuscação de PowerShell esconde o que um script faz por trás de camadas: um -EncodedCommand em Base64, compressão gzip, códigos de caracteres, concatenação de cadeias, o operador de formato -f e escapes com acento grave — cada camada é retirada por sua vez até restar texto legível, ou o ponto onde o desenrolamento estático para. Esta ferramenta retira essas camadas uma de cada vez e mostra cada passo, para que veja o que o script diz sem o executar. Se o script veio de um registo de eventos do Windows, o visualizador EVTX lê o ficheiro .evtx e assinala os eventos 4104; para outros registos de texto, o analisador de registos encontra as linhas que importam. O artigo companheiro como desofuscar scripts de PowerShell explica as camadas e o fluxo de trabalho seguro em prosa.

Última atualização:

Até 200 KB (.txt ou .ps1). O ficheiro é lido no seu navegador e nunca sai do seu dispositivo. Nada é executado.

🔒 O seu script é desenrolado no seu navegador e nunca sai do seu dispositivo. Sem conta, sem envios, sem chamadas ao servidor — e nada aqui é executado.

O que acontece ao script que cola

Nada sai do seu navegador. O script é desenrolado localmente por JavaScript nesta página: sem envios, sem chamadas ao servidor, sem armazenamento, sem conta. Isto importa porque um script suspeito nunca deve ser colado numa conversa — uma conversa pode executá-lo, citá-lo ou guardá-lo — e nunca deve ser executado para ver o que faz. Fechar a página descarta-o.

O que um resultado limpo NÃO prova

Um resultado limpo não é prova de segurança. Significa que nenhuma camada conhecida se aplicou e nenhum indicador coincidiu — uma cadeia construída dinamicamente, um payload cifrado ou um valor que só existe em tempo de execução não podem ser desenrolados estaticamente, e um script sem indicadores pode continuar a ser malicioso.

Um indicador não é prova de malícia. Berços de transferência, IEX e comandos codificados têm usos legítimos em administração e implantação; cada coincidência é uma pista a verificar em contexto, não um veredicto.

Nunca execute um script desconhecido para descobrir o que faz. Descodifique-o de forma inerte, entregue o resultado ao seu EDR ou a uma sandbox, e trate o texto descodificado com a mesma suspeita que a forma codificada — é evidência, não um atestado de saúde.

Como funciona o desenrolamento

A ferramenta experimenta oito camadas por ordem, uma por passo, e repete até nenhuma camada se aplicar ou dez camadas terem sido retiradas: extração de -EncodedCommand (Base64 para UTF-16LE, com UTF-8 como alternativa); um blob Base64 simples; descompressão gzip ou deflate (a entrada pode vir primeiro envolta em Base64); sequências de códigos [char] e [char[]]; concatenação de cadeias com aspas mistas e várias linhas; o operador de formato -f; remoção de escapes com acento grave; e uma listagem de marcadores ${...} e $variável, que nunca são resolvidos porque os seus valores só existem em tempo de execução. Cada passo mostra o texto antes e depois, com a contagem de caracteres.

O que a ferramenta NÃO faz: nunca executa nada — o resultado é texto inerte, e a página não o pode executar nem por acidente. Não consegue desenrolar cadeias construídas dinamicamente, payloads cifrados ou valores que só existem em tempo de execução, e não julga se um script é seguro: os indicadores são coincidências de padrões, e um script que derrota todas as camadas é reportado como "não foi possível desenrolar mais", nunca como limpo.

O registo de blocos de script (evento 4104) regista o texto do script que o PowerShell realmente executou, mas os scripts longos são divididos em fragmentos de cerca de 4 KB, cada um com um ScriptBlockId, um MessageNumber e um MessageTotal. O separador de remontagem agrupa os fragmentos por ScriptBlockId, ordena-os por MessageNumber, junta-os e assinala qualquer parte em falta — um grupo com 2 de 3 partes e a parte 2 em falta está incompleto, e o texto em falta não pode ser adivinhado. O texto remontado alimenta o mesmo desofuscador.

Perguntas frequentes

Porque é que o resultado é mostrado como texto inerte em vez de um script executável?

Porque o objetivo da desofuscação é ler um script suspeito, não executá-lo. O texto descodificado pode continuar a transferir e executar um payload — mostrá-lo como texto inerte com um botão de cópia permite-lhe inspecioná-lo, partilhá-lo com o seu EDR ou uma sandbox, e nunca arriscar um duplo clique.

A ferramenta parou com "não foi possível desenrolar mais". E agora?

O texto restante usa uma camada que esta ferramenta não conhece, constrói as suas cadeias em tempo de execução, ou está cifrado — o desenrolamento estático chegou ao seu limite. Não o execute para descobrir: entregue a forma codificada e a descodificação parcial ao seu EDR ou a uma sandbox, e trate a camada desconhecida como motivo de suspeita, não como um resultado limpo.

O que faço com os indicadores?

Trate cada um como uma pergunta, não como uma resposta. Um berço de transferência pergunta para onde aponta o URL e se esse anfitrião é o esperado; um padrão de evasão de AMSI pergunta porque é que o script tenta cegar o scanner; um comando codificado pergunta o que a codificação escondia. Verifique cada um em contexto — no seu EDR, nos seus registos e na máquina de onde veio o script — antes de decidir seja o que for.