Tutorial sobre Delphy CrackMe 2.d


 
Víctima:
Delphy CrackMe 2.d 
URL:
http://www.2Sweeet.tsx.org
Descripción:
Programa cuya unica finalidad es ser crackeado
Tamaño del ejecutable:
133 Kbytes
Tipo de Protección:
Anti-Win32Dasm, Anti-FrogSice, posible Encriptacion y Serial
Método de ataque
Obtencion de la rutina de generacion del serial a traves del SoftIce
Objetivo
Serial & Keygen
Cracker
Mr_Burns [K-FoR]
Dificultad
Newbie - Aficionado - Avanzado - Experto - Élite
Herramientas 
SofIce, papel y boli & Tasm v5.0
Fecha:
6-12-2000

 
 
 
INTRODUCCIÓN

 
 

HOLA DE NUEVO A TODOS!!! Espero que mi demora en el mundillo de los tutoriales no haya sido tan grande. Ante la falta de tiempo, mis proyectos Underground se ven retrasados, pero gracias a este puente, os podre “deleitar” con otro tutorial mas.

Antes de nada explicar que el CrackMe ha sido creado por 2Sweeet, no lo conozco pero he visto trabajos suyos y, la verdad, me han parecido bastante majos.

Despues de tanto sentimentalismo creo que deberiamos empezar con el trabajo, el cual me ha gustado hacer ;-)


 
LET'S ROCK

 
 

Comenzamos ejecutando el CrackMe. Observamos que tenemos 3 editbox para introducir nuestros datos, y tres botones: “Register”, “Close” y“About”. Bueno, introducimos nuestros datos y apretamos “Register”, veremos que abajo de la win nos pone “Status: Wrong Code”. Vaya!!! Parece que no he acertado en el serial xDDDDD

Una vez estudiado como funciona el CrackMe haremos lo siguiente:

1º. Ejecutamos el Win32Dasm y lo desensamblamos... pero... en la direccion 41FCBC éste se nos cuelga. Esto quiere decir que hay dos posibilidades: esta empakado y/o encriptado o tiene anti-desensamblador. Yo voto por el anti-desensamblador porque el tamaño del CrackMe no es muy pequeño que digamos.

2º. Como no nos ha rulado, seguiremos probando con el IDA Pro a ver si sus protecciones anti-desensamblador se las puede saltar... pero tampoco nos rula. Este nos indica que no puede abrirse. :(

3º. Ejecutaremos el ProcDump para ver si esta encriptado el dichoso programilla de los ..... ;-) Pero... tampoco funciona, al abrir el CrackMe a traves de el “PE Editor” no avisa con una frase como esta “Error while accesing the file (READ/WRITE)”.

4º. Nos aferraremos a la unica posibilidad que tenemos: el SoftIce (SICE). Abrimos el CrackMe y rellenamos nuestros datos:

Username: Mr_Burns

Company: K-FoR

Key-String: 12345678

Al rellenar el serial nos daremos cuenta que tan solo nos deja introducir 8 caracteres. Hmmmm!!! Esto me esta dando una pistas preciosas... el serial puede que este en Hexadecimal!!!

Despues de esta deduccion, nos metemos en el SICE (Control + D) y metemos un bpx hmemcpy, y salimos de nuevo al CrackMe para apretar el boton “Register”. Inmediatamente saltamos al SICE, de nuevo. Quemamos la tecla F12 hata llegar a la direccion 442291 donde observamos que eax = Username.

Auna vez aqui seguiremos dos caminos: uno sacar un serial valido; y una vez conseguido esto buscar la rutina de generacion del serial.
 
 
 
 

OBTENCION DEL SERIAL

 
 

A medida que traceamos vemos algo como esto:

mov eax,[ebp-04] <--- EAX = Nombre

Call 403BF8 <--- Comprueba que haya algo escrito, osea difrente de 0

Call 407904 <--- Capta el nº de letras que posee el nombre

mov ecx,eax <--- ECX = Nº de letras

mov edi,1

mov eax,1

cmp eax,ecx <--- Comprueba que el nombre sea mayor que 1 sino... error

ja 4422BD

...

Despues de haber comprobado que el nombre es correcto y haber sido guardado, realiza exactamente la misma operación con la compañía. Tracenado mas sobre el codigo vemos que realiza una serie de opreciones... hasta llegar a un salto sospechoso en 442293 donde aparece:

mov edx,[ebp-18] <--- Nuestro serial (12345678)

mov eax,[ebp-14] <--- EL SERIAL CORRECTO!!!!!!!! (B2B6D624)

Call 403B44 <--- Compara los serial

jz 4425AC <--- Salta si son iguales

Espero no tener que deciros que para ver el serial verdadero teneis que poner “d eax” ;-)

Como podreis ver, llegar a descubrir el serial es extremadamente facil. Una vez apuntado nuestro serial salimos del SICE y lo comprobamos para ver si ese es el verdadero, no hace falta que os diga que si que lo es xDDDD

Ahora iremos a por el keygen!!!!
 
 
 
 

REALIZACION DEL KEYGEN

 
 

Una vez obtenido el serial correcto, nos dedicaemos a un estudio mas en profundidad sobre el codigo, para captar el generador de llaves. Asi que volvemos a ejecutar el CrackMe, introducimos los datos, entramos en el SICE, ponemos le bpx hmemcpy, salios del SICE, apretamos “Registrar”, y vamos de nuevo a la direccion 442291. Alli podremos observar lo siguiente:

mov eax,[ebp-04] <--- EAX = Nombre

Call 403BF8 <--- Comprueba que haya algo escrito oase difrente de 0

Call 407904 <--- Capta el nº de letras que posee el nombre

mov ecx,eax <--- ECX = Nº de letras

mov edi,1

mov eax,1

cmp eax,ecx <--- Comprueba que el nombre sea mayor que 1 sino... error

ja 4422BD

mov edx,[ebp-04] <-- Edx apunta a la Nombre

movzx edx,byte ptr [eax+edx-01] <-- Edx = carácter de la nombre

inc eax <-- Eax + 1

add edi,edx <-- Edi + Edx

cmp eax,ecx <-- Compara eax con ecx

jbe 4422AE <-- Si eax > ecx Realiza de nuevo la operacion

lea edx,[ebp-0C]

mov eax,[ebx+2C8]

Call 423224

Una vez terminado el bucle que trabaja con el Username (en mi caso Mr_Burns) tenemos guardado un numero en edi que usara mas adelante, para poder verlo introducimos “? edi” (en mi caso sera 809). Despues de haber trabajado con el Username, va a por el Company:

mov eax,[ebp-0C] <-- eax apunta a la compañia

Call 403BF8 <-- Comprueba que halla escrito algo

Call 407904 <-- Nº de caracteres de la compañia

mov [ebp-08],eax <-- [ebp-08] = Nº de caracteres de la compañia

mov esi,1

mov eax,1

cmp eax,[ebp-08] <-- Compara eax con [ebp-08]

ja 4422FA <-- Si eax > [ebp-08] ERROR!

mov edx,[ebp-0C] <-- Edx apunta a la compañia

movzx edx,byte ptr [eax+edx-01] <-- Edx = Carácter de la compañia

inc eax <-- Eax + 1

add esi,edx <-- esi + edx

cmp eax,[ebp-08] <-- Compara eax com [ebp-08]

jbe 4422EA <-- Si eax > [ebp-08] Realiza de nuevo la operacion

Espero que os hallais dado cuenta que realiza exactamente la misma operación con la compañía (en mi caso K-FoR) y que el resultado de esa serie de operaciones esta guardado en esi, para poder verlo poneis “? esi” (en mi caso sera 384)

Despues de esto hay una serie de operaciones a las que no debemos hacer caso, asi que tracearemos hasta llegar a la direccion 442351, donde veremos:

lea eax,[edi+esi] <-- eax = edi + esi

imul eax,eax,1F2h <--

mov [ebp-10],eax <-- [ebp-10] = eax

mov eax,[ebp-10] <-- Viceversa

imul dword ptr [ebp-10] <-- eax * [ebp-10]

imul edi <-- Multiplicacion por edi

mov [ebp-10],eax <-- [ebp-10] = eax

sub [ebp-10],esi <-- [ebp-10] - esi = SERIAL CORRECTO!!!!

Al final de esta serie de operaciones tenemos en [ebp-10] un numero un tanto atractivo... ¿y sabeis porque? Pq el numero es nuestro serial correcto en decimal!!!!!!!!!! Cuando consegui el serial, lo primero que hice es pasarlo a decimal ya que la mayoria de las veces se trabaja en decimal para luego pasarlo a otra base. Asi que ya estaba todo solucionado... ahora habia que hacer el KeYgEn en ASM.

Con todos los comentarios que he puesto en el tutorial no creo que os resulte dificil hacel el keygen en cualquier otro lenguaje, y para los que sabemos programar en asm esto no es nada ya que tan solo hay que copiar. Como el tamaño de este tutorial ha sobrepasado mis intenciones os pondre tan solo el codigo comentado (como hago siempre) y nada mas, aun asi si teneis cualquier tipo de duda, mandadme un mail.

;Delphi CrackMe 2.d KeYgEn

;CoDeD bY Mr Burns [K-FoR]

;DaTe: 4-12-2000
 

 

.MODEL TINY

.CODE

.386

ORG 100h
 

 

Start: jmp LetsRock
 

 

Intro db 10,13,'Delphi CrackMe 2.d KeYgEn CoDeD bY Mr. Burns [K-FoR]'

db 10,13,'THe CRaCKMe iS WRiTTeN bY 2Sweeet'

db 10,13,'WeBSiTeS: http://go.to/mr_burns/'

db 10,13,' http://kfor.cjb.net/',10,13

db 10,13,'eNTeR YouR USeRNaMe: '

Nombre db 50,0

Nombre2 db 50 DUP(0)

CompanyOut db 10,13,'eNTeR YouR CoMPaNy: $'

Company db 25,0

Company2 db 25 DUP(0)

SerialOut db 10,13,'YouR KeY-STRiNG iS: '

Serial db 9 DUP(0)

SerialEnd db 10,13,'$'

TempSerial db 9 DUP(0)

TempSerialEnd db 0
 

 

LetsRock:

mov ah,09h ;Introduce un texto por pantalla

lea dx,Intro

int 21h
 

 

mov ah,0Ah ;Lee el nombre introducido

lea dx,Nombre

int 21h
 

 

mov edi,1 ;EDI = 1

mov eax,1 ;EAX = 1
 

 

NameLooP:

lea edx,Nombre2 ;EDX apunta al Nombre

movzx edx,byte ptr [eax+edx-1] ;edx caractrer del nombre

inc eax ;EAX + 1

add edi,edx ;EDI + EDX (resultado en EDI)

cmp eax,ecx ;Compara EAX con ECX

jbe NameLooP ;Si EAX < ECX salta
 

 

mov ah,09h ;Saca un texto por pantalla

lea dx,CompanyOut

int 21h
 

 

mov ah,0Ah ;Lee la compañia

lea dx,Company

int 21h
 

 

mov esi,1 ;ESI = 1

mov eax,1 ;EAX = 1
 

 

CompanyLooP:

lea edx,Company2 ;EDX apunta a la Compañia

movzx edx,byte ptr [eax+edx-1] ;EDX = Caracter de la compañia

inc eax ;EAX + 1

add esi,edx ;ESI + EDX (resultado en ESI)

cmp eax,ecx ;Compara EAX con ECX

jbe CompanyLooP ;Si EAX < ECX salta
 

 

mov ecx,edi ;ECX = EDI

add edi,esi ;EDI + ESI

mov eax,edi ;EAX = EDI

imul eax,eax,1F2h ;

mov ebx,eax ;EBX = EAX

mov eax,ebx ;EAX = EBX

imul ebx ;* EBX

mov edi,ecx ;EDI = ECX

imul edi ;* EDI

mov ebx,eax ;EBX = EAX

sub ebx,esi ;EBX - ESI = Serial en decimal

mov eax,ebx ;EAX = EBX = Serial
 

 

Hex_Convert: ;Rutina que convierte el numero decimal

lea esi,TempSerialEnd-1 ;a Hexadecimal y que no voy a comentar.

mov edx,4
 

 

Loopy:

xor ebx,ebx

mov bl,al

movzx ebx,bl

and bl,0Fh

add bl,30h

cmp bl,39h

jle Ok1

add bl,7

mov byte ptr [esi],bl

dec esi

jmp Part2
 

 

Ok1:

mov byte ptr [esi],bl

dec esi
 

 

Part2:

mov bl,al

movzx ebx,bl

shr bl,4

add bl,30h

cmp bl,39h

jle Ok2

add bl,7

mov byte ptr [esi],bl

dec esi

jmp Part3
 

 

Ok2:

mov byte ptr [esi],bl

dec esi
 

 

Part3:

shr eax,8

dec edx

jnz Loopy
 

 

ConvertDone:

inc esi

lea di,Serial
 

 

CopyNumber:

movsb

cmp byte ptr [esi],0

jne CopyNumber
 

 

mov ah,09h

lea dx,SerialOut

int 21h

mov ah,4Ch

int 21h
 

 

; end start
 
 
 
 

AGRADECIMIENTOS Y DESPEDIDAS

 
 

Antes de marcharme me guataria saludar a todos los miembros del grupo K-FoR, en especia a ViPeR y a Pr@fesor X... y me gustaria saludar tambien a todos los componentes del canal #crackers.

Espero volver a veros pronto por aquí, aunque todo depende del tiempo que tenga.


Como siempre digo en mis tutoriales, si deseais hablar conmigo buscad en:


 
NiCK
SeRViDoR
CaNaL
Mr_Burns
irc.irc-hispano.org
CRaCKeRS
[MoRDReD]
irc.chat.org
TnTCRaCKeRS & WkT

O por el contrario si tan solo deseas mandarme un e-mail: mr_burns_kfor@hotmail.com

http://go.to/mr_burns/http://mr_burns.go.to/http://mrburns.da.ru/

http://pagina.de/kforhttp://kfor.cjb.net

df“La ignorancia no es una es una excusa, es una opción.”