Karpoff Spanish Tutor

Programa: Códigos Postales v 4.11


 

PROTECCION: Limitacion de Tiempo.
Descripcion: Guía de códigos postales de España
Dificultad: Principiante
DOWNLOAD: http://members.nbci.com/codpostal/ (Cd-Actual 48)
Herramientas: DeDe v2.x, Editor Hexa, KrackPE y Softice
CRACKER: KuaTo_ThoR   FECHA: 16/09/2000

 

 INTRODUCCION

Bueno, aquí estoy otra vez. En esta ocasión voy a emplear algunas herramientas poco utilizadas, y que realmente son muy útiles, como es el desensamblador para Delphi DeDe de DaFixer y el KrackPE de n u M I T_or.

Finalmente he decidido añadir cómo encontrar el número de serie correcto, para eso utilizaremos el Softice.

 

 AL ATAKE


   Preliminares. Obtener información.

Lo primero como siempre es enterarnos de qué va el tema. Iniciamos el programa, esperamos a que se carguen unas cuantas cosillas... y ya está, arranca el programa. En la ventana principal, podemos ver unos botones a la izquierda, el último, con una llave, es el de registro, y un par de ellos más arriba con un dibujo del Word, es el manual de uso. Si probamos a registrar, podemos ver cómo únicamente se nos pide el código, lo cual parece indicar que va a ser un código único para todo el mundo. Si miramos en el manual podremos encontrar al final la parte referente a las restricciones de uso, que en este caso es que 30 dias después de la instalación nuestro programa dejará de funcionar. Lo curioso es que no he visto cuánto vale el programa.

Ahora hay que ver en que lenguaje está escrito y si está comprimido. Para ello yo he utilizado el GetTyp, nos dice que está escrito en Delphi y que no está comprimido. Perfecto.

Al AtaKe

Bien, iniciamos el DeDe. En la ventana principal aparece la típica carpetita abierta de windows, pinchamos y seleccionamos el archivo 'víctima', en este caso codpostal.exe. Pulsamos sobre Process, esperamos unos segundos y ya está. Ahora debemos ir a Procedures, que creo que todos imaginamos lo que será. Nos aparece lo siguiente:

Normalmente los programadores pondrán un nombre sugerente a las Unidades o a algún Evento, con la palabra Register por algún lado, pero en este caso no, así que habrá que echárle un poco de imaginación.

Si pulsamos sobre Unit1, en la ventana de la derecha, nos aparecerán un buen montón de Eventos, así que pasaremos de ella por el momento, las comprobaciones de registro suelen estar en únidades con pocos eventos. Si pulsamos sobre Unit13 y Unit3, no aparece ningún evento, así que vamos a Unit2. Nos aparece como vemos en la imagen un único evento, ahora pulsamos con el botón secundario del ratón sobre él, y en el menú sobre Show Additional Data, nos aparece lo siguiente (haciendo esto mismo podríamos haber comprobado que las dos primeras unidades manejan la base de datos):

Como podemos ver vamos por buen camino, cuando pulsemos el botón registrar, después de haber introducido el serial, el programa viene justo aquí, no tenemos que buscar más estamos en la zona caliente. ¿Cómo ver el código? Fácil, sólo hay que pulsar dos veces sobre el evento deseado y ya está. Siguiendo el código podemos ver algo realmente interesante:

0049DB46 8D45E8 lea eax, [ebp-$18]
0049DB49 E8AEC5F6FF call 0040A0FC <- Pillamos el código güeno
0049DB4E 8B55E8 mov edx, [ebp-$18] <- ¿el código güeno?
0049DB51 58 pop eax
0049DB52 E8F164F6FF call 00404048 <- Comparamos los códigos.
0049DB57 750C jnz 0049DB65 <- Saltar o no saltar esa es la cuestión.
0049DB59 C7833402000001000000 mov dword ptr [ebx+$0234], $00000001 <- ¿Güeno?
0049DB63 EB0A jmp 0049DB6F
0049DB65 C7833402000003000000 mov dword ptr [ebx+$0234], $00000003 <- ¿Malo?
0049DB6F 33C0 xor eax, eax

Si pulsamos sobre un call, también nos aparecerá su contenido.

Todo esto con el softice estaría claro, cómo podremos ver más adelante. Lo que está claro ahora es que si invertimos el salto 0049DB57 iremos a chico güeno, podemos probarlo con un editor hexa, pero ¿cómo conseguimos el Offset? No se cómo hacerlo con el DeDe, así que voy a utilizar otra magnífica herramienta, ésta de n u M I T_or, el KrackPE, que sirve para cosas mucho más interesantes que ésta, como veremos más abajo. Ejecutamos el KrackPE, seleccionamos nuestro archivo 'víctima' , donde pone Virtual Address: introducimos 49DB57, pulsamos a Get Offset y ya está. El aspecto es el siguiente:

Donde están las XXXXXX, estaría el offset, pero os dejo que curréis un poco.

Si habéis hecho todo, y probáis a introducir un código cualquiera veréis que lo acepta, y además podéis comprobar que es permanente, incluso si intentamos meter nuevamente el código nos dice que ya nos registramos anteriormente. Interesante, esto quiere decir que al registrarse crea en el registro (o en un archivo) una clave, que al leerla le dice que está registrado. Si cuando os registráis tenéis activado algún programa 'espía' que controle las entradas en el registro, o los cambios en éste, podemos comprobar que lo que cambia es lo siguiente, pone:

[HKEY_LOCAL_MACHINE\Software\Tena\Códigos Postales]
"Version"=hex:00,00,00,00,00,00,10,40
"Producto"=hex:00,00,00,00,00,00,10,40

donde antes ponía lo que podía ser la fecha de fin de evaluación. Si las borramos volveremos a estar sin registrar, y si deshacemos los cambios realizados en el editor hexa, y metemos estos datos en el registro, estaremos registrados sin introducir ningún código. Grave error, podremos crear un "parche" con un simple archivo .reg como el siguiente:

REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Tena\Códigos Postales]
"Version"=hex:00,00,00,00,00,00,10,40
"Producto"=hex:00,00,00,00,00,00,10,40

Guardado el archivo como xxxxx.reg, sólo tenemos que 'ejecutarlo' y estaremos registrados de por vida.

Obtener el Código Válido

Lo primero es entrar con el Softice en el programa. Damos a registrar, escribimos un código cualquiera, por ejemplo1472583690, vamos a Softice (Ctrl+D), y ponemos un bpx hmemcpy. Volvemos al programa (F5), damos a registrar y salta el Softice. Borramos el break, bc0 y vamos con F12 hasta que en la línea verde aparezca Codpostal!Code, entonces estaremos en nuestro programa. Ahora, vamos con F10, pasando por unos cuantos RET hasta que llegamos a 49DB38 (cómo sabíamos esta dirección podríamos haber puesto un bpx directamente aquí), si escribimos ?eax, nos aparecerá nuestro código. Si seguimos un poco más con F10, llegamos a lo de antes, vuelvo a ponerlo:

0049DB46 8D45E8 lea eax, [ebp-$18]
0049DB49 E8AEC5F6FF call 0040A0FC
<- Pillamos el código güeno
0049DB4E 8B55E8 mov edx, [ebp-$18] <- El código güeno
0049DB51 58 pop eax <- El código malo
0049DB52 E8F164F6FF call 00404048
<- Comparamos los códigos.
0049DB57 750C jnz 0049DB65 <- Saltamos si nuestro código es Malo.
0049DB59 C7833402000001000000 mov dword ptr [ebx+$0234], $00000001 <- Güeno
0049DB63 EB0A jmp 0049DB6F
0049DB65 C7833402000003000000 mov dword ptr [ebx+$0234], $00000003
<- Malo
0049DB6F 33C0 xor eax, eax

Bueno, han desaparecido las dudas ; )

Para ver el código válido, sólo hay que poner ?edx, en 49DB51.

Algo más con KrackPE

Como os habréis podido imaginar esta herramienta sirve para bastante más que para obtener un Offset. Si os fijáis en la imagen que he puesto arriba, a la derecha, pone Get Greatest Space, ¿qué es esto? Pués localiza en el código del programa el mayor espacio vacío, de tal forma que podemos meter nuestras propias instruccciones ahí, únicamente tenemos que direccionar el programa hacia ahí. Por ejemplo:

En este programa, en el Call que compara los códigos, únicamente nos interesa, si edx sale con valor cero o no. Si vale cero, vamos a código correcto, cosa que podemos conseguir con una instrucción como xor edx,edx obteniendo el mismo resultado. Por tanto si en lugar de hacer Call 00404048, llamamos a ese espacio vacío, en el que ponemos nuestro xor edx,edx y por supuesto un ret para salir de la llamada, tendremos que siempre acepta nuestro código, sea válido o no. Ya sé que en este programa todo este trabajo es una chorrada, pero en otros será muy útil.

Si pulsamos sobre Get Greatest Space, obtenemos que nuestro espacio está localizado en 4AD014, con offset A8E14, el tamaño no nos interesa, ya que lo que vamos a meter no ocupa nada. Ya sabemos donde tiene que apuntar nuestro call y lo que queremos meter. Sólo queda saber cómo coño escribimos esto en nuestro editor hexa. Bueno, voy a poner cómo se escribe y luego una manera de obtenerlo:

Call 4AD014 ---> E8BDF40000
xor edx, edx ----> 31D2
ret --------------> C3

Los dos últimos siempre se escriben así, pero el primero es un poco más jodido. Cómo sacarlo, una forma sencilla es con el Wdasm, desensamblamos el ejecutable original, vamos al menú Debug y seleccionamos Load Process, damos a Load, ya sólo queda ir a la dirección donde queremos cambiar algo, en el caso del call a 49DB52, pulsamos a Patch Code, metemos la nueva instrucción, en este caso Call 4AD014, damos a enter, y nos aparece cómo escribirlo. Hay otras maneras de obtenerlo, pero creo que ésta es bastante sencilla.

Obtenemos el offset del Call, que es 9CF52 y ya sólo tenemos que realizar los cambios con nuestro editor hexa. Vamos a 9CF52, y metemos E8BDF40000, siempre con cuidado de que nuestra nueva instrucción no ocupe más que la instrucción original, si ocupase menos podemos meter unos nops (90). Ahora vamos a A8E14, y metemos 31D2C3, guardamos los cambios, probamos a introducir un código cualquiera en el programa, y mensaje de registrado, todo perfecto.

No siempre será tan sencillo, en muchas ocasiones habrá que reajustar otros registros, como el de la pila. Para saber que registros se modifican dentro de un call, lo podemos ver con el softice de manera sencilla. Lo primero es poder ver todos los registros en el softice, si no los tenéis en la parte superior de la pantalla, pulsad F2 y aparecerán. Los registros que se ven en azul, son los que cambian al ejecutarse cada instrucción.


Nada más por esta vez, espero que os haya resultado útil. No olvidéis que nuestro objetivo sólo es aprender.(sin contar con la diversión por supuesto ;-))

Hasta la próxima...

« »~~~=*=~~~« »

P.D.: Si hay algo que no he dejado sufientemente claro o lo que sea, ya sabéis: kuato_thor@hotmail.com

 

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