Artículo · Ingeniería Inversa

Saltando validaciones del registro .dat y .reg con Keygenear

Rafael PeruCrackersRafael PeruCrackers 9 min de lectura

Este método requiere conocimientos básicos del código ensamblador, para poder crear el archivo keyfile y el contenido del serial, para poder registrar nuestro crackmes, se recomienda leer con detalle cada paso para que logre entender un poco más del lenguaje, para ello debemos volver a reiniciar nuestro crackmes para iniciar desde cero y poder trazar y analizar el código del crackmes, recuerde las funciones de los códigos que se explicara, en los siguientes capítulos se verá mas código, realizamos clic en donde apunta la flecha amarilla, para iniciar a keygenear.

 

Keygen


Al retroceder llegamos a la dirección 00401000, donde se iniciará a tracear con la tecla Step Over “F8” o con clic al botón que apunta en la flecha amarilla.

 

 

Debemos llegar a la dirección 0040105C.

 

Dirección 0040105C

Al llegar a la dirección 0040105C, realiza un PUSH 0x0, su función es agregar el valor 0x0 a la Pila o Stack, si observamos con detalle, veremos en los comentarios que 0x0 se relaciona a hTemplateFile = NULL, y en la pila observamos ese comentario al último, relacionado con 0x0 (En este caso lo veras como 00000000), si seguimos traceando con F8, veras que pushea PUSH due-cm2.0040216F, y en la pila veras que se agrega el valor, encima de 0x0 (hTemplateFile = NULL), seguimos traceando hasta llegar a la dirección 00401073 y observaremos todo los valores en la pila, y el dato curioso es que dicha función(CALL) CreateFileA, crea o abre un archivo, podemos ver que el archivo abrir es nombrado como due-cm2.dat, que se encuentra en el valor FileName. Así que creamos este famoso archivo en la ruta donde esta mi crackmes, se aconseja respetar las Mayusculas y Minúsculas.

Luego de crearlo debemos retroceder nuevamente, debido a que nuestro Crackmes se ejecutó cuando no se había creado el archivo due-cm2.dat, para no tracear nuevamente código tras código, agregamos un BreakPoint(Pulsar F2) en 00401073, luego retrocedemos y pulsamos F9 o Play, para detenernos en 00401073 (Nuestra BreakPoint).

 

Direcciónes de memoria



Cuando nos detengamos en 00401073 por causas de nuestro BP, traceamos hasta llegar a 0040107B, vemos el código JNZ, este código salta si el flag Z=0, si Z=1 entonces no salta y nos mostrará el BAD BOY, este salto depende del código CMP que está encima de èl.

En 00401078 – CMP, realiza una comparación con EAX y -0x1, de lo cual en la ventana registro vemos el valor EAX=0000006C, si son diferentes el flag Z no se activará y tomara el valor cero (Z=0), de lo cual JNZ se activa y saltara, tener en cuneta que hay tipos de saltos en este caso nos tocó JNZ se activa cuando Z=0.

 

Dirección de memoria

 

Seguimos tracenado hasta llegar a 004010A9, de lo cual pusheo los valores y los agrego en la pila, y vemos que el CALL(Function)  ReadFile, lee el contenido del archivo due-cm2.dat, además nos vemos que el valor ByteToRead = 46 (70.), es decir que leerá 70 elementos, si no cumple dicha regla, nos llevará al BAD BOY, así que agregamos los elementos en el due-cm2.dat.

 

Dirección de memoria

 

Yo abri un editor de texto, para agregar los elementos, en este caso números, tener en cuenta que un número es un byte, también puedes editar o agregar con el block de notas de windows. No se deben  hacer problemas.Tener en cuenta que al editar el .dat, debemos regresar al inicio, si nos saldrá un error de que el archivo se encuentra usando, además se recomienda agregar un BP en 004010A9, antes de retroceder.

 

Dirección de memoria

 

Al llegar a 004010A9 traceamos con F8,  hacia 004010B0, donde ya sabemos que si Z=0, entonces JNZ salta, vemos que la segunda regla si cumple y realiza un salto.

 

Dirección de memoria

 

Ahora nos preguntaremos si no salta el JNZ que pasaría , pues pasaría a leer el siguiente código que es JMP en la dirección 004010B2, veamos dicha dirección, vemos que el comentario “Your current keyfile is invalid…”, desde aquí pinta mal usar este código JMP, por eso fue importante activar JNZ, porque evita ejecutar ese código.

 

Dirección de memoria

 

Recuerden que 004010F7, es el BAD BOY, en la mayoría de las veces cuando vean un XOR EBX, EBX, xoreando dos registros iguales, quiere decir que su valor inicial será cero, esto podría ser un indicador de una regla más para generar nuestra clave, así que sigamos analizando.

 

Dirección de memoria

 

Traceamos hasta llega a 004010C1, entre la ventana desensamblador y dump, veras que Ollydbg nos ayuda, con una ventana de comentarios nos indica que ds:[0040211A] = 31 (‘1’),  hacemos clic derecho  y seleccionamos Follow address in Dump, veremos que en DUMP nos mostrará el contenido de nuestro archivo due-cm2.dat, y el primero en analizar es 31 (Hexadecimal) = 1 (Decimal).

 

Dirección de memoria

 

004010C1   mov al,byte ptr ds:[ebx+0x40211A] : Mueve el primer Byte en este caso 0x31 al registro AL , entonces AL=31, en la ventana registro veras EAX = 00000031.

004010C7 cmp al,0x0 : Compara AL=31 con 0x0, en este caso son diferentes.

004010C9 je short due-cm2.004010D3 : Como la comparación son diferentes no realizará el salto.

004010CB cmp al,0x1 : Realiza una comparación con AL=31 y 0x1, pero son diferentes. 

004010CD jnz short due-cm2.003010D0 : Como son diferentes entonces saltará hacia la dirección 004010D0.

004010CF inc esi : No se ejecutará debido a que la comparación no son iguales, recuerden este codigo es clave.

004010D0 inc ebx : Realiza un incremento de 1 , es decir si EBX valía cero, al ejecutarlo aumentaria 1, EBX=1

004010D1 jmp short due-cm2.004010C1 : Saltará nuevamente a la dirección 004010C1, de lo cual volverá analizar el siguiente byte, es decir el número 2 en decimal o 32 hexadecimal.   

Este es un LOOP porque se repetirá 70 veces, es decir que analizará los elementos uno por uno de nuestro .dat,  cuando no logre leer el elemento 71, ya que no existe ese elemento lo asigna como cero. En la dirección 004010C7, realizara la comparación entre los valores AL=0 y 0x0, como son iguales se activará el flag Z=1, y saltara. Y de ese modo salimos del LOOP, sin embargo esto nos llevará al BAD BOY. La clave para poder llegar al GOOD BOY se encuentra en la dirección 004010CF, debe incrementar en dos para poder llegar al GOOD BOY.

 

Dirección de memoria

 

Se recomienda usar HxD Editor Hexadecimal, con esta herramienta abriremos nuestro due-cm2.dat.

 

Código ANSI

 

Al modificar nuestro keyfile llamado due-cm2.dat, por el hexadecimal 01 01, quedara así, guardamos la modificación y nuevamente retrocedemos e iniciamos de nuevo sin antes agregar un BreakPoint en la dirección 004010D3.

 

Código ANSI

 

Al retroceder nuevamente y pulsamos F9, veremos:

004010D3 cmp esi,0x2 : Compara ESI=0000002 con 0x2, por lo cual son iguales.

004010D6 jl short due-cm2.004010F7 : veremos que no salta por ser igual, que los Flag S y 0 no se activaron.  

Recuerde que para que ESI logre obtener 0x2, debió incrementarse, es decir se ejecutó la 004010CF inc esi, dos veces, para ello la dirección  con código 004010CB cmp al,0x1 , con el registro AL debió ser igual a 01, dos veces para que no se produzca el salto y así se incremente ESI.

 

Dirección de memoria

 

004010D8 : Xorea el Registro ESI, es decir ESI=0.

004010DA : Xorea el Registro EBX, es decir EBX=0.

004010DC : Movera el primer byte del contenido del archivo due-cm2.dat

004010E2 : Compara AL=31 con 0x0

004010E4 : Como no eran iguales no salta.

004010E6 : Compara AL=31 con 0x1

004010E8 : Como no eran iguales no salta.

004010EA : Suma ESI + EAX, y el resultado se aloja en ESI. En este ejemplo EAX=31 + ESI=0, entonces la suma de 31 + 0 = 31, y se aloja en ESI=31.

004010EC : Incrementa EBX más uno.

004010ED : Realiza un salto, regresando a 00401114, y vuelve analizar el segundo byte del contenido de nuestro archivo due-cm2.dat, es decir 0x32 equivale a 2 decimal. 

Sigue traceando analizando los bytes hasta llegar a la cuarto byte es decir 01, recuerda que la dirección 004010E6, cuando es igual entonces se produce un salto, saliendo del LOOP, y se dirige a :

004010EF : Compara ESI con 0x1D5, deben ser iguales. 

004010F5 : No realiza el salto, por lo tanto nos mostrara el BAD BOY, para evitar esto, debemos hallar la forma de que salte. 

La clave de este LOOP, es que la suma de ESI sea igual a 0X1D5, en este caso escribí : EF + BB +2B = 1D5, vamos analizar.

Luego lee el cuarto valor 01, y salta a 004010EF, donde compara ESI = 1D5 con 0X1D5, por lo tanto son iguales y Z=1, realizando un salto, evitando el BAD BOY.

 

Dirección de memoria

 

Finalmente modificamos el due-cm2.dat, agregamos los 3 bytes y guardamos los cambios, recuerde que debemos retroceder al inicio y agregar un BreakPoint en 004010EF, y ejecutamos nuevamente.

 

Código ANSI

 

Como observaras en la ventana de Registro veras ESI = 000001D5 y es igual a 0x1D5, entonces, saltara y evitará el BAD BOY.

 

Dirección de memoria

 

Y finalmente la última regla para terminar nuestra clave, en esta parte quiero que analicen ustedes, así que la pista que se le brinda es que inicia leyendo 0x36 y los valores deben sumar 0x1B2 y para salta y comparar, debe valer AL=00.

 

Dirección de memoria

 

Se realiza dos modificaciones en el due-cm2.dat con la herramienta HxD Editor Hexadecimal,  guardamos los cambios y reiniciamos nuevamente, sin agregar el BreakPoint, para ver si se ejecuta sin problemas.

 


 

Código ANSI
 

Observamos que se ejecutó correctamente, así que terminamos de realizar la primera etapa de Keygen, la segunda etapa es generar un Keygen en lenguaje C o python, este le dejo como tarea.

 

 

Keygen generado

 

Con este reto resuelto se terminó de explicar los dos métodos de parche y keygen, nuevamente gracias a Ricardo Narvaja, Davicomrm, Nox, Abel, Softdat, Apuromafo y Dani, por sus consejos y críticas del tutorial. Hasta la próxima. 

 

¿Quieres aprender estas técnicas en profundidad?

Continúa tu ruta con Pentesting .

Rafael PeruCrackers

Escrito por

Rafael PeruCrackers

Estudiante de la ingenieria Inversa usando las herramientas de Ollydbg y el actual IDA PRO, actualmente me encuentro investigando sobre Creacion de Exploit, con animo de ayudar a las personas que les interesa el mundo del reversing, :)