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:
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)." |
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 DoubleReturn 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:
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
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 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 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 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 |
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#. |
Referências: