| ESTUDIO COLECTIVO DE DESPROTECCIONES Última Actualizacion: 25/10/2001 |
Título | Ingenieria Inversa Utilizando la función HMEMCPY
Tipo de Tutorial | [X]Original, []Adaptación, []Aplicación, []Traducción
Cracker | Mr.WhiTe
Grupo | Whiskey Kon Tekila
Fecha | 15 de Mayo de 1999
1- ¿Que es HMEMCPY?
HMEMCPY es una API de Windows, que utiliza la memoria RAM para leer, manipular, comparar y almacenar cadenas (texto que introducimos cuando un programa nos pide el numero de serie por ejemplo). La funcion recoge la informacion que le proporcionamos y la carga en memoria. Despues manipula esas cadenas, las mueve y las compara (por ejemplo compara tu numero de serie con el correcto), y despues decide si la cadena es o no la correcta. La funcion HMEMCPY devuelve esta informacion al programa en cuestion, y si has puesto el serial correcto te lo aceptara o de lo contrario te mostrara una bonita ventana de error.
2- ¿Para que nos sirve a los Crackers HMEMCPY?
HMEMCPY se puede utilizar para "cazar" numeros de serie validos en programas shareware. Utilizando un debugger (depurador) como el SoftIce, podemos poner un breakpoint en HMEMCPY para que el programa se pare y nos avise cuando llama a la funcion. Muchos programas shareware utilizan HMEMCPY para comparar numeros de serie, sobre todo cuando han sido escritos en Delphi o en Visual Basic.
3- ¿Como preparar el SoftIce para pararnos en HMEMCPY?
Cargamos nuestra "victima" y vamos a la ventana de registro, donde normalmente se nos pedira un nombre y un numero de serie. Suele haber un boton que se debe pulsar para validar los datos una vez introducidos. Pues bien, si existe el boton procedemos de la siguiente forma: Rellenamos los datos, nombre y serial cualquiera. Vamos al SoftIce y ponemos un breakpoint en HMEMCPY, para lo cual escribimos " BPX HMEMCPY ". Lo que estamos haciendo es indicarle al SoftIce que se pare y nos avise cuando nuestra "victima" llame a HMEMCPY. Una vez puesto el breakpoint, pulsamos Ctrl+d para volver al programa. Pulsamos el boton de registro y volveremos al SoftIce. Bien, ahora si suponemos que los datos que nos pedian solo eran dos, el nombre y el numero de serie..... necesitamos pulsar una vez Ctrl+D (o F11, es lo mismo) puesto que si no lo hacemos estaremos siguiendole la pista al nombre y no es lo que nos interesa. :o) Si no existe el boton de registro: Ponemos el BPX antes de introducir el ULTIMO caracter de nuestro serial falso. Ahora si que estamos en el camino correcto (bueno, casi). Si te fijas, en el SoftIce veras una linea encima de la ventana de comandos que pone el nombre del programa en el que estas. En nuestro caso lo usual sera que veas algo como: "USER(0A)" o "(USER(01)" pues esta parte no nos interesa para nada, tenemos que llegar al codigo de nuestra "victima". Para lo cual pulsamos F12 unas cuantas veces hasta que veamos el nombre de nuestro programa en cuestion, lo cual nos indicara que estamos dentro. Si por ejemplo el programa se llama "victima" veremos algo como "VICTIMA!CODE".
4- ¿Que podemos buscar?
Una vez que estamos dentro del codigo de nuestra "victima", tenemos que buscar una comparacion (CMP, TEST) y/o un salto condicional (JE, JNE, JZ, JNZ...etc). Si encuentras una comparacion y despues un salto, lo mas probable es que sea una zona muy muy interesante. Un ejemplo:
    CALL     xxxxxxxx

    MOV      EAX,[EBP-14]     ;EAX contiene el serial que introducimos

    MOV      EDX,[00463A56]   ;EDX contiene el serial CORRECTO

    CALL     xxxxxxxx         ;Llamada a una rutina para compararlos

    JNZ      0047FCA4         ;Si es correcto salta a REGISTRADO (si no es cero)

    MOV      EAX,00466F34     ;Si es cero no estamos registrados

    CALL     xxxxxxxxx

    JMP      0047FCCC

    MOV      EAX,004738D4

    MOV      EDX,00466F7C

    CALL     xxxxxxxx
Esta rutina es bastante tipica, aunque obviamente hay muchas variantes. :o) Para "cazar" nuestro serial en este ejemplo, necesitamos situarnos sobre la linea "MOV EDX,[00463A56]" , ahora vamos a ver que diablos contiene el registro EDX para lo cual escribimos en el SoftIce "D EDX". NUESTRO SERIAL CORRECTO !!! Otra rutina bastante comun seria algo similar a esto:
    PUSH     EAX

    CALL     xxxxxxxx  ;Llamada a una funcion que calcula nuestro serial Correcto

    ADD      ESP,04    ;y lo almacena en memoria

    TEST     EAX,EAX   ;Compara nuestro serial con el Correcto

    JNZ      00440994  ;Si no es cero salta a REGISTRADO

    PUSH     0047B52B  ;Nuestro serial Correcto

    PUSH     64

    PUSH     EBX

    CALL     xxxxxxxx
Los registros y las posiciones de memoria que tu te vas a encontrar seran diferentes , pero la rutina sera bastante parecida. Para ver nuestro numero de serie valido nos situamos en la linea del PUSH 0047B52B y escribimos en el SoftIce "d 0047B52B" Para terminar nada mejor que practicar con la obra maestra de algun programador desinformado. (Se nota que pocos programadores leen nuestros tutoriales jejeje, en fin, peor para ellos, el que no aprende es porque no quiere). Como obtener un Serial Valido para Talisman v1.1
    *±±========-*-*-*-* P E R S O N A L   G R E E T Z *-*-*-*-========±±*

        Dasavant, Niabi, r00ster, ZEncrakz, Azrael, Klimpong, Zor

        Conde-Vampiro, Mac-Crack, Killer_P, ASTAGA, Harvestr, Iczelion

        JosephCo, Carpathia, Taylor, Tapu, Ivanopulo, EgoistE, Torn@do,

        JUANDA, Leoworld, ReKiem, Neural_N, Netking, Russ97,

    	    Mr.Pink and of course all WKT Members ;o)
[ Entrada | Documentos Genéricos | WkT! Web Site ]
[ Todo el ECD | x Tipo de Protección | x Fecha de Publicación | x Orden Alfabético ]
(c) Whiskey Kon Tekila [WkT!] - The Original Spanish Reversers. Si necesitas contactar con nosotros , lee esto antes e infórmate de cómo puedes ayudarnos