Cómo crackear mi primer programa legalmente (parte I)
Depurando un sencillo crackme en Windows.
Aunque 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:
- El depurador OllyDBG, sin ningún plugin.
- Resource Hacker v3.6.0.92 en español
¿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.
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.
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...
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.
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