SEGURANCA - Modulo de registro de aplicativo com HDserial...

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SEGURANCA - Modulo de registro de aplicativo com HDserial...

Mensagem por rochinha »

Amiguinhos

O modulo aqui apresentado permite colocar em seus sistemas uma forma profissional de registro de uso do sistema.

É composto por um código que deve ser colocado em sua aplicação para interagir com o modulo e finalmente um modulo a parte que serve para registrar a aplicação.

No que consiste?

A aplicação, ao abrir fará uma verificação do registro e se o mesmo ainda não estiver gravado no mesmo fará a chamada ao modulo de registro.

O modulo de registro permitira que o usuario rode a demonstração do aplicativo que tem um prazo prédefinido na variavel MAXDAYS e verificado pela função MAXTRIAL.

Caso o registro seja efetivado com exito toda informação de registro sera grafada, isto mesmo, grafada dentro do aplicativo, nada de uso de arquivos externos.

A rotina funcionou muito bem com BLinker sem compressão e Harbour.

O modulo de registro é composto por um .RC que contem a definição da DIALOG de registro e um .PRG contendo o código.

Arquivo REGISTRO.RC

Código: Selecionar todos

registro DIALOG 77, 49, 211, 175
STYLE 0x4L | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
CAPTION "Acesso ao sistema"
FONT 8, "MS Sans Serif"
{
 EDITTEXT 103, 98, 130, 102, 12, ES_UPPERCASE | WS_BORDER | WS_TABSTOP
 PUSHBUTTON "C&onfirma", 201, 5, 157, 64, 14
 PUSHBUTTON "&Cancela", 203, 76, 157, 62, 14
 PUSHBUTTON "Demonstração", 204, 145, 157, 62, 14
 EDITTEXT 101, 98, 113, 102, 12, ES_UPPERCASE | ES_READONLY | WS_BORDER | WS_TABSTOP
 LTEXT "", 98, 311, 21, 98, 148, NOT WS_GROUP
 ICON "icon_Chaves", -1, 8, 9, 21, 20
 LTEXT "Este aplicativo está em MODO DEMONSTRAÇÃO.", 90, 35, 9, 170, 18
 GROUPBOX "", -1, 5, 101, 202, 50, BS_GROUPBOX
 CONTROL "", 97, "static", SS_BLACKRECT | WS_CHILD | WS_VISIBLE, 219, 3, 202, 66
 LTEXT "Número de Série:", 95, 12, 115, 60, 8
 LTEXT "Código de Liberação:", 96, 12, 131, 72, 8
 LTEXT "Para avaliar a Versão de Demonstração clique no botão Demonstração.", 91, 35, 27, 170, 18
 LTEXT "Registre o programa e receba o Código de Liberação para utilizar o produto completo.", 92, 35, 55, 170, 18
 LTEXT "Entre em contato com o suporte através do telefone (11) 3903-4461", 93, 35, 84, 170, 18
}

icon_Chaves ICON 
{
'00 00 01 00 01 00 20 20 10 00 00 00 00 00 E8 02'
'00 00 16 00 00 00 28 00 00 00 20 00 00 00 40 00'
'00 00 01 00 04 00 00 00 00 00 80 02 00 00 00 00'
'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
'00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00'
'00 00 80 00 80 00 80 80 00 00 80 80 80 00 C0 C0'
'C0 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'
'00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00'
'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
'00 00 00 00 08 80 00 00 00 00 00 00 00 00 00 00'
'00 00 00 00 F8 78 00 00 00 00 00 00 00 00 00 00'
'00 08 80 07 08 78 00 00 00 00 00 00 00 00 00 00'
'07 78 88 00 78 78 00 00 00 00 00 00 00 00 00 00'
'07 F8 78 7F 88 78 00 00 00 00 00 00 70 00 00 00'
'07 F8 78 07 F8 78 00 00 00 00 00 07 B3 30 00 00'
'00 08 78 0F 08 78 00 00 00 00 07 00 BB 70 00 00'
'00 78 78 00 78 78 00 00 00 00 73 3B B7 00 00 00'
'7F 88 78 7F 88 78 00 00 00 00 7B BB 70 30 00 00'
'07 F8 78 7F 88 78 00 00 00 70 0B B7 03 00 00 00'
'00 08 78 07 F8 78 00 00 07 33 BB 70 30 00 00 00'
'00 78 78 07 F8 77 00 00 7B BB B7 03 00 00 00 00'
'7F 88 78 7F 88 F7 00 00 7B BB 70 30 00 00 00 00'
'7F 88 77 F8 8F 88 70 00 BB B7 03 00 00 00 00 00'
'07 F8 7F 88 F0 00 00 0B BB 70 30 00 00 00 00 00'
'07 F7 F8 80 07 77 77 7B B7 03 00 00 00 00 00 00'
'7F 7F 88 07 7B BB BB BB 70 30 00 00 00 00 00 07'
'F8 7F 80 7B BB BB BB B8 B3 00 00 00 00 00 00 7F'
'88 7F 80 BB BB 8B 8B 8B 83 00 00 00 00 00 07 F8'
'8F 7F 0B BB B0 B0 B8 B8 B3 00 00 00 00 00 7F 88'
'F8 7F 7B BB BB 0B 0B 8B 83 00 00 00 00 00 7F 88'
'8F 87 7B BB BB B0 B0 B8 B3 00 00 00 00 00 7F 88'
'F8 00 7B BB 77 0B 0B 0B 83 00 00 00 00 00 7F 88'
'80 7F 7B B0 F8 80 B0 B8 30 00 00 00 00 00 7F 88'
'F0 78 7B B0 0F 80 BB B8 30 00 00 00 00 00 07 F8'
'80 77 07 B0 07 F0 BB 83 00 00 00 00 00 00 00 7F'
'88 00 08 77 00 0B B3 30 00 00 00 00 00 00 00 07'
'FF F0 78 70 88 88 30 00 00 00 00 00 00 00 00 00'
'77 70 77 70 77 77 00 00 00 00 00 00 00 00 00 00'
'00 00 70 00 70 00 00 00 00 00 00 00 00 00 00 00'
'00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF F9'
'FF FF FF F0 FF FF FE 60 7F FF FC 00 7F FF F8 00'
'7F FF F8 00 7F F1 F8 00 7F E0 FC 00 7F 80 F8 00'
'7F 00 F0 00 7F 00 F8 00 7C 01 FC 00 78 03 F8 00'
'70 07 F0 00 70 0F F0 00 20 1F F8 00 00 3F F8 00'
'00 7F F0 00 00 FF E0 00 01 FF C0 00 01 FF 80 00'
'01 FF 00 00 01 FF 00 00 01 FF 00 00 01 FF 00 00'
'03 FF 00 00 03 FF 80 00 07 FF C0 00 0F FF E0 00'
'1F FF F0 10 7F FF FE 73 FF FF FF 07 FF FF'
}

Codigo REGISTRO.PRG

Código: Selecionar todos

/* *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *
 * Procedure_: REGISTRO.PRG                                       
 * Autor_____: Jose Carlos da Rocha - Konectiva Automacao       
 * Cria‡„o___: 13 de Dezembro de 2005                           
 * Objetivo__: Pedir codigo de registro para habilitar aplicacao totalmente
 * Rotina____: Executavel stand-alone chamado pelo aplicativo principal
 * Direitos__: Qualquer alteração neste código pode ser feita deste que
 *             seja mantida a autoria principal.
 * Alterado__: ___/___/____
 * por_______: ___________________________________________
 * *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** */
#include "FiveWin.ch"

//----------------------------------------------------------------------------//
function Main()
   local oDlg, oGet, oText1, oText2
   local nSerie    := substr(HDSERIAL(),1,8)
   local nLiberacao:= space(8)
   SET _3DLOOK ON
   DEFINE DIALOG oDlg NAME "registro" COLOR RGB(000,000,000),RGB(255,255,255)
   REDEFINE SAY ID 90 OF oDlg COLOR RGB(000,000,000),RGB(255,255,255)
   REDEFINE SAY ID 91 OF oDlg COLOR RGB(000,000,000),RGB(255,255,255)
   REDEFINE SAY ID 92 OF oDlg COLOR RGB(000,000,000),RGB(255,255,255)
   REDEFINE SAY ID 93 OF oDlg COLOR RGB(000,000,000),RGB(255,255,255)
   REDEFINE SAY ID 95 OF oDlg COLOR RGB(000,000,000),RGB(255,255,255)
   REDEFINE SAY ID 96 OF oDlg COLOR RGB(000,000,000),RGB(255,255,255)
   // Altere os comandos WinExec para chamarem o seu aplicativo principal
   REDEFINE BUTTON oBtn201 ID 201 OF oDlg ACTION ( PROTECT3(), WinExec( "NFWH.EXE" ), oDlg:End() )
   REDEFINE BUTTON         ID 203 OF oDlg ACTION oDlg:End()
   REDEFINE BUTTON         ID 204 OF oDlg ACTION ( WinExec( "NFWH.EXE demo" ), oDlg:End())
   //
   REDEFINE GET oText1 VAR nSerie     ID 101 PICTURE "@!" OF oDlg COLOR RGB(255,255,255),RGB(000,000,255) NO MODIFY
   REDEFINE GET oText2 VAR nLiberacao ID 103 PICTURE "@!" OF oDlg VALID lOkPassword(nLiberacao,nSerie,oBtn201) 
   ACTIVATE DIALOG oDlg CENTERED ON INIT (oBtn201:Disable(),oText2:SetFocus())
   return nil

FUNCTION PROTECT3()
   PRIVATE ARQ, BUFFERS, RET, PALAVRA, P, T, ARQUIVO1
   SET CENTURY OFF
   REGISTRO := "HDHDHDHDRBRBRBRB99999999YYYYYYYYYYYY"
   HDSERIAL := SUBSTR(HDSERIAL(),1,8)                // Serial do HD
   MAXDAYS  := "30"                                  // Tempo maximo de DIAS de uso
   ROMBIOS  := "RBRBRB"                              // CheckSum da RomBios
   MAXUSERS := "05"                                  // Maximo de usuarios por sessao
   MAXTRIAL := SUBSTR(STRTRAN(DTOC(MAXTRIAL(MAXDAYS)),'/',''),1,6) // Tempo maximo de uso
   ARQUIVO1 := "NFWH.EXE"                            // Nome do aplicativo
   PALAVRA  := "KONECTIVA"                           // String a ser protegida ate 10 caracteres
   PROTEGER := HDSERIAL+MAXDAYS+ROMBIOS+MAXUSERS+MAXTRIAL    // Dados para serem armazenados
   IF REPL("HD",4) $ REGISTRO
      //MSGRUN( "Protegendo..." )
      ARQ := FOPEN(ARQUIVO1,2)
      IF FERROR() # 0
         MSGRUN(  "Erro na abertura do arquivo "+ARQUIVO1 )
         QUIT
      ENDIF
      T = FSEEK(ARQ,0,2)
      FSEEK(ARQ,0,0)
      BUFFER := SPACE(512)
      BUFFE0 := PROTEGER+SPACE(512-LEN(PROTEGER))
      P      := 0
      FOR A = 1 TO 512
          P := P + ASC(SUBS(SUBSTR(ROMBIOS+SPACE(12),1,12),A,1)) + A
      NEXT
      PALAVRA := ALLTRIM(PALAVRA)
      PS     := ACHOU(PALAVRA)
      IF PS = 0
         //MSGRUN( "String nao encontrada em "+ARQUIVO1 )
         QUIT
      ENDIF
      BYTES1 := 0
      FOR A = 1 TO 512
          BYTES1 := BYTES1 + ASC(SUBS(BUFFE0,A,1)) + A
      NEXT
      IF ACHOU(REPL("HD",4)) = 0
         //MSGRUN(  "String de prote‡„o nao foi encontrada em "+ARQUIVO1 )
         RETURN 0
      ENDIF
      L = AT("HDHD",BUFFER)
      BUFFER1 := SUBS(PROTEGER+SPACE(24),1,24)+STRZERO(P,12)
      BUFFER  := STUFF(BUFFER,L,36,BUFFER1)
      FSEEK(ARQ,-512,1)
      FWRITE(ARQ,BUFFER)
      FCLOSE(ARQ)
      //MSGRUN( "Protegido... " )
      //@ 4,0 SAY "Verifica‡„o conferida"
      //INKEY(3)
   ELSE
      //MSGRUN( "Ambientando..." )
      ARQUIVO  := "NFWH.EXE"
      HDSERIAL := SUBS(REGISTRO, 1, 8)      // Serial do HD
      MAXDAYS  := VAL(SUBS(REGISTRO, 9, 2)) // Maximo de Dias
      ROMBIOS  := SUBS(REGISTRO,11, 6)      // STR(ROMCKSUM(),8)          // CheckSum da RomBios
      MAXUSERS := VAL(SUBS(REGISTRO,17, 2)) // Maximo de usuarios por sessao
      MAXTRIAL := CTOD(SUBS(REGISTRO,21, 2)+"/"+;
                       SUBS(REGISTRO,19, 2)+"/"+;
                       SUBS(REGISTRO,23, 2))
      DESLOCA  := VAL(SUBS(REGISTRO,25,12))
      //
      // -> Rotinas de verificacao de travas
      IF HDSERIAL() <> HDSERIAL        ; RETURN 1; ENDIF
      IF ROMBIOS(ROMBIOS) <> ROMBIOS   ; RETURN 2; ENDIF
      IF MAXUSERS(MAXUSERS) > MAXUSERS ; RETURN 3; ENDIF
      IF (MAXTRIAL() > MAXTRIAL+30) .OR. (MAXTRIAL > DATE()); RETURN 4; ENDIF
   ENDIF
   RETURN 0
FUNCTION HDSERIAL()
   RETURN ALLTRIM(STR(nSerialHD()))
FUNCTION MAXUSERS(MAXUSERS)
   RETURN 0
FUNCTION ROMBIOS(ROMBIOS)
   RETURN ROMBIOS
FUNCTION MAXTRIAL(MAXDAYS)
   RETURN date()+val(MAXDAYS)
FUNCTION ACHOU(PALAVRA)
   PRIVATE Q
   FSEEK(ARQ,0,0)
   FOR Q = 0 TO T STEP + 512
       FREAD(ARQ, @BUFFER, 512)
       IF AT(PALAVRA, BUFFER) # 0
          RETURN Q
       ENDIF
   NEXT
   RETURN 0
FUNCTION lOkPassword(nLiberacao,nSerie)
   if val(nLiberacao)+val(nSerie)=99999999
      oBtn201:Enable()
   else
      oBtn201:Disable()
   endif
   return .t.
A parte que vai dentro do aplicativo esta descrita abaixo:

Código: Selecionar todos

function main(M_O_D_O) // Necessario receber este parametro
   ...
   if M_O_D_O = NIL          // Arqui o parametro sera criticado
      PROTERRO := PROTECT3() // Funcao que verifica se o aplicativo foi registrado
      IF PROTERRO > 0
         IF PROTERRO = 1; PROTMENS := 'NAO REGISTRADO'  ; WinExec( "REGISTRO.EXE" ); QUIT ; ENDIF
         IF PROTERRO = 2; PROTMENS := 'ROMBIOS ERRADO'  ; ENDIF
         IF PROTERRO = 3; PROTMENS := 'MUITOS USUARIOS' ; ENDIF
         IF PROTERRO = 4; PROTMENS := 'TEMPO ESTOURADO' ; ENDIF
         CLEAR SCREEN
         IF PROTERRO > 1
            cMensa := OemToAnsi( "(****" + PROTMENS + "****)"+CRLF+CRLF+;
                   "Um erro grave ocorreu na inicializacao do sistema"+CRLF+;
                   "Favor entrar em contato com o:"+CRLF+;
                   "Suporte tecnico SuaEmpresa Ltda"+CRLF+;
                   "   Telefones:"+CRLF+;
                   "   Central: (0xx11) 9999-9999"+CRLF+;
                   "   Email: suporte@suaempresa.com.br" )
            MsgStop( cMensa )
            QUIT
         ENDIF
      ENDIF
   endif

Resto do codigo principal do aplicativo contendo Window, Menus, Buttons, etc

Código: Selecionar todos

   // Funcoes de critica do registro
   FUNCTION PROTECT3()
      PRIVATE ARQ, BUFFERS, RET, PALAVRA, P, T, ARQUIVO1
      SET CENTURY OFF
      REGISTRO := "HDHDHDHDRBRBRBRB99999999YYYYYYYYYYYY" // Nao altere este conteudo
      HDSERIAL := SUBSTR(HDSERIAL(),1,8)                 // Serial do HD
      MAXDAYS  := "30"                                   // Tempo maximo de DIAS de uso com no maximo 2 digitos
      ROMBIOS  := "RBRBRB"                               // CheckSum da RomBios, nunca modifique esta variavel
      MAXUSERS := "05"                                   // Maximo de usuarios por sessao
      MAXTRIAL := SUBSTR(STRTRAN(DTOC(MAXTRIAL(MAXDAYS)),'/',''),1,6) // Tempo maximo de uso
      // Altere estas 3 linhas com o nome de seu aplicativo principal
      ARQUIVO1 := "NFWH.EXE"                             // Nome do aplicativo
      PALAVRA  := "KONECTIVA"                            // String a ser protegida
      ARQUIVO  := "NFWH.EXE"
      //
      PROTEGER := HDSERIAL+MAXDAYS+ROMBIOS+MAXUSERS+MAXTRIAL    // Dados para serem armazenados
      // Verifica a protecao
      HDSERIAL := SUBS(REGISTRO, 1, 8)      // Serial do HD
      MAXDAYS  := VAL(SUBS(REGISTRO, 9, 2)) // Maximo de Dias
      ROMBIOS  := SUBS(REGISTRO,11, 6)      // STR(ROMCKSUM(),8)          // CheckSum da RomBios
      MAXUSERS := VAL(SUBS(REGISTRO,17, 2)) // Maximo de usuarios por sessao
      MAXTRIAL := CTOD(SUBS(REGISTRO,21, 2)+"/"+;
                       SUBS(REGISTRO,19, 2)+"/"+;
                       SUBS(REGISTRO,23, 2))
      DESLOCA  := VAL(SUBS(REGISTRO,25,12))
      //
      // -> Rotinas de verificacao de travas
      IF HDSERIAL() <> HDSERIAL        ; RETURN 1; ENDIF
      IF ROMBIOS(ROMBIOS) <> ROMBIOS   ; RETURN 2; ENDIF
      IF MAXUSERS(MAXUSERS) > MAXUSERS ; RETURN 3; ENDIF
      IF DATE() > MAXTRIAL             ; RETURN 4; ENDIF
      RETURN 0
   FUNCTION HDSERIAL()
      RETURN ALLTRIM(STR(nSerialHD()))
   FUNCTION MAXUSERS(MAXUSERS)
      RETURN 0
   FUNCTION ROMBIOS(ROMBIOS)
      RETURN ROMBIOS
   FUNCTION MAXTRIAL(MAXDAYS)
      RETURN date()+val(MAXDAYS)
   FUNCTION ACHOU(PALAVRA)
      PRIVATE Q
      FSEEK(ARQ,0,0)
      FOR Q = 0 TO T STEP + 512
          FREAD(ARQ, @BUFFER, 512)
          IF AT(STRING, BUFFER) # 0
             RETURN Q
          ENDIF
      NEXT
      RETURN 0
Estas rotinas poderão ser usadas também em aplicativos DOS bastando modificar o codigo do REGISTRO.EXE retirando o que for referente ao FIVEWIN.

Uma vez gravada a informação de registro o aplicativo sera executado somente na maquina em que foi instalado. se por acaso for copiado ele não executara mais.

Portanto após compilar o aplicativo o mesmo já deve ser empacotado para entrega/instalação, pois se for executado não rodará na maquina do cliente.

As funções trabalham com o numero serial do hd em que foram instalados e portanto para saber qual o codigo de liberação para este exemplo basta calcular:

99999999 - Serial do Hd = Codigo de liberação

Ou seja:

99999999 - 3210-9876 = 67890123

Mas voces poderão criar qualquer tipo de geração de código de registro e contrasenha.

Se quizerem aprender sobre criptografia acessem este link aqui

@braços :?)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

SEGURANCA - Modulo de registro de aplicativo com HDserial...

Mensagem por Pablo César »

rochinha escreveu:Se quizerem aprender sobre criptografia acessem este link aqui
Rochinha, o link que você tinha citado (ja há algum tempo) não está valendo mais. Seria este aqui ? http://www.numaboa.com/downloads/3-criptologia
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: SEGURANCA - Modulo de registro de aplicativo com HDserial...

Mensagem por rochinha »

Amiguinho,

É o mesmo lugar sim, como houve upgrade do site o link ficou perdido. Isto acontece.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
pmajosil
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 12 Nov 2010 18:08
Localização: Guarapuava-PR

Re: SEGURANCA - Modulo de registro de aplicativo com HDserial...

Mensagem por pmajosil »

Rochinha li sua rotina de registro de aplicativo e acho que pode me ajudar: Veja eu preciso fazer uma especie de bloqueio mensal da senha para abertura de um sistema instalado em um Clube para controlar o recebimento pelo direito de uso(locação) acho que voce deve ter algo pronto para me dar uma mão. Se puder, ficarei mui agradecido,
pmajosil
Responder