VB6 -  Protegendo o seu programa contra a pirataria.


No artigo - Protegendo o seu Aplicativo contra Pirataria - eu tratei do assunto e usei a OCX - nslock15vb5.ocx - para implementar a proteção no seu programa Visual Basic.

No final do artigo eu prometia que iria voltar ao assunto , disse o seguinte : "A seguir veremos como gerar via código um rotina no VB para proteger seu sistema" .

Pois bem estou cumprindo a promessa e meu artigo vai mostrar como proteger seu programa VB usando código VB.

O código que eu vou mostrar aqui é muito simples e tem como objetivo proteger o seu programa de usuários curiosos e mal intencionados , mas , atenção , isto não quer dizer que seu programa será inviolável ; se empresas como a Microsoft , IBM , Oracle , gastando milhões de dólares , não conseguem evitar a pirataria (aposto que na sua cidade tem um camelô ou alguém que vende programas copyrights como Windows XP , VisualAge , Oracle 9i, a valores irrisórios.) não será este código que vai tornar o seu programa 'incopiável' .

A ideia

Como posso proteger meu programa VB ?

Que tal esta ideia :

  1. Para implementar a segurança na sua aplicação VB vamos trabalhar com :
    1. parâmetros na linha de comando.
    2. um código de identificação para o usuário.
    3. uma data indicativa para travamento do aplicativo.
  2. Voce deverá gerar um código de identificação universal único para o usuário.(GUI)
  3. Informar na data do travamento do aplicativo no seu código.
  4. Verificar se foi passado um parâmetro na linha de comando.
    1. Se nenhum parâmetro for passado para aplicação a mesma irá verificar se a data atual é superior ou igual a data indicada para travamento e em caso positivo irá invocar a rotina para travar o sistema.
    2. Se o parâmetro informado for a palavra "Ativar" o sistema ativa novamente a aplicação para uso normal.
  5. O código de identificação do usuário - GUI - será gravado no registro do Windows e será checado toda vez que aplicação for iniciada. Se o código for inválido a aplicação será encerrada.

Parâmetros na linha de comando

Como os parâmetros na linha de comando são passados para o Visual Basic ?

Simples , basta digitar o nome do aplicativo VB executavel seguido pelo parâmetro que deseja informar.

Ex:

Ou informar no seu projeto um parâmetro na caixa de diálogo - Proteção - Project Properties em :

Command Line Arguments

Toda vez que você executar o seu aplicativo EXE o parâmetro será passado para seu programa VB.

Obs: Usamos esta forma somente para testar a aplicação com o parâmetro informado.

E como os parâmetros passados na linha de comando são reconhecidos pelo programa VB que esta sendo executado ?

Os argumentos da linha de comando quando passados para um arquivo executável Visual Basic são armazenados em um variável especial de Sistema e podem ser capturadas e retornadas para o programa através da função : Command.

Então para verificarmos se algum argumento foi passado na linha de comando podemos usar uma instrução if no código verificando o valor da função Command : If Command = "" Then.

Se nenhum parâmetro for passado o valor retornado será uma string vazia ("").

Como gerar um identificador único do usuário ? ( Globally Unique Identifier )

Eu já abordei este assunto no artigo : GUID - Gerando um identificador Único , portanto vou mostra apenas o código usado :

1- Código das API´s declaradas no formulário.

Private Declare Function CoCreateGuid Lib "OLE32.DLL" (pGUID As GUID) As Long

Private Declare Function StringFromGUID2 Lib "OLE32.DLL" (pGUID As GUID, _
ByVal PointerToString As Long, ByVal MaxLength As Long) As Long

Private Type GUID
  Guid1 As Long
  Guid2 As Long
  Guid3 As Long
  Guid4(0 To 7) As Byte
End Type

2- O código da função CreateGUID que irá gerar o código identificador.

Public Function CreateGUID() As String

Dim udtGUID As GUID
Dim sGUID As String
Dim lResult As Long

lResult = CoCreateGuid(udtGUID)

If lResult Then
sGUID = ""
Else
sGUID = String$(38, 0)
StringFromGUID2 udtGUID, StrPtr(sGUID), 39
End If

CreateGUID = sGUID

End Function

3- Para gerar o código invocamos a função assim : CreateGUID

Usando a rotina eu gerei o código : 4BE96C57-F3BF-11D6-A57D-B2A419659821 usado no exemplo.

Como gravar e recuperar informações do registro do Windows ?

Os conceitos relacionados ao registro do windows estão no artigo : Acessando o registro do Windows

O Visual Basic fornece um localização padrão no registro para armazenar informações sobre as aplicações criadas com o Visual Basic :

HKEY_CURRENT_USER\Software\VB and VBA Program Settings\appname\section\key

Implementando a segurança na sua aplicação VB

Vamos agora juntar todas as peças e partir para o nosso objetivo : implementar a segurança na aplicação VB.

No programa VB para o qual você deseja implantar a segurança faça o seguinte : (eu vou estar usando um projeto com o nome de Proteção.vbp)

- Insira um módulo no seu projeto : Menu Project | Add Module

- No módulo inserido seção General Declarations insira o código abaixo:

Option Explicit
Const GUI = "4BE96C57-F3BF-11D6-A57D-B2A419659821"

a constante GUI refere-se ao código identificador único para o usuário que você deve gerar previamente.

- Crie uma sub rotina Main() e insira o código conforme abaixo:

Sub Main()
If Command = "Ativar" Then                                              
     AtivaAplicativo (GUI)
Else
     DesativarEm "10/11/02"   
End If
frmProtecao.Show
End Sub
- Usamos a função Command para verificar se algum argumento foi passado na linha de comando

- Se o comando informado for a String "Ativar" chamamos a função AtivaAplicativo(GUI)

- Se nenhum parâmetro for informado a função DesativarEm é invocada irá desativar a aplicação para a data indicada.

- A rotina DesativarEm recebe a data na qual será desativada o sistema e verifica se a data atual é superior ou igual a data indicada.

Public Sub DesativarEm(Data As Date)
'Desativa o programa na data informada
Dim chave As String
'Gera a chave com base no codigo identificador do usuario
chave = Left(GUI, 8)
'Se a chave for invalida encerra a aplicação
If GetSetting("Aplicativo", "Security", chave, GUI) <> GUI Then
     MsgBox "Não é possivel executar a aplicação entre em contado com o suporte técnico", vbCritical, _ 
     "Erro de Validação de chave : A-1"
     End
End If
'Se a data expirar, desativa o aplicativo
If Date >= Data Then
   'grava um valor invalido na chave do registro
   SaveSetting "Aplicativo", "Security", chave, "A-1"
   MsgBox "O periodo de demonstração terminou ! " & vbCrLf & _ 
   " Para adquirir o sistema entre em contato com seu revendedor", vbCritical, "Erro Interno"
   End
End If
End Sub

- Finalmente a rotina AtivaAplicativo que recebe como argumento o valor do código do usuário - GUI - gerado anteriormente.

Public Sub AtivaAplicativo(codigo As String)
Dim chave As String
chave = Left(codigo, 8)
If Command = "Libera" Then
   SaveSetting "Aplicativo", "Security", chave, codigo
End If
End Sub

As informações são gravadas/recuperados do registro do Windows usando as funções SaveSetting e GetSetting.

Como funciona ?

Suponha que você distribuiu o seu aplicativo para um usuário testar , e, que definiu que o travamento da aplicação deverá ocorrer no dia 10/11/02.

O usuário irá executar normalmente (fig 1) seu programa até a data informada , neste dia ,ao ser executado ,a rotina DesativarEm será invocada e irá gravar uma chave inválida no registro do Windows. A partir dai a aplicação não poderá ser mais executada (fig 2), mesmo que a data seja alterada ou que o programa seja instalado em outra máquina.

fig 1 fig 2

Gostou ??? Simples mas funcional ... até o próximo artigo...

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

 

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti