COVIL HACKER

, ! .


» COVIL HACKER » rachaduras/inversão » Artigo desofuscação C#


Artigo desofuscação C#

1 2 2

1

Descrição
de4dot é um descompactador e descompactador .NET de código aberto (GPLv3) escrito em C#. Ele fará o possível para restaurar um assembly compactado e ofuscado para quase o assembly original. A maior parte da ofuscação pode ser completamente restaurada (por exemplo, criptografia de string), mas a renomeação de símbolos é impossível de restaurar, pois os nomes originais (geralmente) não fazem parte da montagem ofuscada.

Ele usa dnlib para ler e gravar assemblies, portanto, certifique-se de obtê-lo ou não compilará.
É GRATUITO, mas NÃO TEM SUPORTE
Não há suporte. Não me envie um e-mail se não puder usá-lo ou se não conseguir desofuscar um arquivo ofuscado com um ofuscador atualizado.

Em vez disso, tente atualizar o de4dot você mesmo. É muito mais fácil do que você pensa. Se não puder, pesquise na Internet e você encontrará alguns fóruns onde poderá fazer sua pergunta.

Características
Aqui está uma lista pseudo-aleatória das coisas que ele fará, dependendo de qual ofuscador foi usado para ofuscar um assembly:

Métodos em linha. Alguns ofuscadores movem pequenas partes de um método para outro método estático e o chamam.
Descriptografar strings estática ou dinamicamente
Decifre outras constantes. Alguns ofuscadores também podem criptografar outras constantes, como todos os inteiros, todos os duplos, etc.
Descriptografar métodos estática ou dinamicamente
Remova os métodos de proxy. Muitos ofuscadores substituem a maioria/todas as instruções de chamada por uma chamada para um delegado. Esse delegado, por sua vez, chama o método real.
Renomeie os símbolos. Mesmo que a maioria dos símbolos não possa ser restaurada, ele os renomeará para strings legíveis por humanos. Às vezes, alguns dos nomes originais podem ser restaurados.
Desvirtualizar código virtualizado
Descriptografar recursos. Muitos ofuscadores têm a opção de criptografar recursos .NET.
Descriptografar arquivos incorporados. Muitos ofuscadores têm a opção de incorporar e possivelmente criptografar/compactar outros assemblies.
Remover código de detecção de adulteração
Remova o código anti-depuração
Controle de desofuscação de fluxo. Muitos ofuscadores modificam o código IL para que pareça um código espaguete, tornando muito difícil entender o código.
Restaurar campos de classe. Alguns ofuscadores podem mover campos de uma classe para alguma outra classe criada pelo ofuscador.
Converta um PE exe em um .NET exe. Alguns ofuscadores agrupam um assembly .NET dentro de um Win32 PE para que um descompilador .NET não possa ler o arquivo.
Remove a maioria/todas as classes inúteis adicionadas pelo ofuscador.
Corrige alguns erros do peverify. Muitos dos ofuscadores têm erros e criam código não verificável por engano.
Restaure os tipos de parâmetros e campos do método
Obfuscators/packers suportados
Agile.NET (também conhecido como CliSecure)
Babel.NET
CodeFort
CodeVeilName
CodeWall
CryptoObfuscator
Obfuscator DeepSea
DotfuscatorName
Reator .NET
Eazfuscator.NET
Goliath.NET
ILProtetor
MaxtoCode
URGENTE
Remexer
Skater.NET
SmartAssembly
Spices.Net
Xenocódigo
Alguns dos ofuscadores acima raramente são usados ​​(por exemplo, Goliath.NET), então eles tiveram muito menos testes. Ajude-me relatando bugs ou problemas que encontrar.

Aviso
Às vezes, o assembly ofuscado e todas as suas dependências são carregados na memória para execução. Use um ambiente de sandbox seguro se suspeitar que o assembly ou os assemblies sejam malware.

Mesmo que a versão atual do de4dot não carregue um determinado assembly na memória para execução, uma versão futura poderá.

Como usar o de4dot
usuários N00b
Arraste e solte o(s) arquivo(s) em de4dot.exe e aguarde alguns segundos.

Desofuscar mais de um arquivo por vez
Quando mais de um assembly foi ofuscado, é muito provável que você deva desofuscar todos eles ao mesmo tempo, a menos que desabilite a renomeação de símbolo. O motivo é que, se o assembly A tiver uma referência à classe C no assembly B e você renomear os símbolos apenas no assembly B, a classe C poderá ser renomeada para, por exemplo. Class0, mas a referência no assembly A ainda faz referência a uma classe chamada C no assembly B. Se você desofuscar os dois assemblies ao mesmo tempo, todas as referências também serão atualizadas.

Encontre todos os arquivos ofuscados e desofusque-os
A linha de comando a seguir irá desofuscar todos os assemblies que foram ofuscados por um ofuscador suportado e salvar os assemblies para c:\output
de4dot -r c:\input -ru -ro c:\output
-r significa pesquisa recursiva. -ru significa que deve ignorar arquivos desconhecidos. -rosignifica que ele deve colocar os arquivos de saída no seguinte diretório. Normalmente, você primeiro copia c:\inputpara  c:\outpute, em seguida, executa o comando. Dessa forma, todos os arquivos estarão em c:\output, mesmo os não-assemblies e os non-processed assemblies. Quando o de4dot estiver concluído, basta clicar duas vezes na montagem principal c:\outpute, com sorte, deve iniciar.
Detectar ofuscador
Use a -dopção para detectar o ofuscador sem desofuscar nenhum assembly.

Encontre todos os assemblies .NET e detecte o obfuscator. Se for um ofuscador não suportado ou se não for ofuscado, ele imprimirá "Obfuscator desconhecido".

de4dot -d -r c:\input

Igual ao anterior, exceto que mostrará apenas quais arquivos foram ofuscados por um ofuscador compatível.

de4dot -d -r c:\input -ru

Detectar ofuscador

de4dot -d file1.dll file2.dll file3.dll

Preservando tokens de metadados
Às vezes, em casos raros, você deseja preservar os tokens de metadados. Use --preserve-tokens ou --preserve-table. Considere também usar --keep-types, pois não removerá nenhum tipo e método adicionado pelo ofuscador. Outra opção útil é --dont-create-params. Se usado, o renomeador não criará linhas de Param para parâmetros de método que não tenham uma linha de Param. Dessa forma, a tabela ParamPtr não será adicionada aos seus assemblies. O Peverify tem um bug e não o suporta (você verá muitos "erros").

Os heaps #Strings, #US e #Blob também podem ser preservados usando --preserve-strings, --preserve-us e --preserve-blob, respectivamente. Desses três, --preserve-us é o mais útil, pois a instrução ldstr e o módulo.ResolveString() fazem referência direta ao heap #US.

--preserve-sig-data deve ser usado se o obfuscator adicionar dados extras no final das assinaturas que ele usa para seu próprio propósito, por exemplo. como chaves de decodificação. Confuser é um ofuscador que faz isso.

--preserve-tokens preserva todos os tokens importantes, mas também habilita --preserve-us, --preserve-blob e --preserve-sig-data.

Se for detectado como um ofuscador desconhecido (sem suporte) (ou se você forçá-lo com -p un), todos os tokens serão preservados, incluindo a pilha #US e quaisquer dados extras no final das assinaturas. Além disso, nenhum tipo de obfuscator, campos ou métodos são removidos.

Preserve todos os tokens importantes, #US, #Blob, dados extras de assinatura.

de4dot --preserve-tokens file1.dll

Preserve todos os tokens importantes, #US, #Blob, dados de assinatura extras e não remova tipos/campos adicionados pelo obfuscator

de4dot --keep-types --preserve-tokens file1.dll

Preserve todos os tokens importantes, #US, #Blob, dados sig extras e não crie linhas Param extras para evitar que a tabela ParamPtr seja criada.

de4dot --dont-create-params --preserve-tokens file1.dll

Preserve todos os tokens importantes, exceto os tokens Param.

de4dot --preserve-table all,-pd file1.dll

Descriptografando strings dinamicamente
Embora o de4dot suporte muitos ofuscadores, ainda há alguns que ele não suporta. Para descriptografar strings, primeiro você precisa descobrir qual método ou métodos descriptografam strings. Para obter o token de método desses descriptografadores de string, você pode usar o ILDASM com a opção 'mostrar tokens de metadados' habilitada. Um token de método é um número de 32 bits e começa com 06, por exemplo. 06012345.

Este comando carregará o assembly file1.dll na memória chamando Assembly.Load(). Quando detecta chamadas para os dois descriptografadores de string (06012345 e 060ABCDE), ele os chama criando um método dinâmico e salva o resultado (a string descriptografada). A chamada para o descriptografador de string será removida e a string descriptografada estará em seu lugar.

de4dot file1.dll --strtyp delegate --strtok 06012345 --strtok 060ABCDE

Como o assembly é carregado e executado, certifique-se de executá-lo em uma caixa de proteção se suspeitar que o arquivo seja malware.

Forçando a detecção de um determinado obfuscator​
de4dot não é perfeito. Se ele não conseguir detectar um ofuscador, você pode usar a opção -p para forçá-lo a assumir que foi ofuscado por ele.

Forçar SmartAssembly

de4dot file1.dll -p sa

Forçar obfuscator não suportado

de4dot file1.dll -p un

Para outros tipos de ofuscadores, consulte a tela de ajuda.

Desativando a renomeação de símbolos
Renomear símbolos não é tão fácil quanto renomear A para B quando a reflexão está envolvida. de4dot atualmente não oferece suporte à renomeação de XAML, portanto, se você suspeitar que ele usa WPF (ou se for um aplicativo Silverlight), desative a renomeação se o assembly não for executado.

de4dot --dont-rename file1.dll file2.dll

--keep-names também pode ser usado para dizer ao de4dot para não renomear certos símbolos, por exemplo. "não renomeie os campos".

Renomeie tudo o que deve ser renomeado, exceto propriedades, eventos e métodos.

de4dot --keep-names pem file1.dll

Usando um regex de renomeação diferente
Os regexes padrão devem ser suficientes, exceto possivelmente aquele que é usado quando um obfuscator não suportado é detectado. Para ver todos os regexes padrão, inicie o de4dot sem nenhum argumento e ele listará todas as opções e todos os valores padrão.

Por exemplo, atualmente o seguinte é o regex padrão usado quando o Dotfuscator é detectado

!^[a-z][a-z0-9]{0,2}$&!^A_[0-9]+$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$
. Como você pode ver, não é apenas um regex, é mais de um. Cada um é separado por & e cada regex pode ser negado usando ! na frente dele. Para mostrá-lo mais claramente, esses regexes são usados:

(negated) ^[a-z][a-z0-9]{0,2}$
(negated) ^A_[0-9]+$
^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$
Para alterar o(s) regex(es), você deve saber o nome curto do tipo do obfuscator (consulte a tela de ajuda). Por exemplo. é sa se for SmartAssembly e un se for um obfuscator não suportado/desconhecido. A opção a ser usada é --TYPE-name (por exemplo, --sa-name para SmartAssembly e --un-name para ofuscadores desconhecidos/sem suporte):

de4dot --un-name "^[a-zA-Z]\w*$" file1.dll

se as mãos chegarem, farei outra versão em russo do artigo
Github
Escrito por Kava aka kingessopper

0

2


» COVIL HACKER » rachaduras/inversão » Artigo desofuscação C#


|