Karpoff Spanish Tutor 1999-2002

Programa:

The House of the Dead 2


 

PROTECCION: CD-Check
Objetivo: Matar el Cd-CHeck
Descripcion:
Se trata de un juego mu chulo donde matas a un taco de mostruitos, xDDD
Dificultad: Newbie
DOWNLOAD: ?????????
Herramientas: W32Dasm, Soft-Ice y Hex WorkShop
CRACKER:
AuspeX
  FECHA: 01/04/2002

 

 INTRODUCCION

 

Aquí tenemos un jueguesito, sinceramente, el primer juego que crackeo, hasta ahora siempre había crackeado programas (juego muy poco, jeje), pero es que este me lo había dejado un colega, y como tenía que pagarle el CD entonces pensé que mejor intentaba crackearlo y yo se lo devolvía (no podeis imaginar hasta que punto soy un agarrao, ajajaaja). Así que este tuto se lo dedico a mi colega Dani: ¡va por ti DANI!

The House of the Dead, bonito juego, y estupida protección la verdad sea dicha. Creo que los programadores encargados de protegerlo no se han exprimido demasiado la cabeza, así que habrá que enseñarles a esta panda de burros por donde se les puede meter mano a sus productos, y que programen mejor el CD-Check

 

 AL ATAKE

 

Lo primero que hacemos es instalar el juego. Luego nos damos el lote de jugar para descargar adrenalina matando zombies, y una vez desahogados por completo nos metemos al tajo. Quitamos el CD e intentamos ejecutar de nuevo:

¿Típico verdad?, pués manos a la obra. Vamos a entrar en el Sice y colocamos un breakpoint en la API MessageBoxA (acerté a la primera, jaja), le damos a reintentar a ver que sucede... Revienta el sice justo en la llamada (picó el anzuelo). Salimos de la llamada pulsando F12 y nos encontramos con todo este código (código abierto con el W32Dasm, no se puede copiar la ventana del sice):

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A5CB7(C)
|

............

............

:004A5D22 FFD5 call ebp <-----aquí se llama al mensajito de error (falta el CD)
:004A5D24 6A00 push 00000000
:004A5D26 8BF0 mov esi, eax
:004A5D28 FFD3 call ebx
:004A5D2A 83FE02 cmp esi, 00000002 <-----comprueba a ver si hemos cancelado
:004A5D2D 7421 je 004A5D50 <----- salta si se ha pulsado cancelar (2 he visto que es cancelar y 4 reintentar)
:004A5D2F E964FFFFFF jmp 004A5C98 <-----se intenta de nuevo

**************************************************************************************

Ahora os pondré todo el código de los alrededores desde donde se salta a esta zona de chico malo, para que se pueda comprender como hace el programa para chequear el CD-ROM. Si os marea un poco la cabeza no mireis, por supuesto no lo pienzo explicar todo al detalle, sólo lo más importante:

* Reference To: KERNEL32.CreateFileA, Ord:0034h <-----más abajo veremos para que utiliza esta API
|
:004A5C86 8B3D80304C00 mov edi, dword ptr [004C3080]

* Reference To: USER32.ShowCursor, Ord:0266h <-----no tengo ni idea para que la utiliza
|
:004A5C8C 8B1D48324C00 mov ebx, dword ptr [004C3248]

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:004A5C92 8B2DFC314C00 mov ebp, dword ptr [004C31FC] <-----coloca la dirección de MessageBoxA en este registro para luego, si hace falta jodernos un poquito con su puñetero mensaje de error (recordad el CALL EBP de arriba que sacaba nuestro mensaje de error)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A5D2F(U)
|
:004A5C98 8D442410 lea eax, dword ptr [esp+10]
:004A5C9C 50 push eax
:004A5C9D 6800010000 push 00000100

* Reference To: KERNEL32.GetLogicalDriveStringsA, Ord:011Eh
|
:004A5CA2 FF1504314C00 Call dword ptr [004C3104] <-----llamada que obtiene una cadena con las unidades válidas que existen en el ordenata, en mi caso: a:\ c:\ d:\ e:\ (a -> disquetera, c,d -> disco duro, e -> cd-rom)
:004A5CA8 85C0 test eax, eax
:004A5CAA 0F84A0000000 je 004A5D50
:004A5CB0 8D742410 lea esi, dword ptr [esp+10]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004A5D0B(U)
|
:004A5CB4 803E00 cmp byte ptr [esi], 00 <-----comprueba si ha terminado de checkear todas las unidades válidas
:004A5CB7 7454 je 004A5D0D <-----saltamos a la zona de chico malo (nos manda al carajo)
:004A5CB9 56 push esi <-----mandamos como parámetro la dirección de la letra de la unidad que estamos checkeando

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h
|
:004A5CBA FF1500314C00 Call dword ptr [004C3100] <-----obtenemos un valor en eax que indica la unidad
:004A5CC0 83F805 cmp eax, 00000005 <-----comprueba si la unidad es cd-rom (0,1 -> ni puta idea, 2 -> disquete, 3 -> disco duro, 4 -> unidad de red, 5 -> cd-rom). Esta comprobación es muy interesante
:004A5CC3 7538 jne 004A5CFD <----- salta si no coincide
:004A5CC5 8B0D90C87D00 mov ecx, dword ptr [007DC890]
:004A5CCB 51 push ecx
:004A5CCC 56 push esi

* Possible StringData Ref from Data Obj ->"%s%s"
|
:004A5CCD 68A4765900 push 005976A4
:004A5CD2 6858CF7D00 push 007DCF58
:004A5CD7 E8BF680000 call 004AC59B
:004A5CDC 83C410 add esp, 00000010
:004A5CDF 6A00 push 00000000
:004A5CE1 6880000000 push 00000080
:004A5CE6 6A03 push 00000003 <-----creo que es un parámetro que indica que el archivo ha de estar ahí por cojones, pero no esoty seguro de esto
:004A5CE8 6A00 push 00000000
:004A5CEA 6A00 push 00000000
:004A5CEC 6800000080 push 80000000 <-----lectura del archivo
:004A5CF1 6858CF7D00 push 007DCF58 <----- manda la dirección de esta cadena: unidad:\Hod2.ico ???? luego explicaré esto, que realmente es la clave de todo este royo
:004A5CF6 FFD7 call edi <----- llamada a CreateFileA
:004A5CF8 83F8FF cmp eax, FFFFFFFF <-----si el archivo no está ahí, devuelve -1 en eax = FFFFFFFF
:004A5CFB 7537 jne 004A5D34 <-----si la cosa ha salido bien, salimos de la rutina y se ejecuta el juego

**************************************************************************************

Bueno, explicaré un poco lo que se puede hacer, pero una vez entendido todo el código de arriba, la cosa es facil, no?. Si más o menos lo habeis comprendido, nos damos cuenta de que checkea las unidades una por una hasta llegar a la unidad de CD-ROM. Cuando ve que la letra E (en mi caso) es dicha unidad busca en ella el archivo de icono Hod2.ico en la dirección E:\ pero como dicho archivito no está por que no hay CD que valga pos nos manda al carajo. Bueno, pués cambiemos ese JNE por un JMP para que salte siempre, esté o no el archivo en la dirección especificada, y sea cual sea la unidad donde esté mirando. Otra solución sería que en vez de comprobar con 00000005 compruebe con 00000003 (disco duro) y coloquemos el archivo Hod2.ico en la unidad c:\, pero sinceramente, ¿quien quiere hacer esta tontería?. Pués ya está, lo demas no tengo ganas de explicarlo, ya sabeis, lo de cambiar los bytes con el Hex WorkShop y to el royo ese, hacedlo ustedes, ¡VAGOSSSSS!. Bueno, lo explicaré, ya sabeis, pillamos el offset con el W32Dasm y abrimos Hex WorkShop, buscamos por offset: A5CFBh y cambiamos 7537 jne por 7437 je.

FINALIZANDO

Hay un monstruo que no consigo matar, uno que hay en la fase 4 con una cierra mecánica, creo que es en esa fase, jeje.

Bueno, para finalizar doy las gracias al grupo KFOR, a Karpoff y a todos los crackers que escriben tutoriales en sus páginas, por enseñarme todo lo que se y de los que aun puedo aprender muchísimo: GRACIAS A TODOS

 

 

Karpoff Spanish Tutor: Pagina dedicada a la divulgacion de informacion en Castellano, sobre Ingenieria Inversa y Programacion. Email "Colabora con tus Proyectos"
www.000webhost.com