elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  Tutorial Crackme1 de frankener1986 por karmany
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Tutorial Crackme1 de frankener1986 por karmany  (Leído 6,946 veces)
karmany
Moderador
***
Desconectado Desconectado

Mensajes: 1.614


Sueñas que sueñas


Ver Perfil WWW
Tutorial Crackme1 de frankener1986 por karmany
« en: 16 Septiembre 2007, 15:57 pm »

Este tutorial ha sido realizado por karmany el 15 de julio de 2006 como solución al crackme1 de frankener1986. Descarga del crackme y más información en:
http://foro.elhacker.net/index.php/topic,180720.msg860578.html#msg860578


TUTE ‘Crackme1 de frankener1986’ por karmany

Programas utilizados:
   -OllyDBG
   -Numega SmartCheck 6.03.
   -Ultraedit


INTRODUCCIÓN
Al ejecutar el Crackme1 de frankener1986, vemos la siguiente interfaz:


Es decir, se trata de activar el botón Comprobar Serial, introducir un nombre, un serial y pulsar Comprobar Serial.
Quiero hacer algo sencillo y no es mi intención extenderme mucho… Si algo no se entiende, preguntarme en el foro.

QUITAR QUE RECONOZCA AL OLLY
Cuando abrí por primera vez el crackme con el Olly, apareció un messagebox de título: Je, je y que decía buen intento..
Analizando un poco el principio del código se ve claramente que el salto se produce en:
00402E72 --> JE Crackme1.00402F4B
Si salta no reconoce al olly, entonces le quito la comparación y le pongo un salto definitivo:
00402E72 --> JMP Crackme1.00402F4B
00402E77 --> NOP
Y solucionado lo del Olly.

ACTIVAR EL BOTÓN
En VB podemos desactivar el botón de dos formas: una por defecto al diseñar nuestra interfaz, en las propiedades y la otra forma es utilizando código al ejecutar el programa.
Cuando es por defecto, se puede buscar con el Olly por ej. el nombre del botón y unas líneas más abajo uno de los bits 00 se pone a 01 y el botón aparecerá activado: enabled true. Sé que esto así no se entiende, pero hacer lo que hice yo: hice un programa con un botón activado y otro con el botón desactivado y véis el código y modificáis.

En este crackme modifiqué todos los botones que vi (que hay más de uno, no sé si para despistar) y los puse activados. Pero no resultó, así que decidí abrir el programa Numega SmartCheck 6.03. (A partir de aquí NSC).
Abres el crackme con el NSC, lo ejecutas, pulsas en el + del hola_Load y se observa esto:


XDDDDDDDD.Enabled <- False (Boolean)
AQUÍ ESTÁ.. aquí en el Load del form es donde desactiva el botón.. y se ve también que pone “Comprobar Serial” un poco antes.

A la derecha podemos ver: CRACKME1ORIGINAL.EXE!000031F9
Lo de CRACKME1ORIGINAL se lo puse yo.
Bueno lo que interesa es el 31F9. Le sumamos el 400000 y queda:
4031F9 y esta es la dirección a la que voy a ir en el Olly:


Subo un poco para ver los PUSH (pone en la pila los valores) y se ve rápidamente cómo en:
004031E7 --> PUSH 0
Lo sustituyo por PUSH 1 y arreglado lo del botón..

Ahora lo que hice es crear un nuevo crackme donde no reconociera al Olly y donde estuviera activado el botón, para hacerlo todo más cómodamente, como he explicado en los dos apartados anteriores.. Utilizando para esto último el Ultraedit.

Crackearlo es fácil, pues buscando referencias llegamos rápidamente a “Enhorabuena, lo conseguiste etc…”. Y de ahí solamente hay que mirar los cuatro saltos que hace el programa y modificarlos…

DESCIFRANDO LA ENCRIPTACIÓN
No lo he dicho antes pero con el NSC, se ven perfectamente las cadenas encriptadas…así que por este motivo decidí indagar desde el principio con el Olly…

Ejecuté el programa con el Olly, puse
nombre: abcd
serial: karmany
y pulsé en el botón “Comprobar serial” y caí aquí:
00403400
Analicé un poco el código y lo primero que encontré que me llamara la atención fue este código:


00403489 --> PUSH EAX
va a calcular el len de EAX, que es “abcd”

00403492 --> CMP EAX, 3
compara el len con 3

00403495 --> SETG CL
Activa un bit si es mayor..

004034B1 --> JE SHORT Crackme1.004034C5
Salta si el len del nombre es igual o menor que 3.

Es decir que el nombre tiene que tener más de 3 caracteres, y que la cifrado se hace en:
004034B7 --> CALL Crackme1.004038AO
voy a seguir esta CALL.

Me manda a dos subrutinas más y al final a una tercera que es donde lo hace todo:
004039E0 --> PUSH EBP
Este es el comienzo de la tercera subrutina..
Analizando el código llego a esto:


Donde se ve claramente un bucle.
SI toma el valor del len del nombre(lo hace un poco más arriba) y EAX=1. Cuando SI sea =0 saltará..
Este bucle lo que hace es poner el nombre al revés, es decir, abcd lo pone: dcba.
Lo puedes ver poniendo por ej. un BP en 00403BD9 y mira en EAX.

Después de esto hay una nueva llamada. Yo he entrado en ella y la he investigado. Esta llamada se repite también más abajo.
Después de probar también con varios nombres, llegué a la conclusión de que esta CALL lo que hace es codificar una cadena sumándole al valor hex. de un carácter un valor constante, y poner mediante otra call dentro de esta, el primero en mayúsculas, segundo minúsculas.. etc…
En el ej. que he puesto más abajo se entiende todo esto perfectamente.

Esta llamada es esta:
00403C1C --> CALL Crackme1.00403510
Puedes observar el resultado de esta primera CALL poniendo un BP en 00403C27 y mirando en EAX.
La cadena que utiliza es el nombre, al revés.
La constante es el len del nombre.
Me he fijado que aparecen dos cadenas dentro de esta CALL:
abcd
dcba
Después de descifrar todo ya me dí cuenta que la primera cadena abcd se le calcula el len y es la constante. La segunda cadena dcba es la que se utiliza para codificar.

Si el nombre es abcd el resultado que verás en EAX será: HgFe


Razonemos esto hasta aquí:
-Nombre: abcd
1º Le da la vuelta: dcba
2º Lo codifica sumándole el len a cada carácter:
d = 64 hex. + 4(len) = 68 que corresponde a --> h
c = 63 hex. + 4 = 67 --> g
b = 62 hex. + 4 = 66 --> f
a = 61 hex. + 4 = 65 --> e

3º Pone mayúsculas, minúsculas...
Resultado = HgFe

Continuemos…
Luego en 00403C39 Me despistó un montón el “abc”. No tenía ni idea de para qué podría servir…

Y después viene otra vez la CALL Crackme1.00403510
Esta vez la constante que le suma es 3, no como antes len del nombre.
Y la cadena que utiliza es el nombre.
Me he fijado también esta vez que utiliza estas dos cadenas:
abc
abcd
Aquí me extrañé al comprobar que aparecía “abc”.
(Como comento al final, y en la misma call de arriba, tras descifrar todo, supe que a la cadena abc se le calcula el len y es la constante, y la cadena abcd es la que se utiliza para codificar)

El resultado de esta segunda codificación se puede ver poniendo un BP en 00403CE5.
El resultado es DeFg.
Razonándolo igualmente:
-Nombre: abcd
1º Codifica sumándole 3.
    abcd --> defg
2º Pone mayúsculas, minúsculas.
    defg --> DeFg

Hasta aquí un resumen de lo que logré ver:
-Nombre: abcd
-Dos codificaciones: HgFe, DeFg
-Una cadena: abc

A partir de aquí, aparecen 4 saltos que nos mandan fuera del mensaje: “Enhorabuena, lo conseguiste…”
Entonces se trata únicamente de descifrar qué quieren decir esos saltos y así lograremos saber cómo codifica el serial…

Primer salto:
00403CE4 --> JNZ Crackme1.00403E59

Se ve claramente que en 00403C76 pone en pila el valor EAX, para calcularle el len.
En EAX se ve HgFe. El programa coge 4.
Después pone este 4 en memoria y seguidamente calcula el len a la cadena: DeFg. También 4.

Luego muy atentos, porque en:
00403C9A --> MOV DX, WORD PTR SS…
Lo que hace es poner en DX el valor del primer len que hemos cogido...el de HgFe que puso en memoria.
Es decir quedaría en DX el primer len y en AX el segundo len. Se entiende no?
Después en:
00403CA1 --> ADD DX,AX
Pone el DX la suma de los dos y en:
00403CAD --> ADD DX, 1
Le suma 1 a DX. El resultado de DX es por lo tanto: 9.

En este punto es donde me quedé un poco trabado.. Porque no sabía qué es lo que compara.. Sí, compara DX pero, con qué??
DX es el doble de caracteres del nombre más uno..
El problema es que no sé exactamente qué hace vbalenvar.
Aquí, frankener1986 sin quererlo me resolvió la duda, pero quise buscar la lógica.
Lo único lógico que se puede ocurrir en este momento es que el serial tenga de len=DX.
Es decir para abcd tendrá 9.. Así que volví a cambiar mi serial por: karmany12 y
Perfecto.. ya no salta.. eso era.

Segundo salto:
00403D84 JNZ Crackme1.00403E59
A primera vista se ve que utiliza la función Mid. A ver con qué…!!
Si haces un BP en la dirección 00403D1A, podrás observar que esa función Mid, lo que hace es coger los len(nombre) primeros caracteres del serial..
Ej. Nombre: abcd
      Serial:   karmany12
Cogerá : “karm”

La segunda función Mid, coge los últimos len(nombre) del serial. En este caso, lo puedes ver poniendo un BP en 0043D66. El resultado es:
“ny12”

Después en 00403D78 va a hacer una comparación de String.
Compara EAX con ECX.
Si pones un BP en 0043D78, verás que las cadenas que va a comparar son:
EAX --> “karm”
ECX --> “HgFe”
Es decir, va a comparar los cuatro primeros caracteres del serial con la primera codificación que hizo.. Eso quiere decir que mi serial karmany12 no es correcto.. Reinicio el programa pero esta vez pongo:
Nombre: abcd
Serial:    HgFeany12

Compruebo y veo que no salta!! :-). Vamos bien..

Tercer salto:
00403D96 --> JNZ Crackme1.00403E59

Muy sencillo igual.. La comparación la va a hacer entre los dos valores que ponemos en la pila: PUSH EDX y PUSH EAX.
Si ponemos un BP en 00403D92, podemos ver estos valores en la pila:
DeFg
ny12
Es decir, compara los últimos len(nombre) del serial con la segunda codificación..
Pues voy a probar de nuevo:
Nombre: abcd
Serial:    HgFeaDeFg

Pruebo y… no salta.. sigue la cosa bien, y ya solo queda un salto..

Cuarto y último salto:
Bueno, viendo el resultado del serial y viendo que el len del serial es doble más uno, lo único que se me ocurre es que este salto es para averiguar el carácter que va en medio del serial..
Repasé una y mil veces el código intentando ver  algo que me diera alguna solución, y no encontré nada… ya sólo me quedaba este último paso que es lo que puse en el foro que me quedaba…

Así que, como no sabía qué hacer hice un programa en VB y comparé un carácter utilizando la función Mid..
El programa se basa en un formulario, con un Textbox y un botón. Al pulsar el botón puse este código:

Private Sub Command1_Click()
Dim a As String
a = Text1.Text
a = Mid(a, 2, 1)
If a = "u" Then Stop
End Sub


Sencillo, muy sencillo. Escribo algo en el textbox y si el segundo carácter es una u, se detiene con un stop.
Me fui al Olly y empecé a ver dónde comparaba y dónde aparecía la “u” y por supuesto que la encontré..
Aparece cuando el programa intenta leer un valor en la memoria del programa..
Por ej. cuando pone en la pila el valor:
PUSH Proyecto1.004017D8

Para confirmarlo dumpeé la dirección 004017D8 y modifiqué la u por otra letra y el resultado fue perfecto.

Volví al crackme, e intenté ahora sí buscar dónde lee algún valor en su memoria y el único que hay es este:
00403DDF --> MOV DWORD PTR SS:[EBP-AC], Crackme1.00402930
Dumpeé esa dirección (00402930) y encontré: 2D que corresponde al carácter “-“.
Por supuesto lo modifiqué para comprobarlo y fue perfecto..


Con todo esto que acabo de explicar ahora ya es muy fácil hacer el keygen..

PD. Volviendo a leer mi tute, me dije… y qué era esa cadena que había por ahí (abc)??
Viendo la solución parece que no valiera para nada!! Como expliqué más arriba en la segunda codificación la hace sumando 3 que es el len de abc!! Me lo confirmó frankener1986.

Espero que a alguien le sirva de ayuda todo esto…ya que yo lo poco que sé lo he aprendido de leer tutoriales de otras personas..y por supuesto de poner en práctica la lógica..

Un saludo..
« Última modificación: 19 Septiembre 2007, 23:42 pm por karmany » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Tutorial]Crackeando CrackMe1 de Karcrack
Ingeniería Inversa
.:UND3R:. 2 4,480 Último mensaje 20 Agosto 2011, 04:26 am
por .:UND3R:.
[Tutorial]crackme1 por nitr0k1ller
Ingeniería Inversa
.:UND3R:. 2 4,450 Último mensaje 1 Septiembre 2011, 21:54 pm
por .:UND3R:.
Tutorial De crackme1 Del Concurso 11 De CracksLatinoS « 1 2 »
Ingeniería Inversa
Flamer 14 8,611 Último mensaje 11 Diciembre 2013, 21:54 pm
por Vaagish
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines