Karpoff Spanish Tutor 1999-2002

Programa:

TIDES 4.6 / MAREES 4.6


 

PROTECCION:

Nombre/código. En la versión shareware, algunas opciones no son operativas y algunos puertos no están disponibles.

Descripcion: Calcula las mareas en una serie de puertos que se encuentran en una base de datos, ampliable en la versión registrada.
Dificultad: Newbie++
DOWNLOAD: http://www.navilog.com
Herramientas: W32dasm, OLLYDBG
CRACKER: Francisco   FECHA: 03/02/2002

 

 INTRODUCCION

El programa TIDES (en la versión inglesa, aunque existe una versión francesa llamada MAREES) sirve para calcular las mareas que se producen en un determinado lugar de costa. Como aficionado a la pesca en el mar, cuando vi el programa me pareció interesante, porque, como saben los aficionados, hay más posibilidades de conseguir una buena pesca cuando la marea está subiendo que cuando está bajando. Con este programa podemos saber, entre otras cosas, las horas y alturas aproximada de las pleamares y bajamares en un determinado puerto. En la versión registrada se pueden añadir nuevos puertos a partir de ficheros que pueden descargarse desde la página del autor.

El problema que me encontré es que los puertos que me interesaban (de España) no aparecían en la lista de puertos propuestos en la versión shareware, y antes de adquirir el programa deseaba comprobar si los datos proporcionados por el programa coincidían, al menos de forma aproximada, con los datos de una ‘tabla de mareas’ que poseía.

Soy novato en esto de hacer cracks (hace unas dos semanas que he comenzado a practicar, y sólo he hecho algunos ejercicios sencillos), y me ha costado bastante encontrar una ‘solución’ al problema, aunque al final he encontrado una sencilla (que considero temporal, porque, aunque me ha funcionado, no me satisface totalmente, porque hubiera preferido un generador de códigos), que es la que describo a continuación.

Para depurar el programa y registrar TIDES utilicé OllyDBG (no he utilizado SOFTICE porque aún no me encuentro cómodo con él y no deseaba volver a arrancar el ordenador).

Verifiqué que el programa no está comprimido y, aunque comprobé que está escrito en Delphi, no utilicé DEDE porque aún no conozco bien este programa.

 

 AL ATAKE

Comenzamos viendo qué debemos buscar. Para ello arrancamos el programa TIDES.EXE (MAREES.EXE en la versión francesa) y vemos que se presenta una pantalla declinando responsabilidades por el uso del programa y, una vez que se acepta, se presenta una pantalla indicando que es una versión Shareware. En lo que sigue me referiré a la versión inglesa.

Intentamos registrar el programa desde la opción Tools/Licence. Aquí aparece una ventana solicitando el nombre del usuario y un código de registro; aparece, protegido un número de usuario (que, según vi luego, cambia cuando se instala en otra máquina, por lo que, aparentemente, es calculado en función de alguna característica del ordenador). Escribimos un nombre de usuario y una clave, y al aceptar nos muestra un mensaje ‘code unvailable’ (al menos es lo que me indicó a mí todas las veces que probé).

Comencemos con WDASM. El programa es bastante grande y tarda un rato en desensamblarlo. En ‘String references’ buscamos el texto que nos ha presentado y tenemos suerte, encontramos que se referencia en:

:004D22AA 33C9 xor ecx, ecx

:004D22AC 8A08 mov cl, byte ptr [eax]

:004D22AE 41 inc ecx

:004D22AF E8C809F3FF call 00402C7C

:004D22B4 7517 jne 004D22CD

:004D22B6 6A00 push 00000000

:004D22B8 668B0D20234D00 mov cx, word ptr [004D2320]

:004D22BF B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Code non valide"

|

:004D22C1 B83C254D00 mov eax, 004D253C

:004D22C6 E8A136F8FF call 0045596C

:004D22CB EB15 jmp 004D22E2

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

|:004D22B4(C)

|

:004D22CD 6A00 push 00000000

:004D22CF 668B0D20234D00 mov cx, word ptr [004D2320]

:004D22D6 B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Code unvailable"

|

:004D22D8 B854254D00 mov eax, 004D2554

:004D22DD E88A36F8FF call 0045596C

Analizamos las líneas previas a la presentación del mensaje y vemos en :004D22C6 un call 0045596C, que, enseguida vemos que no puede corresponder al análisis de la validez del código (porque aparece también en la dirección :004D22DD, por lo que debe corresponder a la presentación del mensaje).

Seguimos un poco más arriba y vemos que en la dirección :004D22AF se hace otra llamada a una rutina, seguido por un salto condicional en :004D22B4. No vale la pena mirar mucho en la rutina llamada por :004D22AF, porque, analizando el contexto, vemos que sólo puede servir para determinar el idioma en que presentará el mensaje de error.

Seguimos mirando las líneas anteriores y no veo nada especialmente significativo hasta que llegamos a:

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

|:004D2081(C)

|

:004D20AB 8D55F4 lea edx, dword ptr [ebp-0C]

:004D20AE 8B86F0020000 mov eax, dword ptr [esi+000002F0]

:004D20B4 E8EBF2F5FF call 004313A4

:004D20B9 8B45F4 mov eax, dword ptr [ebp-0C]

:004D20BC E8D36EF3FF call 00408F94

:004D20C1 8B158CA14E00 mov edx, dword ptr [004EA18C]

:004D20C7 0302 add eax, dword ptr [edx]

:004D20C9 8945F0 mov dword ptr [ebp-10], eax

:004D20CC DB45F0 fild dword ptr [ebp-10]

:004D20CF D83514234D00 fdiv dword ptr [004D2314]

:004D20D5 83C4F4 add esp, FFFFFFF4

:004D20D8 DB3C24 fstp tbyte ptr [esp]

:004D20DB 9B wait

:004D20DC E88B09F5FF call 00422A6C

:004D20E1 8B158CA14E00 mov edx, dword ptr [004EA18C]

:004D20E7 8902 mov dword ptr [edx], eax

:004D20E9 8D55F4 lea edx, dword ptr [ebp-0C]

:004D20EC 8B86D0020000 mov eax, dword ptr [esi+000002D0]

:004D20F2 E8ADF2F5FF call 004313A4

:004D20F7 8B45F4 mov eax, dword ptr [ebp-0C]

:004D20FA E8956EF3FF call 00408F94

:004D20FF 8B158CA14E00 mov edx, dword ptr [004EA18C]

:004D2105 3B02 cmp eax, dword ptr [edx]

:004D2107 0F8542010000 jne 004D224F

:004D210D A1BC9F4E00 mov eax, dword ptr [004E9FBC]

:004D2112 BA18234D00 mov edx, 004D2318

:004D2117 33C9 xor ecx, ecx

:004D2119 8A08 mov cl, byte ptr [eax]

:004D211B 41 inc ecx

:004D211C E85B0BF3FF call 00402C7C

:004D2121 7517 jne 004D213A

:004D2123 6A00 push 00000000

:004D2125 668B0D20234D00 mov cx, word ptr [004D2320]

:004D212C B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Thanks to have register mar"

|

:004D212E B82C234D00 mov eax, 004D232C

:004D2133 E83438F8FF call 0045596C

:004D2138 EB15 jmp 004D214F

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

|:004D2121(C)

|

:004D213A 6A00 push 00000000

:004D213C 668B0D20234D00 mov cx, word ptr [004D2320]

:004D2143 B202 mov dl, 02

* Possible StringData Ref from Code Obj ->"Merci d'avoir souscrit "

|

:004D2145 B888234D00 mov eax, 004D2388

:004D214A E81D38F8FF call 0045596C

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

|:004D2138(U)

|

:004D214F B201 mov dl, 01

:004D2151 A100104600 mov eax, dword ptr [00461000]

:004D2156 E8E5EFF8FF call 00461140

:004D215B 8945FC mov dword ptr [ebp-04], eax

:004D215E 33D2 xor edx, edx

:004D2160 55 push ebp

:004D2161 68C8214D00 push 004D21C8

:004D2166 64FF32 push dword ptr fs:[edx]

:004D2169 648922 mov dword ptr fs:[edx], esp

:004D216C 33C9 xor ecx, ecx

* Possible StringData Ref from Code Obj ->"Software\Marees"

|

:004D216E BAFC234D00 mov edx, 004D23FC

:004D2173 8B45FC mov eax, dword ptr [ebp-04]

:004D2176 E8C1F0F8FF call 0046123C

:004D217B 84C0 test al, al

:004D217D 7433 je 004D21B2

:004D217F 8D45F8 lea eax, dword ptr [ebp-08]

:004D2182 8B151CA24E00 mov edx, dword ptr [004EA21C]

:004D2188 E8DF1CF3FF call 00403E6C

:004D218D 8B4DF8 mov ecx, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"utilisateur"

|

:004D2190 BA14244D00 mov edx, 004D2414

:004D2195 8B45FC mov eax, dword ptr [ebp-04]

:004D2198 E83BF2F8FF call 004613D8

:004D219D 8B0D8CA14E00 mov ecx, dword ptr [004EA18C]

:004D21A3 8B09 mov ecx, dword ptr [ecx]

* Possible StringData Ref from Code Obj ->"code"

|

:004D21A5 BA28244D00 mov edx, 004D2428

:004D21AA 8B45FC mov eax, dword ptr [ebp-04]

:004D21AD E8CAF2F8FF call 0046147C

Aquí parece que, cuando se cumplan determinadas condiciones, registra el producto y escribe en HKEY_CURRENT_USER\Software\Marees dos cadenas llamadas ‘Utilisateur’ y ‘Code’. Aunque parece absurdo, como algunos programas no realizan la comprobación una vez creada la clave, intento crear las claves ‘Utilisateur’ con mi nombre y ‘Code’ con un valor, pero al volver a arrancar el programa me encuentro aún con el mensaje de ‘Unregistered’; conclusión: como era de esperar, el programa realiza la comprobación de validez de los datos escritos; no obstante, por el tiempo que ha llevado hacer esta prueba, valía la pena intentarlo.

Vemos un CALL 00402C7C, que, aparentemente, sólo sirve para elegir el idioma de edición. Un poco antes aparece JNZ 004D224F, que al mirar en la dirección apuntada indica que ‘Sorry, the name doesn’t correspond to the code’, esto es, que el valor que hemos escrito no es válido para el nombre elegido. Sin embargo, no es éste el mensaje que hemos obtenido sino ‘Code unvailable’, que indica que el código es el que está mal. Un poco antes está CALL 00408F94, que parece que controla la validez del código escrito. Intento seguir la pista a la rutina llamada, para poder determinar el código bueno para mi nombre, pero realiza constantes saltos a otras rutinas, así que utilizo OLLYDBG, poniendo un punto de parada en 4D20FA y sigo la ejecución con F7 y F8 hasta que, después de bastante tiempo obtengo el mensaje de error, pero se han realizado tantos controles en diversas rutinas que no consigo determinar la forma exacta en que se determina el código. Veo que se hacen muchas comprobaciones en distintas rutinas (al parecer, según lo que se realiza en la dirección 00402DA3, la clave debe ser un valor numérico, sin letras u otros caracteres, salvo +, -, x o X), y diversas operaciones con los valores de una transformación del nombre de usuario (transformado en un número, sumando los bytes de cada letra del nombre, después de haberla pasado a mayúsculas), y con el número de usuario (que como he indicado al principio depende del ordenador), todo ello con constantes saltos de un sitio del programa a otro. Después de algunas horas intentando seguir la pista para intentar encontrar el algoritmo y determinar la clave que correspondía a mi nombre, descarté este procedimiento, temporalmente, e intenté otra aproximación.

Para esto, en OLLYDBG pruebo a poner cinco NOP’s en lugar del CALL  00408F94 y veo que, en lugar de presentar el mensaje de ‘Code unvailable’ aparece un mensaje de falta de correspondencia entre el nombre y el código introducido (‘Sorry, The name doesn’t correspond to the code. Please check the informations’), al activar el salto de no coincidencia de claves ‘JNZ  004D224F’. Así hemos conseguido evitar la validación del código, aunque no hemos conseguido registrar el programa. Como el mensaje aparece porque se ha activado el salto JNZ  004D224F, por falta de coincidencia entre el contenido de eax y el contenido de edx (claves ‘buena’ y ‘mala’ tras haber sido procesadas por el algoritmo sobre los datos capturados), ‘nopeo’ con seis NOP’s la instrucción. Ahora me indica que el programa está registrado y que todos las opciones quedan activadas. Verifico, con REGEDIT, el contenido del registro y veo que ha escrito unos valores en la cadena ‘utilisateur’ (el nombre de usuario que yo escribí en la pantalla) y en la cadena‘code’ (un valor generado por el sistema). A partir de este momento, cuando se arranca el programa no aparece el mensaje de ‘Shareware’, y la lista de puertos es más amplia que en la anterior, aunque muchos países continúan sin estar activados.

En este punto veo que la causa de que los países no estén activados es que no contienen puertos en la base de datos y que pueden descargarse desde la página del autor del programa. Descargo los datos de algunos de los países, que cargo en el programa mediante la opción de ‘Agregar puertos’ y se van activando los países que aparecían desactivados. Sin embargo, en la página del autor no hay, por el momento, datos que se puedan descargar para España, así que tampoco me sirvió demasiado el trabajo, porque continúo sin poder ver datos de puestos de España.

Salgo del programa y vuelvo a entrar; veo que ahora aparece como registrado el programa y que todo funciona con normalidad: al final hemos tenido un poco de suerte, porque el valor que ha escrito en la cadena ‘code’ del registro es el valor ‘bueno’ (como han coincidido los datos procesados por el algoritmo y disponemos de una clave ‘buena’ y otra ‘mala’, el programa podía haberse escrito la clave ‘mala’ y entonces me hubiera indicado que el programa continúa sin registrar).

Por último, analizo con un editor de bases de datos la base de datos entregada con el programa y observo que algunos de los registros están borrados y que unos pocos corresponden a puertos de España.Los recupero con un editor de bases de datos y reconstruyo los índices, y, aunque puedo visualizar las mareas de estos puertos, en la operación se ha perdido la información de los países. Aparentemente, al reconstruir los índices se pierde alguna información que permite distribuir los puertos por países.

La solución que he dado es temporal, porque intentaré analizar las operaciones que realiza el programa para hacer un generador de claves, que me parece una solución más elegante.

Observación. Aunque no es necesario dejar los 11 NOP’s escritos, porque el programa funciona, aparentemente, sin ningún problema, puede ocurrir que deseemos registrarlo en otra computadora o para otro usuario. Para que vuelvan a aparecer las opciones de registro, sería suficiente con entrar en el registro con el programa REGEDIT, en la clave que hemos indicado anteriormente, y cambiar cualquier cosa en las cadenas ‘Utilisateur’ o ‘Code’. La próxima vez que arranquemos el programa se indica que no está registrado, pero si se pone cualquier usuario y clave, registra el programa para el nuevo usuario.

 

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