Usando .NET Reflector : explorando, analisando e crackeando aplicações .NET


Você já deve saber que o código escrito em uma linguagem .NET, como C# ou Visual Basic, é chamado de código gerenciado, ou seja, o código não é compilado em instruções específicas de código de máquina. Em vez disso, a plataforma .NET compila o código para a MSIL (Microsoft Intermediate Language). A MSIL é um conjunto de instruções independente da máquina que é compilado em tempo de execução pela CLR (Common Language Runtime).

Nessa etapa de compilação extra esta o diferencial das linguagens não compiladas, pois o código é executado em uma área protegida (sandbox): o ambiente gerenciado do CLR. Este ambiente pode proporcionar maior segurança, estabilidade, e pode ser executado em qualquer hardware que possua suporte á CLR.(Como a máquina virtual (JVM) do Java)

Com programas executáveis produzidos por linguagens tradicionais, pode ser muito difícil analisar o código fonte original. Isso pode ser uma coisa boa quando se trata de proteção de código, mas ser capaz de ver o código fonte pode ser de grande valor, por exemplo, quando se torna necessária a análise lógica de uma dll cujo código-fonte foi perdido.

Neste artigo eu vou mostrar a ferramenta conhecida como .NET Reflector que oferece uma maneira fácil de analisar código gerado pela plataforma .NET.

Vamos usar as seguintes ferramentas :

  1. Reflector – A ferramenta da Redgate que permite explorar e analizar assemblies compilados pela plataforma .NEt visualizando o código C#, VB and IL (Intermediate Language);
  2. Reflexil - Um editor Assembly que roda como um plugin para o Redgate's Reflector; ele permite manipular código IL e salvar os assemblies modificados;

Obs: Diferentemente do Reflexil , o Reflector não é uma ferramenta grátis e possui um período de avaliação após o qual deve ser registrado para ser usado.

Após instalar o .NET Reflector (estamos usando a versão 8.0) você deve instalar o Reflexil como um plugin do Reflector. Para isso siga os passos indicados abaixo:

Abra o .NET Refletor e no menu Tools clique em Add-Ins...

Na janela Add-Ins clique no botão + para abrir a janela de diálogo para seleção do arquivo do Reflexil:

Selecione o arquivo do Reflexil a partir do local onde você descompactou o arquivo baixado e clique no botão Abrir:

Após isso você deverá na janela Add-ins o Reflexil disponível para ser usado:

Experimentando o .NET Reflector

Para mostrar como podemos analisar um assembly .NET usando o .NET Reflector eu criei uma aplicação usando a linguagem C#.

É uma aplicação Windows Forms que possui um único formulário cujo leiaute esta exibido abaixo:

O código da aplicação esta contido no evento Click do botão de comando - Clique Aqui e Fique Milionário - conforme mostrado a seguir:

Então essa super aplicação que criamos pode transformar qualquer um em um milionário.

Basta informar um valor e saber a senha Super Secreta que ao clicar no botão de comando o código executado transformara o usuário em um Milionário.

Após compilar a aplicação você terá um executável chamado GrandeProgramaMilionario.exe , um assembly gerado pela plataforma .NET usando código C#.

Abra agora o .NET Reflector e no menu File clique em Open Assembly...

Localize o assembly (.exe ou .dll) que deseja analisar. No nosso exemplo vamos abrir o arquivo GrandeProgramaMilionario.exe:

O assembly será aberto na janela Object Browser. No exemplo usado navegamos até o nó GrandeProgramaMilionario e selecionamos o item btnMilionario_Click() que representa o evento Click do botão de comando.

Como podemos ver, expandindo a árvore de objetos temos o respectivo código do evento Click exibido pelo .NET Reflector :

Como você observou o código compilado pode ser facilmente aberto e crackeado usando esta ferramenta.

Podemos visualizar o código na linguagem VB .NET , IL e MC++. Além disso podemos escolher a versão da plataforma .NET:

No botão Options ou via menu Tools -> Options temos opções de formatação e seleção de diversos parâmetros que podemos usar no .NET Reflector:

Vamos agora usar o Reflexil - Alterando o código do assembly

O .NET Reflector permite analisar e visualizar o código gerado mas não permite realizar alterações no código.

Como podemos alterar o código ?

No menu Tools clique em Reflexil v1.6

A janela aberta pelo Reflexil exibe o código assembly IL que exige um certo grau de conhecimento para que você possa entender corretamente as instruções mostradas.

No nosso exemplo vamos fazer algo bem simples usando o Reflexil para editar o código IL.

Existem duas maneiras de editar o código IL com Reflexil :

  1. Editar cada instrução linha por linha utilizando os códigos de operação (Clique com o botão direito do mouse sobre o código IL -> Edit)
  2. Editar uma seção do código na linguagem escolhida e reconstruí-lo no projeto (Clique com o botão direito do mouse sobre sobre o Código IL -> Replace all with code)

Usando a primeira opção teremos uma janela pop-up que se parece com o seguinte ...

Note que para alterar o código basta você incluir o novo código da lista suspensa e clicar no botão Update.

Após fazer as mudanças que você precisa, selecionar e destaque a raiz do assembly (no painel do lado esquerdo) , clique em Reflexil v1.6 e selecione Save as:

Será criada uma nova versão Patched do assembly.

Vamos então crackear a aplicação criada alterando o seu comportamento.

Como o nosso código é bem simples não teremos que ter um conhecimento grande de assembly para poder cracker o código.

Vamos fazer o seguinte : vamos alterar a lógica do programa na verificação da senha de forma a permitir que qualquer usuário se torne um milionário burlando assim o código.

A linha de código :

if (txtSenhaSecreta.Text == "numsey")

verifica se a senha informada é igual a 'numsey'; se isso for verdade (true) então o código que transforma o usuário em um milionário é executado.

Vamos alterar esse comportamento...

Se olharmos com atenção o código da IL comparando-o com o código exibido pelo Reflector iremos notar que na linha 18 temos uma instrução que compara dois valores na pilha:

e se eles não forem equivalentes pula para a linha 45 exibindo a mensagem ao usuário que ele errou a senha.

Percebemos que esse código é o que verifica a senha.

Vamos alterar o valor da IL de brtrue.s  abrindo a lista suspensa e selecionando o valor brfalse.s conforme abaixo clicando a seguir no botão Update.

A seguir vamos salvar o assembly editado como GrandeProgramaMilionario.Patched

Executando a versão crackeada o usuário poderá digitar qualquer texto na caixa de senha que o código será executado.

Se abrirmos o assembly crackeado no Reflector iremos notar que a linha de código foi alterada para:

if (!(this.txtSenhaSecreta.Text == "numsey"))

Observe que foi incluído o operador ! (not) no código alterando a lógica do if burlando assim o programa:

Assim conseguimos alterar o comportamento de um assembly .NET gerado na linguagem C# usando o .NET Reflector e o Reflexil.

Isso é apenas a ponta do iceberg, você pode explorar muitos outros recursos da ferramenta que eu não detalhei neste artigo.

1Pe 3:17 Porque melhor é sofrerdes fazendo o bem, se a vontade de Deus assim o quer, do que fazendo o mal.

1Pe 3:18 Porque também Cristo morreu uma só vez pelos pecados, o justo pelos injustos, para levar-nos a Deus; sendo, na verdade, morto na carne, mas vivificado no espírito;

1Pe 3:19 no qual também foi, e pregou aos espíritos em prisão;

1Pe 3:20 os quais noutro tempo foram rebeldes, quando a longanimidade de Deus esperava, nos dias de Noé, enquanto se preparava a arca; na qual poucas, isto é, oito almas se salvaram através da água,

1Pe 3:21 que também agora, por uma verdadeira figura - o batismo, vos salva, o qual não é o despojamento da imundícia da carne, mas a indagação de uma boa consciência para com Deus, pela ressurreição de Jesus Cristo,

1Pe 3:22 que está à destra de Deus, tendo subido ao céu; havendo-se-lhe sujeitado os anjos, e as autoridades, e as potestades.

Referências:


José Carlos Macoratti