VB 2005 - É possível proteger o seu código ?


Se você ainda não se deu conta, na plataforma .NET quando você efetua a compilação do seu código ele não é compilado diretamente para linguagem de máquina. Todas as linguagens .NET efetuam a compilação para a Microsoft Intermediary Language (MSIL ou apenas IL). A IL é então compilada em tempo de execução. Esta operação feita em duas etapas tem algumas vantagens como por exemplo: o fato de você estar apto a consultar dinamicamente um assembly por um tipo ou um método usando a reflection.

"Os executáveis ".NET" são arquivos .EXE ou .DLL no formato "PE", o mesmo formato usado no Windows 32, mas com algumas diferenças. Eles são chamados coletivamente de "Assemblies" e contém basicamente o seguinte:
  • Informações de versão detalhadas tanto sobre o próprio módulo como os demais módulos referenciados ("Manifest");
  • Informações detalhadas de todos os tipos implementados no arquivo (Metadata);
  • Código MSIL - Microsoft Intermediate Language. Este código é compilado em tempo de carga (ou instalação) para a CPU do computador;

Um executável ou DLL pode tanto chamar classes da biblioteca ou de outros executáveis como também criar classes derivadas de classes localizadas em outros executáveis. Este é um sonho antigo da orientação a objetos que nunca foi realmente realizado, apesar de várias tentativas (Taligent e Next, dentre outras)."
 
Mauro Sant'Anna - disponível em - http://www.microsoft.com/brasil/msdn/Tecnologias/vsnet/visualstudio_assemblies.aspx

Como nada é perfeito, este processo tem um efeito colateral : torna possível, usando a engenharia reversa, ter acesso a seu algoritmo ou lógica de negócio.

Este artigo procurar mostrar como você pode ofuscar o seu código para proteger a sua lógica de negócio.  Fica aqui registrado que o ofuscamento de código não é uma garantia de que o seu código esta 100% protegido.

Para começar vamos dar uma olhada na ferramenta MSIL Disassembler ou IL Dasm que é instalada com a .NET Framework SDK e que pode ser encontrada clicando em: Iniciar -> Todos os Programas ->   Microsoft .NEt Framework  SDK v2.0 ->  Tools -> MSIL Disassembler

Eu criei um pequeno projeto do tipo WIndows Application chamado appObfuscationNet que contém somente uma classe chamada calculo que possui o método calculaSoma que recebe como parâmetros dois valores do tipo Double e retorna a soma. O código da classe esta exibido abaixo:

Public Class calculo

Public Shared Function calculaSoma(ByVal op1 As Double, ByVal op2 As Double) As Double

        Return op1 + op2

End Function

End Class

Vamos usar a ferramenta MSIL Disassembler para abrir este assembly:

Note que a ferramenta abre a classe  identificando o método e os tipos de argumentos usados;

Se você clicar duas vezes no método calculoSoma será exibido o seu algoritmo a exposta a sua lógica. Qualquer pessoa que conheça a programação assembly irá ler facilmente o código exposto pelo IL. (Imagina o que não faria um bom decompilador...)

Esta assustado ? Calma que tem mais... Vamos falar um pouco sobre Descompiladores.

Qualquer programa, escrito para qualquer linguagem e voltado para qualquer CPU pode ser descompilado, dada uma quantidade de esforço maior ou menor. Por "descompilado" queremos dizer que podemos criar um fonte em linguagem de alto nível que uma vez compilado funciona da mesma forma que o programa executável que dispúnhamos anteriormente. Isto pode ser feito com executáveis Windows, mas os programas .NET (e também Java) podem ser descompilados mais facilmente.

Uma das grandes vantagens dos executáveis .NET é que eles podem rodar em um "ambiente gerenciado", onde os programas não podem causar danos ao computador do usuário. Este ambiente gerenciado depende basicamente do seguinte para funcionar:
  • Código em "linguagem intermediária" (MSIL). Este código pode ser "verificado" em tempo de execução pelo compilador "JIT", de forma que não possa causar danos ao computador do cliente ou efetuar operações não permitidas pelas configurações de segurança, como ler um arquivo qualquer do disco ou estabelecer comunicação via Internet com um site não autorizado.
  • Informação de tipo em tempo de execução (metadata) de forma a validar os casts e manter a integridade do sistema de tipos.
  • A primeira compilação (VB para IL) não deve otimizar o código, pois as otimizações podem impedir que o compilador JIT verifique o código como também atrapalhar outras otimizações a serem feitas pelo JIT.

 Mauro Sant'Anna - disponível em - http://www.microsoft.com/brasil/msdn/Tecnologias/vsnet/visualstudio_assemblies.aspx

Um dos descompiladores mais conhecidos e usado é o Reflector de autoria de Lutz Roeder (faça o download em : www.aisto.com/roeder/dotnet)

O Reflector pode ser usado para descompilar qualquer assembly .NET e gerando o código na linguagem C#, VB.NET e mesmo Delphi. Vamos abrir o mesmo aplicativo exemplo que eu criei usando o Reflector para ver o 'estrago' que ele é capaz de fazer...

Preciso falar alguma coisa ?

O seu código foi totalmente exposto, e, ainda na linguagem VB.NET; nem precisa saber a linguagem assembly, esta tudo escancarado...

No painel da direita você pode ver os namespaces, tipos e informações de métodos; Clicando sobre um método irá abrir o conteúdo do método na linguagem que você definir na barra de ferramentas.

Ficou mais assustado ainda ? calma que tem mais...

Existe um add-in , escrito por Denis Bauer (disponível em www.denisbauer.com/NETTools/FileDisassembler.aspx) que pode ser usado para descompilar um assembly inteiro em seus arquivos fontes completos com arquivo de projeto.

Após fazer o download o add-in descompacte o arquivo para a mesma pasta onde o Reflector foi instalado. A seguir abra o Reflector e no menu View selecione a opção Add-ins; clique no botão Add.. e inclua o add-in. Para encerrar clique em Close.

Agora abra o Reflector e abra o assembly appObfuscationNet no menu Tools selecione File Disassembler e a seguir defina a linguagem Visual Basic na barra de ferramentas. No painel da direita defina um diretório para onde serão gerados os fontes. Eu chamei de c:\crack e defina o tipo de projeto; no nosso caso Windows Application. Tudo Pronto ?  Clique no botão Generate. Aguarde uns segundos e voilá. Seu projeto foi totalmente regenerado...

Dúvida ? Abra o diretório c:\crack onde os fontes foram gerados e pasme...:

Nota: existe ainda alguns problemas de compatibilidades ao regenerar o arquivo de solução para  a linguagem VB.NET mas para C# não há problemas.

Antes que você entre em pânico vou adiantar que o estrago tem remendo, e, é este assunto que irei tratar na segunda parte deste artigo:

Ofuscando o seu código para protegê-lo de olhos curiosos...

Após toda essa exposição fica claro que você precisa de uma proteção para a sua lógica de negócio que esta embutido em seu código. A técnica de ofuscar o código pode ser encarada como a arte de renomear símbolos em um assembly de maneira que a lógica fique ininteligível, e que desta forma, o código não possa ser facilmente descompilado e tentativa de efetuar a engenharia reversa para um código compreensível seja também frustrada.

Existem muitas ferramentas de terceiros que você pode usar para efetuar o ofuscamento de código e cada uma faz a propaganda das suas vantagens.(Ex: O obfuscator Demeanor - http://www.wiseowl.com ). O Visual Studio 2005 já vem com a versão Community do Dotfuscator e será esta ferramenta que iremos usar nos exemplos deste artigo.

Nota:  Embora venha com o VS 2005 o Dotfuscator é desenvolvido separadamente pela empresa PreEmptive Solutions.

Fique sabendo no entanto que o Dotfuscator versão Community que iremos usar possui somente um sub-conjunto das funcionalidades das versões Standard e Professional do produto.Se você deseja realmente proteger de uma forma efetiva o seu código o conselho é efetuar a atualização para uma destas versões mais completas.

Abra o Visual Studio 2005 e no menu Tools selecione a opção Dotfuscator Community Edition. Será apresentada uma janela solicitando o tipo de projeto. Selecione a opção - Create New Project

O projeto que será criado não é um projeto do Visual Studio mas um projeto Dotfuscator que usa o seu próprio formato.

A janela para um novo projeto aparece na janela do formulário do Dotfuscator conforme figura abaixo. Usando a tab input inclua os assemblies .NET para os quais você deseja efetuar o processo do ofuscamento. O processo toma os assemblies existentes aplica o algoritmo de ofuscamento e gera um conjunto de novos assemblies. Eu vou carregar o assembly do projeto appObfuscationNet  do início deste artigo.

Após carregar assembly já podemos acessar o menu File opção Build ou clicar no botão Build Project para ofuscar a nossa aplicação. Os assemblies ofuscados serão incluídos em uma pasta chamada Dotfuscated no mesmo diretório onde você salvou as configurações.

Se você abrir o assembly gerado pelo ofuscador usando o Reflector, conforme mostrado na figura abaixo, vai notar que o método calculaSoma foi renomeado junto com os parâmetros de entrada usados. A hierarquia também foi removida e as classes foram todas renomeadas. Os novos nomes dos métodos/classes possuem nomes parecidos e não intuitivos o que dificulta o processo de descompilação.

Lembrando que a versão do Dotfuscator usada contém somente as funcionalidades básicas para ofuscamento e que portanto você deve usar a versão completa ou um outro obfuscator de terceiros. Além disto existem outros recursos que você pode usar para dificultar a descompilação do seu código fonte. Uma delas seria evitar o acesso ao seu executável. E Como você faz isto ? Colocando as funcionalidades em um web service ou servidor de aplicação COM+. Outra forma, não tão elegante seria escrever parte do seu código em um ambiente não gerenciado , o velho COM , gerando DLLs.

Para encerrar transcrevo na íntegra a notícia da Microsoft :

A Microsoft anunciou esta semana que adicionará uma versão melhorada de seu Dotfuscator Community Edition (CE) na próxima grande versão do Microsoft Visual Studio, chamado
atualmente apenas de 'Orcas'. O anúncio veio na conferência TechEd EMEA (Europa, Oriente Médio e África), que ocorre na Espanha.

O Dotfuscator, da PreEmptive Solutions, é uma ferramenta de proteção de códigos que disfarça códigos fonte de programas, de forma a dificultar a engenharia reversa aplicada por
 ferramentas de decompilação, muito usadas por hackers.

O objetivo da ferramenta é dificultar o trabalho de hackers em entender qual o código do programa, através do uso de caracteres 'incoerentes', disfarce de meta dados e alteração
 do controle de fluxo, de acordo com comunicados da PreEmptive Solutions.

O Dotfuscator CE é uma versão básica do programa que já está incluída nas versões Professional e Enterprise do Visual Studio.NET 2003 e nas versões Standard e Professional
do Visual Studio 2005, além das versões Architect, Developter, Test e Suite do Visual Studio Team System. Segundo a companhia, a versão CE exige que o Visual Studio esteja
 funcionando e é voltada para desenvolvedores de programas gratuitos e estudantes.

A próxima versão do Dotfuscator CE, que será incluída no Orcas, terá integração total com o Visual Studio, desde resolução de dependências de compilação a processos pós
 compilação, como geração de scripts de instalação, gerenciamento de patchs e distribuição de processos de desenvolvimento, de acordo com a Microsoft. Novembro-2006

E agora encerrando mesmo: O Dotfuscator ou qualquer outra ferramenta que ofusca o código não impede que o código seja descompilado. Estas ferramentas 'embaralham o código'  o que faz com que mesmo descompilado o código seja incompreensível para os meros mortais. Este é o objetivo primário de um bom ofuscador de código.

Até o próximo artigo VB.NET...

João 5:24 Em verdade, em verdade vos digo que quem ouve a minha palavra, e crê naquele que me enviou, tem a vida eterna e não entra em juízo, mas já passou da morte para a vida.

João 5:25 Em verdade, em verdade vos digo que vem a hora, e agora é, em que os mortos ouvirão a voz do Filho de Deus, e os que a ouvirem viverão.

João 5:26 Pois assim como o Pai tem vida em si mesmo, assim também deu ao Filho ter vida em si mesmos;

João 5:27 e deu-lhe autoridade para julgar, porque é o Filho do homem.

 

Veja os Destaques e novidades do SUPER DVD VB  (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C#  com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.

      Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti