Cómo crackear mi primer programa legalmente (parte I)

Tamaño de letra:

Depurando un sencillo crackme en Windows.

Icono OllyDBGAunque la palabra crackear está asociada, normalmente, a saltar las limitaciones de un software, realmente es un término que veo muy utilizado (bien o mal) y últimamente no solo en este ámbito del software (crackear redes WIFI, crackear contraseñas, crackear smartcard). Creo que si hubiera puesto un título como "Ingeniería inversa en un programa" o "Depurando mi primer programa" muchos lectores no hubiesen entendido de qué estamos hablando. Hace un tiempo, dimos en esta web un ligero paseo por el cracking y no siempre "crackear" es hacer algo ilegal, por ejemplo, el programa de hoy está hecho para que tú aprendas, lo depures y lo crackees. De hecho, muchas empresas de seguridad trabajan depurando virus potenciales. Algo que me llama la atención si observas el enlace anterior y no hace muchos años, es que se publicaban en revistas códigos para desbloquear juegos.

Centrándome en el Sistema Operativo Windows, aprender qué hace un determinado programa y cómo lo hace, nos puede ayudar a comprender muchísimas cosas de este entorno Windows y tal vez a ser mejores programadores:

  • ¿Qué tipos de ejecutables existen? ¿Todos se depuran de la misma forma?
  • ¿Por qué los ejecutables tienen un encabezado? ¿Qué información hay en ese encabezado (header en inglés)?
  • ¿Cómo se analiza un virus y qué modifica?
  • ¿Cómo se modifica un programa?
  • ¿Cómo puedo depurar mi programa para buscar errores?
  • Una vez que he aprendido a depurar, ¿cómo puedo mejorar la protección de mi software?

De momento son muchas preguntas. Desde mi punto de vista y experiencia, la ingeniería inversa y debido a la versatilidad de todo lo que conlleva la programación de software, es un "arte" complejo, considerado por muchos como avanzado, que requiere muchísimas horas de práctica y estudio y que puede "engancharte" y crearte una pequeña adicción diaria (todo sea por aprender).

Antes de continuar y como siempre digo, respeta las leyes y las licencias de los programas. No depures programas cuya licencia no lo permita. Si quieres depurar legalmente, busca CrackMEs en Internet

Hoy, te voy a enseñar a "crackear" un pequeño programa (CrackME) que he programado directamente en ensamblador para Windows y está específicamente diseñado para que lo depures y lo analices. Hoy aprenderás a entender algunas API de Windows, a saber cómo se crea una ventana y a conocer los mensajes de Windows de esa ventana. Analizaremos un poco los recursos y  finalmente verás cómo conocer la contraseña correcta. Si recién empiezas depurando tus aplicaciones, seguro que lo de hoy te gustará (o eso espero).

Descarga del CrackME. Preparativos.

Este programa lo hice con MASM32 en ensamblador y es de nivel 0 patatero para principiantes. Está programado en código nativo a 32 bits.

Un CrackME es un programa (es un reto) diseñado para que lo intentes crackear.

Lo puedes descargar desde aquí:

Dirígete a la carpeta asm02, el CrackME se llama asm02.exe.

¿Qué necesitaremos?

Antes de comenzar ten preparados estos 2 programas:

¿Estás preparado? ¡Vamos a ello!

Analizando con OllyDBG

Ejecuta asm02.exe para que veas su funcionamiento. Simplemente escribe una contraseña en el cuadro de texto 1, y pulsa el botón Probar 2, no hará nada hasta que escribas el password correcto. La X 3 es para cerrar el programa y el ? 3 es para abrir una ventana con información básica.

CrackME 0.2

Abre asm02.exe con OllyDBG. Observa las primeras líneas del código:

 
00401000  >>  push 0
00401002   |.  call 004011CC                      ; <jmp.&kernel32.GetModuleHandleA>
00401007   |.  mov dword ptr ds:[403000],eax
0040100C   |.  call 0040120E                      ; <jmp.&comctl32.InitCommonControls>
00401011   |.  push 0
00401013   |.  push 40102E
00401018   |.  push 0
0040101A   |.  push 65
0040101C   |.  push dword ptr ds:[403000]
00401022   |.  call 004011D8                      ; <jmp.&user32.DialogBoxParamA>
00401027   |.  push 0
00401029   \.  call 004011C6                      ; <jmp.&kernel32.ExitProcess>
 

Nos encontramos en la primera instrucción en 401000 >>. ¿En qué deberíamos fijarnos? Si eres programador de C++ seguramente tengas claro que hay varias formas de iniciar una aplicación para Windows. En este caso, nos encontramos en el hilo principal del programa. Comienza en 00401000 y termina en 0040129 con un ExitProcess.

En el código podemos ver que existen a la vista 4 llamadas a las API de Windows (funciones que se encuentran en las librerías de Windows). Si buscas información de cada una de ellas, verás que la que nos interesa es DialogBoxParamA. DialogBoxParamA crea un cuadro de diálogo modal. A esta función hay que pasarle 5 datos:

DialogBoxParamA, dato1, dato2, dato3, dato4, dato5
DialogBoxParamA, hInst, pTemplate, hOwner, DlgProc, lParam

Aunque todos ellos son importantes, nos vamos a centrar solamente en los datos 2 y 4. Si tienes un poquito de experiencia verás que los datos de dicha función se van empujando directamente en la pila: observa desde 00401011 hasta 0040101C. Para saber exactamente los datos de la función, pulsaremos repetidamente (con asm02.exe cargado en OllyDBG) la tecla F8 y nos detendremos en 00401022.

 
00401000  /.  push 0
00401002   |.  call 004011CC                      ; <jmp.&kernel32.GetModuleHandleA>
00401007   |.  mov dword ptr ds:[403000],eax
0040100C   |.  call 0040120E                      ; <jmp.&comctl32.InitCommonControls>
00401011   |.  push 0
00401013   |.  push 40102E
00401018   |.  push 0
0040101A   |.  push 65
0040101C   |.  push dword ptr ds:[403000]
00401022   >>  call 004011D8                      ; <jmp.&user32.DialogBoxParamA>
00401027   |.  push 0
00401029   \.  call 004011C6                      ; <jmp.&kernel32.ExitProcess>
 

Observa ahora la pila en OllyDBG, verás algo similar a esto:

0012FF78   00400000  |hInst = 00400000
0012FF7C   00000065  |pTemplate = 65
0012FF80   00000000  |hOwner = NULL
0012FF84   0040102E  |DlgProc = asm02.0040102E
0012FF88   00000000  \lParam = NULL

Dato2 de DialogBoxParamA: pTemplate

Este dato suele ser el recurso del cuadro de diálogo. Como puedes ver, corresponde a 65hexadecimal. 65h = 101decimal. Abre ahora asm02.exe desde el editor de recursos Resource Hacker, busca 101 y verás qué recurso va a ser mostrado.

Resource Hacker

Puedes ver que es un cuadro de diálogo, la ventana que vemos al ejecutar el programa.

Dato4 de DialogBoxParamA: DlgProc

Este dato es muy importante. Observa que corresponde a 0040102E. ¿Qué significa esto? Es un puntero a los procedimientos de la ventana que va a ser creada. Los mensajes de dicho diálogo van a ser procesados en esta dirección: 0040102E. Por ejemplo; cuando se inicia la ventana, cuando se dibuja, cuando se pulsa un botón, cuando se cierra etc. En resumen, el código que nos interesa analizar está a partir de 0040102E.

Vamos, por lo tanto, a listar el principio de ese código:

 
0040102E   /.  push ebp
0040102F   |.  mov ebp,esp
00401031   |.  mov eax,dword ptr ss:[ebp+C]
00401034   |.  cmp eax,110
00401039   |.  jnz short 004010BA
...
 

¿Qué significa ese código? El procedimiento DlgProc tiene una serie de parámetros que no vamos a ver en este artículo, simplemente quiero que observes esto:

00401031   |.  mov eax,dword ptr ss:[ebp+C]

Pone en el registro eax un valor hexadecimal que corresponde a un mensaje de Windows. Esto es importantísimo y te aclarará muchísimas dudas. Tú puedes pararte con OllyDBG en 00401034 y observar los valores que el registro eax va tomando.

Si observas el código anterior, en 00401034 se comprueba si el mensaje de Windows es 110 hexadecimal. ¿Y qué mensaje es 110? Bueno, para solucionar este pequeño inconveniente, creé en esta web una tabla que puedes ordenar, con muchos mensajes de Windows y sus valores hexadecimales y decimales. Ahora comprobarás la importancia de esta tabla a la que puedes acceder desde el siguiente enlace. Esa tabla, ordénala por decimal y busca el valor 110hexadecimal o 272decimal. ¿A qué mensaje de Windows corresponde?

110 corresponde al mensaje: WM_INITDIALOG. Su nombre lo indica casi todo, es decir, en 00401034 se está comprobando si el cuadro de diálogo se está iniciando, antes incluso de ser mostrado.

Todas estas explicaciones se pueden alargar muchísimo. Seguiremos en el siguiente artículo aprendiendo interesantes secretos...

Última actualización: Martes, 02 Diciembre 2014
Comentarios  
+1 # Javier Flores 09-07-2022 18:51
Gracias por la información había estado buscando esto, me esta facilitando bastante aprender lenguaje ensamblador al relacionarlo con las Api's de Windows
0 # gayarispo 10-05-2020 09:05
Gracias por lo que haces. Para los que estamos empezando es útil cualquier información y si es buena como es tu caso mejor. Otra cosa es que quizás algunos en el cerebro en vez de neuronas, tenga el solar y claro, así no son capaces de entender que lo que has enseñado es importantísimo.
Quizás deberías crear una sección para descontentos y desagradecidos tipo papelera de reciclaje de windows para algunos comentaristas como los que tienes más arriba.
Insisto, gracias y si puedes, te agradecería más tutoriales como este, aclarando y explicando desde la base y no como otros que se limitan a colgar un video de lo bien que se han saltado la protección de cualquier programa sin explicar como y porqué han modificado lo que quiera que hayan modificado.
Permíteme que te deje un dicho que tenemos por estos lares..."Ser agradecido es de bien nacido".
Saludos desde Las Palmas de Gran Canaria.
-4 # Enrique Salazar 31-03-2017 17:05
menuda basura todos dicen enseñar y no terminar con dar al punto que interesa lo que hacen es decir miles de mierdas al final terminas mas confundido de lo que estabas antes -1000 para ti tu inútil trabajo me dio sueño :zzz si quieren perder el tiempo lean esas pendejadas que no te ayudan hacer nada
+2 # karmany 02-04-2017 09:46
Hola Enrique,
Yo creo que son tres artículos interesantes para entender la programación básica a partir del procedimiento DlgProc, además de conocer los mensajes capturados. Ciertamente es un crackme muy sencillo y básico para iniciarse. Yo entiendo que no se puede ajustar seguramente al programa que tú estás analizando, porque cada app es un mundo.
Un saludo
-1 # Pedro Ramirez 19-05-2016 18:41
Para hacer algo asì y no terminarlo hubiera sido mejor no hacer nada. Valiente "Tutorial"
+1 # Editor 20-05-2016 06:16
Sí que está terminado el tutorial. Son tres tutoriales seguidos.

No tiene privilegios para responder a los comentarios.


 
Visitas: 8567593