[Tutorial Nivel básico] Haciendo cantar a nuestro Crackme

Iniciado por fary, 4 Febrero 2016, 22:12 PM

0 Miembros y 1 Visitante están viendo este tema.

fary

En este tema intentaré explicar como hacer  de nuestro Crackme, un Keygen. Modificando su comportamiento.

Decir que, esta técnica no funciona con todos los crackme, pero normalmente con los que suele hacer un strcmp suele funcionar.

En esta práctica vamos a usar el Crackme V1 de Yo-Mismo. Lo podemos descargar de aquí (estando registrados).

http://crackmes.de/users/yo_mismo/crackme_v1/

Bien, una vez que tenemos el crackme lo abrimos con OllyDbg. Lo importante es llegar al punto caliente donde compara el seríal que genera con el que nosotros introducimos, para ello en este caso pondremos un BP en scanf. Y se nos parará aquí:



Un poco mas abajo veremos el strcmp:

00401389  |. E8 52040000    CALL <JMP.&msvcrt.strcmp>                ; \strcmp


ponemos un BreakPoint en el. Introducimos usuario y serial y se nos parará en la función, vamos a examinarlo.



En la dirección 0x00404010 esta el serial correcto y en la dirección 0x00404020 esta el seríal que nosotros hemos introducido.

Anotamos la dirección donde guarda en seríal generado para nuestro usuario, osea 0x00404010.

Ahora lo que haremos será modificar la función printf, para que cuando valla a dar el error de "chico malo" en vez de mostrar el error muestre lo que sería el seríal válido para el usuario introducido.

Un poco mas abajo veremos donde muestra el mensage de error y el mensage correcto.



Entonces todo lo que tenemos que hacer es modificar esta linea:

004013A8  |> C70424 6420400>MOV DWORD PTR SS:[ESP],crack.00402064    ; |ASCII "Sigue intentando..."


Por esta otra:

004013A8     C70424 1010400>MOV DWORD PTR SS:[ESP],crack.404010

Ahora guardemos los cambios. Clic derecho>Copy To executable>All Modifications.
Clic derecho de nuevo en la ventana que nos paarecio > Save File.

Guardamos con el nombre que queramos y listo.

El único requisito que debemos cumplir es que el usuario y el serial que introduzcamos debe tener una longitud igual o mayor a 4. Si observas el algoritmo del Crackme lo vas a poder ver ;)

Ejemplo de como funciona nuestro keygen:





Eso fue todo :) Espero que se haya entendido algo, y nada, se que esto es muy básico pero seguro que a mas de uno de los que empiezan le va a servir.

un saludo.
Un byte a la izquierda.

apuromafo CLS

cuando parchas un programa para que muestre el serial se le conoce como "self keygen" o autogenerar un keygen, por otro lado el tema que comentas que no siempre funciona parchar las dll, es porque la importación de la iat refiere que apis trabajará, entonces si cambias de sistema operativo, esto no hará funcional el programa, dado que es un programa hecho en c++, creo que hoy en día inclusive se puede re-programar todo , en las soluciones del programa presentados por otros usuarios comentan además de un pequeño bug que tenían en la lectura de los carácteres presentados, osea solo leia un cierto largo para la generación del número mágico que involucraba xor, multiplicacion, rotación , y multiplicacion, concatenación inclusive, el tema es que el trabajo de conocer un programa nunca es fácil a la primera pero como bien presentas, es facil modificar el comportamiento cuando ya sabes que hacer

felicidades, sigue así y espero vayas tomando idea de lo que te comento
Saludos Apuromafo

crack81

Si C/C++ es el padre de los lenguajes entonces ASM es dios.

fary

Hola apuromafo!

Desconocia que esto se llamaba self keygen, no estoy muy metido en tecnicismos.  :xD

Por otro lado, yo no hablo en ningún momento de parchear una DLL  :-\ ¿A qué te refieres?

saludos!!

Un byte a la izquierda.

apuromafo CLS

self= por si mismo
keygen=generar la key

es considerado parchar el ejecutable, dado que has cambiado el exe original

Respecto a la dll, me refiero que cuando programas algo que use la funcion original, no siempre los formatos son compatibles, por lo cual muchas veces deben hacerse arreglos llamando a wsprint, para lo cual terminas importando una dll externa al código, en este caso no es necesario, pero algún dia te darás cuenta que no todo programa validado se usan el mismo formato, un ejemplo los números flotantes., reales, enteros boleanos etc, cada uno debe adaptar según la situación, estos son crackmes, asi que cumple su objetivo, pero cuando generas keygen de programas te das cuenta que no todo puede ser reversible a primera vista y muchas veces deben generarse bruteforce

Saludos Apuromafo

fary

Gracias por tus consejos apuromafo   :)

Si no genera el serial valido no se puede hacer así de esta manera, pero si genera un serial para comparar, da igual el formato en que este int, float, u otro ya que se podrá mostrar como tu dices con wsprintf, que siempre se podrá cargar con GetProcAddress aunque no use User32.dll.

Lo de brute force no lo hice nunca  :laugh: ya se dará la ocasión de probar a hacerlo  :laugh:

saludos.
Un byte a la izquierda.