Você está na página 1de 8

Crackeando o Dongle PROTEQ Compact C50032 com o uso de uma DLL por RUMBLE

Crackeando o Dongle PROTEQ Compact C50032 com o uso de uma DLL


[RUMBLE 30 de outrubro de 2006] Alvo: EDS70 ( Easy Dental 7.0)

Introduo
Neste tutorial iremos ver como crackear um aplicativo protegido (de uma pssima maneira) com o C500, um dongle brasileiro da empresa SafeNet. Iremos simular a presena do dongle simplesmente reescrevendo uma funo da DLL C50032.

Ferramentas que iremos utilizar neste tutorial


Borland Delphi (para compilar a DLL) OllyDBG Manual do Desenvolvedor Compact C500

Ao ataque
Rodamos o programa e temos a seguinte mensagem:

Carregamos no OllyDBG, vamos em Search For -> All Referenced Text Strings.

Crackeando o Dongle PROTEQ Compact C50032 com o uso de uma DLL por RUMBLE

Vamos buscar a string C500.

Clicamos na primeira referncia e colocamos um Breakpoint.

Agora rode o programa (F9). Ele ir parar no breakpoint.

Crackeando o Dongle PROTEQ Compact C50032 com o uso de uma DLL por RUMBLE

Vamos entender o que est se passando por aqui... Primeiro ele pega o nome da dll C50032.DLL, carrega com a funo LoadLibraryA, verifica se a dll foi carregada com xito.
004E455D 004E4562 004E4567 004E456C 004E4573 |. |. |. |. |. 68 E0464E00 E8 CD37F2FF A3 241D7B00 833D 241D7B00 00 0F84 87000000 PUSH 004E46E0 CALL <JMP.&kernel32.LoadLibraryA> MOV DWORD PTR DS:[7B1D24],EAX CMP DWORD PTR DS:[7B1D24],0 JE 004E4600 ; /FileName = "C50032.DLL" ; \LoadLibraryA

Depois pega o nome da funo a ser chamada C500, e pega o seu endereo na dll com a funo GetProcAddress. Passa o retorno que est em EAX para DWORD PTR DS:[7B1D28].
004E4579 004E457E 004E4583 004E4584 004E4589 |. |. |. |. |. 68 A1 50 E8 A3 EC464E00 241D7B00 CB36F2FF 281D7B00 PUSH 004E46EC MOV EAX,DWORD PTR DS:[7B1D24] PUSH EAX CALL <JMP.&kernel32.GetProcAddress> MOV DWORD PTR DS:[7B1D28],EAX ; ; ; ; /ProcNameOrOrdinal = "C500" | |hModule => NULL \GetProcAddress

Crackeando o Dongle PROTEQ Compact C50032 com o uso de uma DLL por RUMBLE

Agora vamos entender como ele prepara a chave para acessar o plugue. No endereo 004E4591 ele pega a string 20Y021SH00 e a converte em uma string com 10 caracteres, repare a comparao no endereo 004E45B6 CMP [EBP-C], 0A // 10 em decimal
004E458E 004E4591 004E4596 004E459B 004E45A2 004E45A5 004E45A8 004E45AC 004E45AF 004E45B3 004E45B6 004E45BA |. |. |. |. |> |. |. |. |. |. |. |.^ 8D45 F8 BA FC464E00 E8 A90BF2FF C745 F4 01000000 8B45 F8 8B55 F4 8A4410 FF 8B55 F4 884415 E9 FF45 F4 837D F4 0A 75 E6 LEA EAX,DWORD PTR SS:[EBP-8] MOV EDX,004E46FC CALL 00405144 MOV DWORD PTR SS:[EBP-C],1 /MOV EAX,DWORD PTR SS:[EBP-8] |MOV EDX,DWORD PTR SS:[EBP-C] |MOV AL,BYTE PTR DS:[EAX+EDX-1] |MOV EDX,DWORD PTR SS:[EBP-C] |MOV BYTE PTR SS:[EBP+EDX-17],AL |INC DWORD PTR SS:[EBP-C] |CMP DWORD PTR SS:[EBP-C],0A \JNZ SHORT 004E45A2 ; ASCII "20Y02SH00"

E agora a rotina que acessa o plugue. No endereo 004E45BC ele coloca na primeira posio da string de acesso ao plugue o nmero 3. Depois coloca o 0 no final da string. Em seguida passa o endereo da senha de acesso para o registrador EAX e em seguida chama a funo C500 da dll.
004E45BC 004E45C0 004E45C4 004E45C7 004E45C8 |. |. |. |. |. C645 C645 8D45 50 FF15 E9 03 F3 00 E9 281D7B00 MOV BYTE PTR SS:[EBP-17],3 MOV BYTE PTR SS:[EBP-D],0 LEA EAX,DWORD PTR SS:[EBP-17] PUSH EAX CALL DWORD PTR DS:[7B1D28]

C50032.C500

Depois que ele chama a dll, vamos entender a rotina que ele processa o retorno. Compara o primeiro byte com 0. Se igual a zero, ento pula para o endereo 004E45E6 onde processa o erro de acesso. Seno coloca em EAX o endereco da string de retorno do plugue e compara com EASYEASY0.
004E45CE 004E45D2 004E45D4 004E45D7 004E45D8 004E45DD |. |. |. |. |. |. 807D E9 00 74 12 8D45 EA 50 68 08474E00 E8 3238F2FF CMP BYTE PTR SS:[EBP-17],0 JE SHORT 004E45E6 LEA EAX,DWORD PTR SS:[EBP-16] PUSH EAX PUSH 004E4708 CALL <JMP.&kernel32.lstrcmpA>

; /String2 ; |String1 = "EASYEASY0" ; \lstrcmpA

Ok, vamos colocar um breakpoint e 004E45CE e rodar o programa. Quando parar, d uma olhada nos registradores.
EAX ECX EDX EBX ESP EBP ESI FFFFFFF9 7C80FECF kernel32.7C80FECF 00150608 7FFDF000 0012FEB4 0012FED8 FFFFFFFF

Olhe o valor de EAX = FFFFFFF9 ( -7 ) Vamos ver o que o Manual do desenvolvedor nos fala a respeito de acesso ao plugue.

Crackeando o Dongle PROTEQ Compact C50032 com o uso de uma DLL por RUMBLE

Agora vamos ver no manual a respeito do acesso ao plugue.

Crackeando o Dongle PROTEQ Compact C50032 com o uso de uma DLL por RUMBLE Basicamente o acesso o seguinte: Adiciona 3 ao incio da string de acesso ao plugue, em seguida passe para a funo C500. Esta funo recebe por referncia a string de acesso e retorna o cdigo interno do plugue que foi definido na formatao. Se esta string for igual ao que o programa est comparando, ento o plugue est presente.

Criando a DLL no Delphi


Abra o Delphi, clique em File -> New -> Other. E escolha DLL Wizard.

Este o cdigo que vem por padro no delphi.


library Project2; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses SysUtils, Classes; {$R *.res} begin end.

Vamos deixar o cdigo deste jeito:


library C50032; end.

Crackeando o Dongle PROTEQ Compact C50032 com o uso de uma DLL por RUMBLE Agora vamos definir o tipo do cdigo de retorno, lembrando que este tem 10 bytes.
library C50032; type end. retorno = string[10];

E criar a funo C500.


library C50032; type retorno = string[10];

function C500(var senha: retorno): integer; begin senha := EASYEASY0; // Senha comparada no programa C500 := 0; // Retorno da funo end; end.

E agora vamos exportar esta funo:


library C50032; type retorno = string[10];

function C500(var senha: retorno): integer; begin senha := EASYEASY0; // Senha comparada no programa C500 := 0; // Retorno da funo end; exports C500; end.

Agora salvamos o projeto como C50032 e depois compilamos a dll com CTRL + F9. Com isso teremos a dll no diretrio onde foi salvo o projeto. Copie-a para a pasta do programa confirmando a substituio.

Crackeando o Dongle PROTEQ Compact C50032 com o uso de uma DLL por RUMBLE E execute o software.

:D Nossa DLL funcionou perfeitamente!!!

Concluso
Agradecimentos ao meus grandes amigos: piteco, bruno maestro, nightwisher, link. Todos os amigos do CRACKSLATINOS, Mestre Ricardo, Juan Jose, Lisa && Alquista, Ulaterck, Marciano, +NCR, MORALES, Arapumk. Obrigado pelos maravilhosos tutoriais de Asprotect.
[RUMBLE 30 de outubro de 2006]