Karpoff Spanish Tutor

Titulo:

Tutorial sobre Time Lock32


 

PROGRAMA: Caligari Pioneer v1.0
PROTECCION: Time lock32.
Descripcion: Herramienta para crear y visualizar mundos en VRML.
Dificultad: Aficionado
DOWNLOAD: ftp://zdftp.zdnet.com/pub/private/sWlIB/graphics_multimedia_tools/graphics_tools/foun32.zip
Herramientas: SoftIce 3+, W32Dasm, Hex Editor
CRACKER: Txeli   FECHA: ../10/2000

 

 introduccion

en este ensayo, vamos a atacar una protección comercial llamada time lock 32. tiene fama de ser uno de los mejores métodos comerciales de protección, o al menos eso dicen sus fabricantes ;-)  ¿será esto cierto? no se porque pero me parece que no es para tanto.

es fácil saber si un programa está protegido por time lock 32, gracias a la existencia de un archivo oculto llamado tlock32.dll, generalmente en el directorio c:\windows\system.

al utilizar por primera vez un programa protegido por esta "utilidad" se crea un archivo con el mismo nombre del programa con la extensión .ini, y otro con la extensión .tdk

 

 al atake

ahora, vamos a saltarnos esta protección en el programa caligari pioneer pro v.1.1.         antes de nada, como siempre, haremos una copia del ejecutable por lo que pueda pasar :-)

ejecutamos el programa y nos encontramos una ventana con tres botones.

 (al parecer, todos los programas protegidos por esta utilidad, presentan el mismo tipo de pantalla de bienvenida)


intentemos registrarnos, para conseguir información. pulsamos en el botón "purchase" y nos aparece un cuadro para introducir nuestros datos.

yo introduje los siguientes:

unlock code: 123456789
user name: txeli
company name: k-for

damos "ok" y....

bien, "you have entered...." lo apuntamos, y abrimos el w32dasm para ver donde nos lleva .

una vez cargado el ejecutable hacemos clic sobre el botón de strings references vemos que nos muestra. ¿como? ¡aquí no nos muestra nada que nos sirva! !uhm.......! habrá que mirar en otro sitio. ¿que pasa con esa "tlock32.dll"? vamos a ver. 

desensamblamos la dll, buscamos las strings references y..... ¡bingo! aquí está, "you have entered...." doble clic sobre ello y aparecemos aquí:

* referenced by a (u)nconditional or (c)onditional jump at address:
|:1000224c(c)
|
:10002278 6800200000 push 00002000
:1000227d 68d0f90010 push 1000f9d0

* possible stringdata ref from data obj ->"you have entered an incorrect "
->"code please contact the vendor."
|
:10002282 68f0e10010 push 1000e1f0       <--- aquí aparecemos                       

* referenced by a (u)nconditional or (c)onditional jump at addresses:
|:1000223b(u), :10002276(u)
|
:10002287 6a00 push 00000000

* reference to: user32.messageboxa, ord:0188h
|
:10002289 ff159c130110 call dword ptr [1001139c]

subimos un poco, y nos encontramos un salto condicional en :

* referenced by a (u)nconditional or (c)onditional jump at address:
|:10002176(c)
|
:1000223d 8d442410 lea eax, dword ptr [esp+10]
:10002241 50 push eax
:10002242 e809f0ffff call 10001250
:10002247 83c404 add esp, 00000004
:1000224a 85c0 test eax, eax
:1000224c 742a je 10002278    <--- el salto                                        
:1000224e c70598fa001001000000 mov dword ptr [1000fa98], 00000001
:10002258 e883f9ffff call 10001be0
:1000225d 6a01 push 00000001
:1000225f e8acf1ffff call 10001410
:10002264 83c404 add esp, 00000004
:10002267 6800200000 push 00002000
:1000226c 68d0f90010 push 1000f9d0

¡bueno! pues esto va a ser mas fácil de lo que pensaba, aquí el programa comprueba si eax es igual a eax, y si es así salta a la dirección 10002278 la cual nos pone el mensaje de "you have entered...." así que la solución es fácil, cambiar ese salto, parcheándolo para que acepte cualquier nº de serie. para eso, necesitamos el offset, así que colocamos la línea verde sobre el salto que nos interesa cambiar, y en la barra de estado podemos ver el offset, en este caso 0000164c, así que que abrimos el archivo con el editor hexadecimal, vamos a la direccion 0000164c y cambiamos el salto je (74) por jne (75). guardamos los cambios, abrimos el programa, intentamos registrarnos, y al pulsar "ok"......       ¡¡¡¿que coño es esto?!!! "your trial period has been restored." ¡no era ese salto! hemos conseguido extender nuestro periodo de prueba, no está mal, pero no es lo que estábamos buscando, así que, deshacemos los cambios y comenzamos de nuevo.

llegado a este punto, reflexionemos un poco, al parecer el programa hace una primera comprobación de nuestro serial, si no es correcto, entonces comprueba si es el numero para alargar el periodo de prueba, si tampoco coincide, entonces continua con la versión shareware, y nos pone, nuestro cartelito de chico malo "you have entered...." bueno, pues tendremos que seguir buscando el salto que compara nuestro serial con el real. ¿y si probamos con el sice?, aprovechando que tengo el programa todavía cargado en el w32dasm imprimo las partes del código que nos interesan, para que me sirvan de apoyo durante el trazado con el soft-ice. 

pues ,bien, cargamos el programa con el loader, damos en "purchase", introducimos nuestros datos y antes de dar en "ok" entramos en el sice para poner nuestro breakpoint, en este caso usaré bpx messageboxa ¿que porque esta función y no otra? porque lo he visto en el w32dasm ;-)  

ctrl + d, damos a "ok" y sice salta en 

user 32!messageboxa
015f:13ff5412e   55  	    push  ebp

presionamos f11 para ver quien llama a esta función y nos aparece la ventana de "you have entered an incorrect..." damos en "aceptar" y aparecemos en 

tlock32! .text +1289

015f:1000228f 6a01                    push 01 
subimos un poco y encontramos el salto condicional desde donde hemos sido referenciados
:1000223d 8d442410                          lea eax, [esp+10]
:10002241 50                                     push eax
:10002242 e809f0ffff                       call 10001250
:10002247 83c404                             add esp, 00000004
:1000224a 85c0                                test eax, eax
:1000224c 742a                                je 10002278                         ;el salto que habíamos cambiado.
:1000224e c70598fa001001000000    mov  [1000fa98], 00000001
:10002258 e883f9ffff                      call 10001be0
:1000225d 6a01                                push 00000001

si miramos en el listado del w32dasm, vemos que venimos referenciados desde otro salto condicional desde la dirección 10002176, así que borramos todos los breakpoint con bc* y ponemos uno algunas instrucciones mas arriba del salto, para ver que se cuece por ahí, (yo lo puse en la dirección 10002166, 6 instrucciones antes del salto) volvemos a intentar registrarnos, y al pulsar "ok" sice, rompe aquí:

015f:10002160 ffd3 		             call ebx
015f:10002162 8d442424 	             lea eax, [esp+24]
015f:10002166 8d4c2410                       lea ecx,  [esp+10]      ;aparecemos aquí
015f:1000216a 50		             push eax
015f:1000216b 51                                  push ecx
015f:1000216c e8aff1ffff                   call 10001320            ;interesante llamada
015f:10002171 83c408                          add esp, 08
015f:10002174 85c0                              test eax, eax
015f:10002176 0f84c1000000                je 1000223d	           ;salta si no igual
015f:1000217c 6a01                              push 01
015f:1000217e e88df2ffff                   call 10001410
015f:10002183 83c404                          add esp, 04 

¿que tenemos aquí? parece que el programa salva nuestro nombre (push eax), después nuestro serial (push ecx), hace una llamada ¿para comprobar si es correcto el numero de serie?, comprueba si eax es igual a eax (test eax, eax) y si es así nos manda a la dirección 1000223d (je 1000223d) donde nos muestra el cartel de chico malo.

vamos ha ver si esto es así. pulsamos 2 veces f10 para posarnos encima de la call y después f8 para entrar en ella, nos encontramos esto:

015f:10001320 83ec14 		sub esp, 00000014
015f:10001323 8d442400 		lea eax, [esp]
015f:10001327 50 			push eax
015f:10001328 e843070000 		call 10001a70
015f:1000132d 8d442404 		lea eax, [esp+04]
015f:10001331 8b4c241c 		mov ecx,  [esp+1c]
015f:10001335 83c404 		add esp, 04
015f:10001338 50 			push eax
015f:10001339 51 			push ecx 

aquí vemos que hay otra llamada (call 10001a70) esta será la encargada de calcular nuestro serial, con los datos que hemos introducido, mas abajo encontraremos una llamada  a    kernel32.lstrcmpa, que es la encargada de comparar este numero con el que hemos introducido nosotros.

llegado este punto, tenemos dos caminos, hacer que el programa acepte cualquier serial parcheando el salto en la dirección 10002176 cambiándolo de je (0f84) a jne (0f85) con ayuda del editor hexa, o conseguir nuestro propio serial, el cual seguramente nos servirá para futuras versiones, yo opto por esta segunda vía. así que nos posicionamos encima de 015f:1000132d 8d442404 lea eax, [esp+04] ¿como? ¿que te has pasado de largo? no problem! quita todos los breakpoint con bc*, y pon uno en la dirección 10001328 (bpx 10001328) intenta registrarte de nuevo, y cuando sice rompa, f10 para posarte sobre la dirección mencionada antes 015f:1000132d ( si entramos en la call 10001a70 con f8, después de varios f10 también encontraremos nuestro serial).

escribe d eax, y ¡bingo! ya tienes tu serial correcto, el mío es 3e6i957o

bueno, pues esto es todo.

busca tu propio serial,  no seas vago, yo he buscado 2 veces el mío, con los mismos datos y las dos veces a sido distinto así que es posible que no te sirva en tu equipo.

esta protección es genérica, así que si tienes cualquier programa protegido por time lock32, siguiendo estos pasos podrás encontrar tu serial.

¡buena suerte!

finalizando

dedico este manual a mi gran amigo pr@fesor x gracias consuegro ;-) también quiero dedicárselo a dek_oin y a todos los miembros de mi grupo k-for por su paciencia y ayuda y por supuesto a ti que me estás leyendo.

¡¡gracias!! 

txeli txeli_enlinea@hotmail.com 

 url: club.telepolis.com/txelienlinea/index.htm

 

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