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 :
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 :
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: