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)
Introdução Neste tutorial iremos ver como crackear um aplicativo protegido (de uma péssima maneira) com o C500, um dongle brasileiro da empresa SafeNet. Iremos simular a presença do dongle simplesmente reescrevendo uma função 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 referência 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 função 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 MOV DWORD PTR DS:[7B1D24],EA X CMP DWORD PTR DS:[7B1D24],0 JE 004E4600
; /FileName = "C50032.DLL" ; \LoadLibraryA
Depois pega o nome da função a ser chamada C500, e pega o seu endereço na dll com a função 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 MOV DWORD PTR DS:[7B1D28],EA X
; ; ; ;
/ProcNameOrOrd inal = "C500" | |hModule => NULL \GetProcAddres s
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 endereço 004E4591 ele pega a string 20Y021SH00 e a converte em uma string com 10 caracteres, repare a comparação no endereço 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 endereço 004E45BC ele coloca na primeira posição da string de acesso ao plugue o número 3. Depois coloca o 0 no final da string. Em seguida passa o endereço da senha de acesso para o registrador EAX e em seguida chama a função 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, então pula para o endereço 004E45E6 onde processa o erro de acesso. Senão 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
; /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 início da string de acesso ao plugue, em seguida passe para a função C500. Esta função recebe por referência a string de acesso e retorna o código interno do plugue que foi definido na formatação. Se esta string for igual ao que o programa está comparando, então o plugue está presente.
Criando a DLL no Delphi Abra o Delphi, clique em File -> New -> Other. E escolha DLL Wizard.
Este é o código que vem por padrão 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 código 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 código de retorno, lembrando que este tem 10 bytes.
library C50032; type
retorno = string[10];
end.
E criar a função C500. library C50032; type
retorno = string[10];
function C500(var senha: retorno): integer; begin senha := ‘EASYEASY0’; // Senha comparada no programa C500 := 0; // Retorno da função end; end.
E agora vamos exportar esta função: library C50032; type
retorno = string[10];
function C500(var senha: retorno): integer; begin senha := ‘EASYEASY0’; // Senha comparada no programa C500 := 0; // Retorno da função end; exports C500; end.
Agora salvamos o projeto como C50032 e depois compilamos a dll com CTRL + F9. Com isso teremos a dll no diretório onde foi salvo o projeto. Copie-a para a pasta do programa confirmando a substituição.
Crackeando o Dongle PROTEQ Compact C50032 com o uso de uma DLL – por RUMBLE E execute o software.
:D Nossa DLL funcionou perfeitamente!!!
Conclusão 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]