viernes, 23 de enero de 2009

Tutorial Crackme + Programar KeyGen
                                                          by Hacker_Zero


Bueno, pues finalmente me he decidido a escribir esto, ya que llevo bastante tiempo sin publicar nada. Con mis mínimas nociones de cracking, he conseguido hacer mi primer KeyGen en ASM utilizando Fasm.

El Crackme que explico aquí lo había posteado en Wargames, es el primer adjunto al post, podéis descargaroslo desde ahí.


Crackme: cyT0m!c's CrackMe #1
Lenguaje: Delphi
Dificultad: Muy fácil
Cracker: Hacker_Zero


Inicio

Lo primero que vamos a hacer será explorar el crackme, lo abrimos y tenemos que introducir un nombre y un serial para registrar el programa. Metemos unos valores al azar para ver el resultado:



Ya tenemos algo con lo que probar, "That isn't, keep on trying...".


Empezamos

Abrimos el Crackme con OllyDBG y buscamos al chico malo. Click derecho/Search for/All referenced Text strings:



Entonces click derecho otra vez/search for text, y buscamos nuestra string, "That isn't, keep on trying..." som comillas, hemos tenido suerte, la encontramos, y hacemos doble click sobre ella:



Analicemos lo que vemos aquí. Vemos nuestra string, y un poco más abajo vemos "Hey, you have done it". Un poco más arriba vemos un salto condicional JE que en caso de ser cierta la condición nos manda a dónde queremos llegar, "Hey, you have done it". Encima el CMP hay un MOV y justo encima un CALL.

El programa llama a una funcion, compara el resultado y si los dos valores son iguales "Hey, you have done it" y si son diferentes "That isn't, keep on trying...". En ese call está la clave, ponemos ahi un breakpoint (seleccionamos el call y pulsamos F2) y arrancamos el exe pulsando F9:



Se nos abrirá el Crackme, introducimos valores al azar, clickamos en Try it y el programa se parará en el breackpoint:



Entramos en el call con F7 y se nos presenta esto:



Vemos una función de 15 líneas, sin duda es el algoritmo con el que el programa genera la contraseña para nuestro nombre. Vamos a ir traceando despacio pulsando F8 y analizando lo que pasa:



Aquí vemos el primer dato interesante. EAX="eduhack", eax es lo que introducimos como nombre, vemos que lo mueve a ebx, lo compara con 0 y si es igual hace un jmp para salir de la funcion 2 líneas más abajo. Es el algoritmo para comprobar que hemos escrito algo en el campo nombre, seguimos:



Aquí vemos que entramos en un bucle, la primera instruccion que es lo que hace? MOV CL,BYTE PTR DS:[EBX], EBX es nuestro nombre, coje la primera letra de nuestro nombre, así lo vemos abajo:



Despues vemos que compara ése valor con 0, y si es igual se sale, aún no es el caso y seguimos:




Aquí vemos un MUL ECX, multiplica ecx por eax, eax vale uno, así que el resultado será 65 (el valor hexadecimal de "e") luego vemos un INC EBX y volvemos atrás. Ésto lo hace con cada caracter del nombre, ya tenemos el algoritmo por el cual el programa genera una clave a partir del nombre:

Pone EAX a 1. Coge el primer caracter del nombre de usuario y multiplica el valor hexadecimal del caracter por EAX. Despues salta y lo hace con el segundo valor, por lo tanto en el valor de EAX se van acumulando los resultados formando formando un número cada vez más grande. Cuando no hay más caracteres el programa sale del bucle y salta hasta el AND:



Ésta instrucción hace un and EAX con una constante, 0FFFFFFF.

Si seguimos traceando, llegamos al RETN y salimos de la función. Lo primero que hace es mover EAX (la contraseña) a EDI, y despues compara EDI con ESI (nuestra contraseña. Por lo tanto ya sabemos la clave para nuestro nombre, en mi caso, introduciendo eduhack como nombre de usuario, al terminar la función que genera la clave EAX vale 017D99A0, pero ojo, éste es el valor hexadecimal, hay que pasarlo a decimal:

           HEXADECIMAL               DECIMAL

EAX      017D99A0                   25008544


25008544 es nuestra clave, y si la probamos vemos que és valida y el programa se registra.

Pero no nos vale con saber una clave para un nombre verdad? Entendemos como hace el programa para generar claves a partir del nombre entonces, por que no hacer nosotros un programa que nos diga la contraseña de cualquier nombre que introduzcamos?


Programando el Keygen

[En construcción]
Saludos



 



0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

<< Inicio