Download - Crackeando Um Dongle PROTEQ C50032 Com Uso de Uma Dll - Por RUMBLE

Transcript
Page 1: Crackeando Um Dongle PROTEQ C50032 Com Uso de Uma Dll - Por RUMBLE

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

Crackeando o Dongle PROTEQ Compact C50032com 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)OllyDBGManual 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.

Page 2: Crackeando Um Dongle PROTEQ C50032 Com Uso de Uma Dll - Por RUMBLE

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.

Page 3: Crackeando Um Dongle PROTEQ C50032 Com Uso de Uma Dll - Por RUMBLE

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 |. 68 E0464E00 PUSH 004E46E0 ; /FileName = "C50032.DLL"004E4562 |. E8 CD37F2FF CALL <JMP.&kernel32.LoadLibraryA> ; \LoadLibraryA004E4567 |. A3 241D7B00 MOV DWORD PTR DS:[7B1D24],EAX004E456C |. 833D 241D7B00 00 CMP DWORD PTR DS:[7B1D24],0004E4573 |. 0F84 87000000 JE 004E4600

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 |. 68 EC464E00 PUSH 004E46EC ; /ProcNameOrOrdinal = "C500"004E457E |. A1 241D7B00 MOV EAX,DWORD PTR DS:[7B1D24] ; |004E4583 |. 50 PUSH EAX ; |hModule => NULL004E4584 |. E8 CB36F2FF CALL <JMP.&kernel32.GetProcAddress> ; \GetProcAddress004E4589 |. A3 281D7B00 MOV DWORD PTR DS:[7B1D28],EAX

Page 4: Crackeando Um Dongle PROTEQ C50032 Com Uso de Uma Dll - Por RUMBLE

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 |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]004E4591 |. BA FC464E00 MOV EDX,004E46FC ; ASCII "20Y02SH00"004E4596 |. E8 A90BF2FF CALL 00405144004E459B |. C745 F4 01000000 MOV DWORD PTR SS:[EBP-C],1004E45A2 |> 8B45 F8 /MOV EAX,DWORD PTR SS:[EBP-8]004E45A5 |. 8B55 F4 |MOV EDX,DWORD PTR SS:[EBP-C]004E45A8 |. 8A4410 FF |MOV AL,BYTE PTR DS:[EAX+EDX-1]004E45AC |. 8B55 F4 |MOV EDX,DWORD PTR SS:[EBP-C]004E45AF |. 884415 E9 |MOV BYTE PTR SS:[EBP+EDX-17],AL004E45B3 |. FF45 F4 |INC DWORD PTR SS:[EBP-C]004E45B6 |. 837D F4 0A |CMP DWORD PTR SS:[EBP-C],0A004E45BA |.^ 75 E6 \JNZ SHORT 004E45A2

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 |. C645 E9 03 MOV BYTE PTR SS:[EBP-17],3004E45C0 |. C645 F3 00 MOV BYTE PTR SS:[EBP-D],0004E45C4 |. 8D45 E9 LEA EAX,DWORD PTR SS:[EBP-17]004E45C7 |. 50 PUSH EAX004E45C8 |. FF15 281D7B00 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 |. 807D E9 00 CMP BYTE PTR SS:[EBP-17],0004E45D2 |. 74 12 JE SHORT 004E45E6004E45D4 |. 8D45 EA LEA EAX,DWORD PTR SS:[EBP-16]004E45D7 |. 50 PUSH EAX ; /String2004E45D8 |. 68 08474E00 PUSH 004E4708 ; |String1 = "EASYEASY0"004E45DD |. E8 3238F2FF CALL <JMP.&kernel32.lstrcmpA> ; \lstrcmpA

Ok, vamos colocar um breakpoint e 004E45CE e rodar o programa. Quando parar, dê uma olhada nos registradores.

EAX FFFFFFF9ECX 7C80FECF kernel32.7C80FECFEDX 00150608EBX 7FFDF000ESP 0012FEB4EBP 0012FED8ESI FFFFFFFF

Olhe o valor de EAX = FFFFFFF9 ( -7 )

Vamos ver o que o Manual do desenvolvedor nos fala a respeito de acesso ao plugue.

Page 5: Crackeando Um Dongle PROTEQ C50032 Com Uso de Uma Dll - Por RUMBLE

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.

Page 6: Crackeando Um Dongle PROTEQ C50032 Com Uso de Uma Dll - Por RUMBLE

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}

beginend.

Vamos deixar o código deste jeito:

library C50032;

end.

Page 7: Crackeando Um Dongle PROTEQ C50032 Com Uso de Uma Dll - Por RUMBLE

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çãoend;

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çãoend;

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.

Page 8: Crackeando Um Dongle PROTEQ C50032 Com Uso de Uma Dll - Por RUMBLE

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]