Este tipo de protección esta basado en que para registrarlo debemos tener un
archivo conteniendo alguna clave o “algo” que el programa comparara y si es
el archivo correcto y con el contenido de registro que nos pide nos dejara
registrarnos.
Seguro que habéis probado algún programa share que para registrarlo os pide
un archivo con extensión *.reg o *.key ese es el tipo de protección que tiene
este crackme.
Se la conoce como protección keyfile.
Copia del crackme.
Análisis con Peid.
Ejecutamos crackme

Pulsamos aceptar

Buscamos la cadena en Olly, la vemos en 0040107C - vamos
al principio de la instrucción (00401075) -
pulsamos Control + R - vemos que esta referenciado desde el salto 00401037 – justo
encima del salto un Call.
La misma rutina de siempre Call – Cmp –Je
Ponemos un BP (Breakpoint) con F2 en ese Call 0040102A
Nos fijamos en el Call en el que hemos puesto el BP que es una llamada a CreateFileA
una API de Windows (cracker notes para aprender mas)

Corremos el programa con F9, aceptamos la primera ventana y para el Olly en
el Call.
Entramos en el Call con F7 (una vez).
Al pulsar F7 aparecemos en 0040108D vemos la llamada a la API.
Vamos examinando con F8

Con F8 unas pocas instrucciones después vemos una cadena en la ventana registers:
abex.l2c
Recordamos que para registrar este crackme tenemos que tener un archivo
“extra”, en los programas comerciales tendrían la extensión *.dat *.reg o
*.key generalmente
Vemos que la cadena es abex- extensión- .l2c

Como saber no sabemos mucho, la verdad, pero tenemos una gran intuición
pudiera ser que el programa nos pidiera ese archivo.
Cerramos Olly
Vamos a la carpeta del crackme y con el bloc de notas creamos un archivo
llamado abex.l2c y lo dejamos vació, no escribimos nada en el.

Abrimos Olly y cargamos el crackme, ponemos un BP en el salto 00401037 a
continuación del Call
F9, aceptamos y para Olly en el Call
F9 y para Olly en el salto
Observamos que el salto no es tomado (imagen superior), por tanto no nos
lleva al cartel que nos dice que no puede encontrar el archivo (can´t find
the file)
Hemos creado el archivo que el crackme nos pedía.

Si ejecutamos el programa ahora no aparecerá e cartel que nos decía que no
encontraba el archivo, pero aparece este otro

Que nos dice que aunque ha encontrado el archivo este no es valido, claro,
esta vació no tiene nada escrito.
Vamos a averiguar que condiciones tiene que cumplir el keyfile que hemos
creado para que el programa lo acepte.
Vemos que la String The found file is not a valid keyfile esta en la
dirección 00401067 y el principio de la rutina esta en 00401060 nos
ponemos encima y Control + R para ver las referencias y vemos que hay un
salto condicional (00401049) que nos lleva hasta aquí.
Encima de este salto en la dirección 00401041 hay un
Call que llama a la API GetFileSize y luego un CMP (EAX,12)
Ponemos un BP en el Call 00401041 y ejecutamos el programa
aceptando ventanas hasta que Olly nos pare en el Call

Pulsamos F7 para entrar en el Call

Y seguimos con F8 instrucción a instrucción mirando el apartado registers,
pero salimos del Call en la dirección 00401046 sin ver
nada dentro del Call y el resultado del salto no nos conviene para nuestros
fines pues saltaría y veríamos el cartel The found file is not a valid
keyfile

Si dentro del Call no hemos visto nada la solución debe de estar en 00401046 CMP EAX,12
Esta instrucción compara el valor de EAX con 12.
Con 12 que ¿?
Fijémonos en el nombre de la API que hay en el Call antes de la comparación:
GetFileSize significa algo así como coge el tamaño (talla) del archivo
Si tenemos claro que los archivos están compuestos por bytes lo que hace esta
API es pedir el tamaño en bytes del archivo.
Luego lo compara con 12 y si es igual el salto no se ejecuta y pasamos
directamente a una parte del código en la que vemos que se genera la
MessageBox Well done! Yep keyfile found
Tenemos que rellenar nuestro archivo abex.l2c con 12 bytes ¿?
Si miramos un poco la tabla ASCII incluida en el capitulo de introducción al
curso vemos que existen mas tipos de numeración que el decimal, el
hexadecimal por ejemplo.
Los números que vemos en el código están en base hexadecimal excepto que haya
una etiqueta ASCII o unicode que los identifique como hemos visto al buscar
seriales en la ventana registers en anteriores capítulos que siempre llevan
ASCII y el número entre comillas.
Si miramos la tabla ASCII del capitulo 0 o utilizamos un convertidor como el
crackers tool o abrimos la calculadora científica de Windows podremos hacer
la conversión de 12 hexadecimal a numero decimal

12 hexadecimal = 18 decimal
Debemos llenar nuestro archivo abex.l2c hasta que pese 18 bytes.
Ahora al estar vació “pesa” 0 bytes
Lo abrimos con el bloc de notas y escribimos el numero 1 por ejemplo cerramos
el bloc guardando los cambios
Examinamos cuanto pesa ahora el archivo: un miserable byte
Guiados por nuestra lógica vamos a probar a escribir 18 unos
(111111111111111111) a ver si así alcanzamos el peso o “damos la talla”
Cerramos el bloc guardando los cambios y examinamos el peso del archivo
Hemos conseguido el peso ideal sin necesidad de dietas ni otras coñas
marineras.
Cerramos Olly y probamos el crackme y vemos que encontramos la solución.

Otra manera de solucionarlo pero sin aprender nada nuevo
Espero que a estas alturas del curso os hayáis dado cuenta, fijaros que solo
necesito cambiar el valor de uno de los saltos y el programa aparece como
registrado.

Otra manera Las llamadas a la APIs
Creo que es el momento de entrar en este tema.
Para resolver este crackme hemos puesto dos BP en dos Call:
Primero para ver donde nos pedían el keyfile o archivo de registro en
0040102A que llamaba a la API CreateFileA y donde nos dimos cuenta que
nos hacia falta un archivo llamado abex.l2c
Segundo para ver donde se comparaba “la talla” o “peso en bytes” del archivo
keyfile en 00401041 y llamaba a la API GetFileSize y vimos que el peso
en bytes del archivo abex.l2c era 18 (12 en hexadecimal)
Vamos a utilizar las APIs para registrar el programa, pero donde podemos ver
la APIs ¿?
Con click derecho en cualquier sitio de la ventana de ensamblado Search
for – Name (label) in current module o Control + N

Aparece esta ventana que nos muestra las APIs del crackme de abex y su
dirección

Ahora que sabemos que la API CreateFileA nos sirve para ver donde se compara
si existe o no el keyfile seria sencillo al abrir un crackme de este tipo ir
directamente a Olly y decirle que se detenga cada vez que encuentre uno
Lo hacemos como se ve en la imagen: nos colocamos encima de la API que nos
interese y click derecho Set Breakpoint on every reference
La traducción real seria algo así como pon un BP en cada referencia (a esta
API)
Traducción ratonil = cuando encuentres la API ya te estas parando en ella que
quiero analizarla, Olly, majete

Vemos en el código que la primera API marcada corresponde al primer Call que
analizamos para ver si había o no keyfile y tuvimos que crear el archivo
abex.l2c

Una vez analizado este Call y resuelto el problema de la existencia del
keyfile haríamos lo mismo para encontrar la talla utilizando la llamada a la
API GetFileSize

Aquí se puede ver el resultado de marcar los BP de esta API, nos pone el BP
en el segundo Call donde miramos los bytes que debía pesar el archivo
abex.l2c

Podíamos haber cambiado el valor del JMP para registrarnos pero en este
crackme tan sencillo hubiera sido un remedio pobre, es mejor habernos creado
nuestro propio keyfile con el tamaño adecuado, no creéis ¿?
Entre los caminos que llevan a Roma a veces merece la pena coger el más largo
pues a lo mejor el paisaje nos depara alguna sorpresa agradable o encontramos
un garito con el whisky mas barato.
Interesa que vayáis quedándoos con la idea y busquéis información sobre las
APIs pues son fundamentales, ya veréis de aquí en adelante.
Podéis empezar por cracker notes y seguir por Google.
Probad a crackearlo utilizando las llamadas a las APIs y por supuesto sin el
tutorial delante.
Podéis mirar el crackme del capitulo pasado (Time trial), pues también hace
una búsqueda de ficheros y una comparación para ver si existe y cual es el
peso del archivo DATA.DET
|