Karpoff Spanish Tutor

Programa:

eCookbook v1.0


 

PROTECCION: Name / Serial
Objetivo: Hacer un Keygen
Descripcion:
Este es un bonito programa de recetas de comida, puedes crear las tuyas o hacer uso de las casi 170 que trae el programa (lastimosamente en inglés), sin embargo, el programa está mal protegido. Esperemos que por ser la primera versión mejore en las próximas.
Dificultad: Facililla.
DOWNLOAD: http://code6.netfirms.com
Herramientas: TRW2000, W32dasm, MASM32
CRACKER: ByTESCRK   FECHA: 08/11/2001

 

 INTRODUCCION

Después de pasarme algunos días de vacaciones, he vuelto a las andadas ahora con este nuevo programa de nombre eCookbook, no pretendía que este fuera el noveno tutorial y sobre todo en base a este programa, pero me ha convencido lo tonto de esta protección, si es que así se le puede llamar a esto, tan solo imagínalo, tú sales de tu casa y dejas la llave debajo de la alfombra que está en la puerta, luego un desconocido llega, se para en la puerta de tu casa y piensa en donde podrías haber escondido la llave, luego se le ocurre que podría estar debajo de la alfombra frente a la puerta, algo así para con este programa, solo que no necesitamos pensar ni quebrarnos la cabeza para encontrar el serial válido, ahh! y por si fuera poco el otro programa ColorPal v1.0 se obtiene de la misma manera, la diferencia es que el serial es distinto (lógico no, me refiero a la manera de encontrar el serial), bueno ya verán a lo que me refiero.

 

 AL ATAKE

Bueno, vamos a empezar abriendo el programa y nos vamos a Help > About ... > Register, ya alli nos aparecen dos botones, uno de Ok y otro de Register y arriba el mensaje de que tenemos 30 días para registrarnos, hacemos clic en Register y nos aparecen nuestros fieles amigos (Mr. Ingrese Nombre y Mrs. License Key :D), ingresamos nuestros nombre y serial malo...

Full Name = ByTESCRK
License key = 19770424

Y nos aparece una ventanita de error que dice...

Your license key is not correct!
Please enter your license key exactly as you recieved it.

Ahora desensamblamos el archivo eCookbook.exe en el W32DASM y a Strings Reference allí buscamos ese error, vemos que aparecen varios

Los que nos interesan son:

You have not entered your name!
Your license key is not correct! <- Hacemos doble clic en este
Your name must be at least 6 characters <- Si entramos un nombre menor a 6 letras da error

Al hacer doble clic

:00498BCD E8127CFAFF call 004407E4
:00498BD2 6A00 push 00000000
:00498BD4 668B0DD88D4900 mov cx, word ptr [00498DD8]
:00498BDB B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Your license key is correct!"
|
:00498BDD B8E48D4900 mov eax, 00498DE4
:00498BE2 E8A514FAFF call 0043A08C
:00498BE7 C7864C02000001000000 mov dword ptr [esi+0000024C], 00000001
:00498BF1 EB43 jmp 00498C36

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049893A(C) <- Vamos a investigar en este salto
|
:00498BF3 6A00 push 00000000
:00498BF5 668B0DD88D4900 mov cx, word ptr [00498DD8]
:00498BFC B201 mov dl, 01

* Possible StringData Ref from Code Obj ->"Your license key is not correct!"
|
:00498BFE B8308E4900 mov eax, 00498E30 <- Caemos aqui
:00498C03 E88414FAFF call 0043A08C
:00498C08 EB2C jmp 00498C36

Vamos a ir a investigar a 0049893A y nos encontramos con esto...

:00498924 BA06000000 mov edx, 00000006
:00498929 E8B2C1F6FF call 00404AE0
:0049892E 8B9504FEFFFF mov edx, dword ptr [ebp+FFFFFE04]
:00498934 58 pop eax
:00498935 E82AC2F6FF call 00404B64 <= Ponemos un breakpoint aqui
:0049893A 0F85B3020000 jne 00498BF3
:00498940 B201 mov dl, 01
:00498942 A1A0194600 mov eax, dword ptr [004619A0]
:00498947 E85491FCFF call 00461AA0
:0049894C 8BD8 mov ebx, eax
:0049894E BA01000080 mov edx, 80000001
:00498953 8BC3 mov eax, ebx
:00498955 E8E691FCFF call 00461B40
:0049895A B101 mov cl, 01

* Possible StringData Ref from Code Obj ->"\Software\Code6\eCookbook"
|
:0049895C BA2C8D4900 mov edx, 00498D2C
:00498961 8BC3 mov eax, ebx
:00498963 E83C92FCFF call 00461BA4
:00498968 B9508D4900 mov ecx, 00498D50

* Possible StringData Ref from Code Obj ->"Registered"
|
:0049896D BA5C8D4900 mov edx, 00498D5C
:00498972 8BC3 mov eax, ebx
:00498974 E8C793FCFF call 00461D40
:00498979 8D95F0FDFFFF lea edx, dword ptr [ebp+FFFFFDF0]

Vamos a abrir nuestro TRW2000 y buscamos el programa clic en Ok y ponemos un punto de ruptura en 00498935 pues casi siempre los programas comparan el serial o lo generan en una call antes, salimos del TRW2000 con ctrl+n y carga el programa, nos vamos a Help > About ... > Register hacemos clic en OK, brinca el TRW2000 y que es este código extraño que vemos en EDX será nuestro código de registro, apuntémoslo, borremos el breakpoint con BC * y salimos de TRW2000 nuevamente y lo ingresamos, ok, ya estuvo programa registrado. Vieron, servido en bandeja de plata.

Pero dijimos que ibamos a hacer un keygen entonces sigamos...

Vamos investigar mas arriba y vemos que no hay ningún otro salto, que venga desde afuera, bueno buscaremos el principio de la rutina de generación del serial y es precisamente aqui...

:0049875C 55 push ebp <- Ponemos un breakpoint para romper desde aqui
:0049875D 8BEC mov ebp, esp
:0049875F B948000000 mov ecx, 00000048
...
...
...
:004987B0 E8FF7FFAFF call 004407B4
:004987B5 8B8524FEFFFF mov eax, dword ptr [ebp+FFFFFE24]
:004987BB E860C2F6FF call 00404A20
:004987C0 83F806 cmp eax, 00000006 <= Compara que el nombre sea mayor a 6 letras
:004987C3 0F8C41040000 jl 00498C0A <= Si es menor ¡error!
:004987C9 8D9520FEFFFF lea edx, dword ptr [ebp+FFFFFE20]
:004987CF 8B8618030000 mov eax, dword ptr [esi+00000318]
:004987D5 E8DA7FFAFF call 004407B4
:004987DA 8B8520FEFFFF mov eax, dword ptr [ebp+FFFFFE20]
:004987E0 E83BC2F6FF call 00404A20
:004987E5 85C0 test eax, eax
:004987E7 7E4F jle 00498838
:004987E9 8945F8 mov dword ptr [ebp-08], eax
:004987EC BB01000000 mov ebx, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00498836(C)
|
:004987F1 8D951CFEFFFF lea edx, dword ptr [ebp+FFFFFE1C]
:004987F7 8B8618030000 mov eax, dword ptr [esi+00000318]
:004987FD E8B27FFAFF call 004407B4
:00498802 8B851CFEFFFF mov eax, dword ptr [ebp+FFFFFE1C] <= Nuestro nombre
:00498808 0FB64418FF movzx eax, byte ptr [eax+ebx-01] <= Extrae el primer caracter en HEX
:0049880D 50 push eax
:0049880E 8D9518FEFFFF lea edx, dword ptr [ebp+FFFFFE18]
:00498814 8B8618030000 mov eax, dword ptr [esi+00000318]
:0049881A E8957FFAFF call 004407B4
:0049881F 8B8518FEFFFF mov eax, dword ptr [ebp+FFFFFE18] <= Nuestro nombre
:00498825 0FB64418FF movzx eax, byte ptr [eax+ebx-01] <= Extrae el primer caracter en HEX
:0049882A 5A pop edx <= Recupera el valor en HEX guardado en memoria
:0049882B 0FAFD0 imul edx, eax <= Multiplica los valores y el resultado va a EDX
:0049882E 03FA add edi, edx <= Agrega el valor a EDI
:00498830 03FB add edi, ebx <= Suma EBX a EDI (EBX tiene valor 1)
:00498832 43 inc ebx <= Incrementa EBX
:00498833 FF4DF8 dec [ebp-08] <= Decrece el valor del tamaño del nombre
:00498836 75B9 jne 004987F1 <= Si no se ha terminado la cadena va a 004987F1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004987E7(C)
|
:00498838 8D9514FEFFFF lea edx, dword ptr [ebp+FFFFFE14]
:0049883E 8B8618030000 mov eax, dword ptr [esi+00000318]
:00498844 E86B7FFAFF call 004407B4
:00498849 8B8514FEFFFF mov eax, dword ptr [ebp+FFFFFE14]
:0049884F E8CCC1F6FF call 00404A20
:00498854 8BD8 mov ebx, eax
:00498856 83FB01 cmp ebx, 00000001 <= Compara el valor de EBX
:00498859 7C48 jl 004988A3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004988A1(C)
|
:0049885B 8D9510FEFFFF lea edx, dword ptr [ebp+FFFFFE10]
:00498861 8B8618030000 mov eax, dword ptr [esi+00000318]
:00498867 E8487FFAFF call 004407B4 <= Cuenta cuántos caracteres
:0049886C 8B8510FEFFFF mov eax, dword ptr [ebp+FFFFFE10] <= Nuestro nombre
:00498872 0FB64418FF movzx eax, byte ptr [eax+ebx-01] <= Extrae letra por letra desde atrás
:00498877 50 push eax
:00498878 8D950CFEFFFF lea edx, dword ptr [ebp+FFFFFE0C]
:0049887E 8B8618030000 mov eax, dword ptr [esi+00000318]
:00498884 E82B7FFAFF call 004407B4 <= Cuenta cuántos caracteres
:00498889 8B850CFEFFFF mov eax, dword ptr [ebp+FFFFFE0C] <= Nuestro nombre
:0049888F 0FB64418FF movzx eax, byte ptr [eax+ebx-01] <= Extrae letra por letra desde atrás
:00498894 99 cdq
:00498895 F7FB idiv ebx <= Divide EAX entre EBX (EBX tiene el total del conteo de caracteres)
:00498897 5A pop edx <= Recupera el valor en HEX de la letra
:00498898 0FAFD0 imul edx, eax <= Multiplica EDX por EAX
:0049889B 0155FC add dword ptr [ebp-04], edx <= Acumula el valor
:0049889E 4B dec ebx <= Decrece EBX en 1
:0049889F 85DB test ebx, ebx <= Compara no igual a cero
:004988A1 75B8 jne 0049885B <= Si se cumple continua hasta finalizar el nombre

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00498859(C)
|
:004988A3 8D9508FEFFFF lea edx, dword ptr [ebp+FFFFFE08]
:004988A9 8B861C030000 mov eax, dword ptr [esi+0000031C]
:004988AF E8007FFAFF call 004407B4
:004988B4 8B8508FEFFFF mov eax, dword ptr [ebp+FFFFFE08] <= Nuestro código malo
:004988BA 50 push eax <= Lo guarda en EAX

* Possible StringData Ref from Code Obj ->"ec1x"
|
:004988BB 68048D4900 push 00498D04 <= Guarda el valor ec1x en 00498D04
:004988C0 8D95FCFDFFFF lea edx, dword ptr [ebp+FFFFFDFC]
:004988C6 8B8618030000 mov eax, dword ptr [esi+00000318]
:004988CC E8E37EFAFF call 004407B4
:004988D1 8B85FCFDFFFF mov eax, dword ptr [ebp+FFFFFDFC]
:004988D7 E844C1F6FF call 00404A20
:004988DC 8D9500FEFFFF lea edx, dword ptr [ebp+FFFFFE00]
:004988E2 E81D07F7FF call 00409004
:004988E7 FFB500FEFFFF push dword ptr [ebp+FFFFFE00]
:004988ED 68148D4900 push 00498D14
:004988F2 8D95F8FDFFFF lea edx, dword ptr [ebp+FFFFFDF8]
:004988F8 8BC7 mov eax, edi <= Mueve el valor de EDI a EAX, es el valor del cálculo
:004988FA E80507F7FF call 00409004 <= Transforma el valor a Decimal
:004988FF FFB5F8FDFFFF push dword ptr [ebp+FFFFFDF8]

* Possible StringData Ref from Code Obj ->"g-w"
|
:00498905 68208D4900 push 00498D20 <= Guarda el valor g-w en 00498D20
:0049890A 8D95F4FDFFFF lea edx, dword ptr [ebp+FFFFFDF4]
:00498910 8B45FC mov eax, dword ptr [ebp-04] <= El valor del segundo cálculo en HEX
:00498913 E8EC06F7FF call 00409004
:00498918 FFB5F4FDFFFF push dword ptr [ebp+FFFFFDF4]
:0049891E 8D8504FEFFFF lea eax, dword ptr [ebp+FFFFFE04]
:00498924 BA06000000 mov edx, 00000006
:00498929 E8B2C1F6FF call 00404AE0 <= Concatena todo así ec1x?-?????g-w?????
:0049892E 8B9504FEFFFF mov edx, dword ptr [ebp+FFFFFE04] <= Lo mueve a EDX
:00498934 58 pop eax
:00498935 E82AC2F6FF call 00404B64 <= Va a hacer la comparación de seriales
:0049893A 0F85B3020000 jne 00498BF3 <= Si es malo ¡Error!
:00498940 B201 mov dl, 01
:00498942 A1A0194600 mov eax, dword ptr [004619A0]

Si abre el registro de Windows y ves en Software/Code6/eCookbook encontrarás un clave de nombre Key y otra de nombre Registrant, además si ves en el directorio en donde está instalado el programa verás un nuevo archivo de nombre eCookbook.key que contiene nada más y nada menos el serial que hemos generado. Este se compara con el Key del registro y si no coinciden dá error.

Ahora vamos a ver como nos quedaría nuestro programa ya generado o nuestro código fuente en MASM, pero antes quiero decirles que parte de este programa está basado en el buen trabajo que ha hecho en sus tutoriales mi buen amigo CaoS ReptantE, Mr Crimson (¿Cómo crackear con ASM?) y JOTAKE. Ok, allí va el código... me limito a poner como siempre únicamente las rutinas de generación del serial pues el rsrc.rc y el inicio del keygen.asm están más que comentados en los tutoriales de quienes ya mencioné.

La rutina de DECIMAL ha sido gentilmente donada por CaoS ReptantE

Este es mi primer programa en ASM les ruego me perdonen si encuentran algun error o algo que se pueda mejorar


Operacion proc

       invoke lstrlen,ADDR nombre
       .if eax < 6
             mov eax,1
             ret
       .endif

       pushad
       mov edi, offset nombre
       mov esi, offset serial
       mov dword ptr[esi],78316365h
       add esi,4
       push eax

       .if eax < 10
             add eax,30h
             mov dword ptr[esi],eax
             jmp paso3
       .endif

       pop eax
       add esi,1
       mov ecx, 10
       push eax
paso1: cmp eax, ecx
       jb paso2
       xor edx, edx
       idiv ecx
       add dl, 30h
       mov byte ptr [esi], dl
       dec esi
       jmp paso1
paso2: add al, 30h
       mov byte ptr [esi], al
       add esi,1


paso3: mov ebx,1
       pop eax
       mov edx, eax
       xor ecx, ecx
       push eax

calc1: movzx eax, byte ptr [edi+edx-01]
       imul eax, eax
       add ecx, eax
       add ecx, ebx
       inc ebx
       dec edx
       jne calc1
       add esi,1
       mov dword ptr[esi],2Dh
       .if ecx < 186A0h
             add esi,5
             mov ebx,5
       .else
             add esi,6
             mov ebx,6
       .endif
       push ebx
       mov eax, ecx
       invoke Decimal
       pop ebx
       add esi,1
       mov dword ptr[esi],772D67h
       add esi,2
       pop eax
       mov ebx, eax
       mov edi, offset nombre
       push esi
       xor esi, esi

calc2: movzx eax, byte ptr [edi+ebx-01]
       mov ecx,eax
       cdq
       idiv ebx
       imul ecx, eax
       add esi, ecx
       dec ebx
       test ebx, ebx
       jne calc2
       mov ecx, esi
       pop esi
       .if ecx < 186A0h
             add esi,5
             mov ebx,5
       .else
             add esi,6
             mov ebx,6
       .endif
       mov eax, ecx
       invoke Decimal

      popad

      ret

Operacion endp

Decimal proc

       xor ebx, ebx
       mov ecx, 10
dividir:
       xor edx, edx
       idiv ecx
       add dl, 30h
       mov byte ptr [esi+ebx], dl
       dec ebx
       .if eax>9
             jmp dividir
       .endif
       add al, 30h
       mov byte ptr [esi+ebx], al
       ret

Decimal endp

end start




Ahora ya podemos usar el programa, aunque sin embargo quiero que recuerdes, lo de siempre...

"EL motivo de este tutorial es solo con el fin de conocer la seguridad en ciertos programas de manera educacional y tambien como diversión, si ha USTED, le gusta el producto por favor COMPRELO, algunas veces... los autores merecen su dinero ;o)"

Saludos a mis buenos amigos Karpoff, Pr@fesor_X, CaoS ReptantE (¡Gracias nuevamente por tus consejos y apoyo incondicional!) y a todos los crackers hispanohablantes, en especial a ti por que has llegado hasta aquí.

Si tienes alguna duda o comentario escríbeme a: ByTESCRK@iespana.es

ByTESCRK
 

 

 

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