--

ESTUDIO COLECTIVO DE DESPROTECCIONES
WKT Tutorialz Site
WKT
Mr.WhiTe Ingenieria Inversa Utilizando la función HMEMCPY Mayo 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)



*------------------*
|WHISKEY KON TEKILA|
|Mr.WhiTe [WkT!99] |
|http://wkt.tsx.org|
|http://ecd.tsx.org|
*------------------*