Geek & Roll - Blog Archive » Cracking 101 – Capítulo 1.1

Cracking 101 – Capítulo 1.1

Cesar August 7th, 2008 cracking 14 comentarios

Capítulo 0

Introducción
Cracking es sobre eliminar restricciones impuestas a un programa cuando no se tiene el código fuente original. Lo anterior puede ser tan simple como una verificación que nos forza a comprar un programa después de X número de días, o tan noble como agregar funcionalidad que necesitamos a un programa del cual no tenemos su código fuente y el autor por alguna razón no está disponible para hacer los cambios. Sea cual sea el motivo, todo se reduce a encontrar esa restricción y eliminarla. Esto nos lleva al tema principal de este capítulo: tipos de restricciones y aproximaciones para eliminarlas.

Si se tiene experiencia en Windows más temprano que tarde te topas con los llamados Shareware, aunque solían ser más populares a mediados de los 90’s. Este tipo de programas te ofrecen una versión de prueba, generalmente con algunas restricciones impuestas. Si el programa te gusta, lo puedes comprar para eliminar las restricciones. Cuando el programa deja por fuera algunas características que si se incluyen en la versión final entonces es un Demo. La diferencia entre Demo y Shareware es que el primero simplemente no incluye la funcionalidad, mientras que el Shareware si incluye la funcionalidad pero es restringida de una u otra forma.

Llave Hardcoded
Presumiblemente el tipo de protección más sencillo de eliminar, causa por la cual es una burla constante hacia los autores que insisten en “proteger” sus programas con una protección de este tipo. Este tipo de protección funciona de la siguiente manera: el programa te pide que introduzcas una clave (llave, serial, key, etc) y si es introducida la clave correcta, el programa elimina todas las restricciones. ¿Cómo sabe el programa que la clave introducida es correcta? ahí está lo interesante y el punto débil de la protección: el programa incluye dentro de su código la clave correcta. Podemos visualizarlo de la siguiente manera (en alto nivel, Java):


public boolean verificarClave(String clave){
if(clave.equals(claveCorrecta))
return true;
return false;
}

Al decompilar el programa que queremos crackear (la víctima) generalmente podemos verificar las referencias a cadenas (string references) que no es otra cosa que todas las cadenas utilizadas en el programa. En el caso anterior, la variable claveCorrecta contiene la clave que elimina las restricciones del programa. Esta variable, claveCorrecta, es una cadena y como tal aparece en las referencias a cadenas. Imaginemos por unos momentos que el programador elige una “clave segura”, es decir una combinación de números y letras mayúsculas y minúsculas, símbolos y demás con una longitud de 16 caracteres, del tal manera que la probabilidad de que alguien adivine la clave se vuelve extremadamente baja. Imaginemos pues, que la clave es:

aHa-%67YUI-Mn-34

Cualquier parecido con la realidad es mera coincidencia. En este caso tenemos una clave de 16 caracteres (contando los caracteres guión ‘-’). Al momento de decompilar el programa y verificar las referencias a cadenas vemos la siguiente lista:

MiTiendita 1.0
Tiempo de espera expirado, intente reiniciar
aHa-%67YUI-Mn-34
La ruta de instalación no es válida
Hay actualizaciones disponibles

Queda suficientemente claro que al instante que vemos una cadena de ese tipo lo primero que se viene a la mente es “clave válida”. Esto puede no ser el caso (el programador introdujo varias claves no válidas para despistar) pero es seguro que llama la atención. Crackear un programa con este tipo de protección generalmente es tan sencillo como verificar las referencias a cadenas.

¿Cómo crackeamos este tipo de protección? Al iniciar el análisis de un programa que solicita una clave para desbloquearse no se sabe que es del tipo llave hardcoded. Abrimos el programa víctima y nos pide una clave que bien podría ser generada de manera dinámica. Un posible indicador de llave hardcoded podría ser que el programa solo pida una clave, no un nombre de usuario, correo, etc, pero ojo, es solo un indicador y para nada una regla. Si al verificar las referencias a cadenas encontramos alguna cadena sospechosa o con un formato particular, es posible que sea la clave y vale la pena probar. No hay mucho más que decir sobre esta protección.

Crackme Hardcoded Vamos a crackear un pequeño programa que se “protege” con llave hardcoded (HardCoded.exe). El crackme lo pueden ver en la imagen de la derecha, es muy sencillo: el programa es un textbox y un botón. Si introducen una clave incorrecta les aparece la ventana de error que se muestra en la imagen. Si introducen la clave correcta… eso vamos a averiguarlo.

Empezamos con una gran ventaja: sabemos que está protegido con llave hardcoded. Lo primero que hay que hacer (y prácticamente lo único) es decompilarlo. Pueden utilizar su decompilador de confianza pero yo recomiendo 2: OllyDBG (que es un debugger) e IDA PRO, el cual no tengo a la mano así que voy a usar Olly. También pueden usar W32Dasm si así lo desean. Abrimos el programa en OllyDBG y verificamos las referencias a cadena. Esto es muy sencillo de hacer, solo click derecho en el área de código, seleccionamos “Search for” y después “All referenced text strings”. Les aparecerá una ventana similar a la de la imagen de abajo:

Text references

Vemos algunas cadenas como “Hardcoded Serial”, “Edit”, “Ok”, “Button” y después una muy sospechosa: “AH0-498756JR-RF4″. Introducimos esa en el programa y ¿que pasa? :)

Clave Generada
La protección tipo clave generada es similar a la anterior, solo que con una gran diferencia: ahora la clave no es parte del código (y por lo tanto no tan sencilla de crackear). Existen varias maneras de generar un serial, generalmente se hace que el usuario introduzca su nombre u otra información y a partir de ahí se genera una llave única que desbloquea el programa, con infinitas variaciones a este procedimiento. El punto débil de este tipo de protecciones está en el algoritmo con el que genera la llave única. Si es un algoritmo demasiado sencillo, se puede “reversear” fácil es decir, averiguar cómo funciona por medio del código desensamblado y recrear el algorimo para generar nuestras propias llaves. La otra (menos elegante) es parchar el programa para que acepte cualquier llave.

Y hasta aquí la dejamos, por eso el 1.1 en el nombre del capítulo. En la próxima edición continuamos con otros tipos de protecciones y sus respectivos ejemplos. Pueden HardCoded.exe 100% libre de virus, bacterias o cualquier malware.

Apéndice
Otra manera de crackear el crackme presentado es parcharlo para que siempre muestre el diálogo de éxito. Veamos, lo primero que hay que hacer es saber cómo aproximarnos al punto en el que se verifica que nuestro serial es válido. Sabemos que una ventana de alerta (se llaman message box) nos indica si la clave es válida o no, entonces lo que vamos a hacer es poner un breakpoint en cualquier lugar que el programa haga referencia a la función MessageBox. De nuevo, podemos hacerlo de dos maneras: buscando todas las referencias a la función MessageBox o utilizando la información que el mismo programa nos da. Al introducir un número de serie incorrecto, la ventana nos muestra el mensaje que dice “La clave es incorrecta”. Buscamos esta cadena en la ventana de las referencias a cadenas y efectivamente podemos ver que en la dirección 0040167A se hace referencia a dicha cadena. Damos doble click sobre el renglón en la ventana de referencias a cadena y eso nos lleva a la dirección en cuestión:

Parche

Podemos ver claramente que arriba de la referencia a la cadena se encuentra la llamada a MessageBoxA. Nos posicionamos sobre esta instrucción y presionamos F2 para poner un breakpoint. Ejecutamos el programa y ponemos un serial no válido. En vez de seguir ejecutándose, el programa se detiene en la llamada a MessageBoxA por el breakpoint que pusimos. Ahora, en la pila (stack) podemos ver cómo es que primero se empuja el estilo de la ventana, después el título, después el texto y por último la ventana padre (recordando que la pila es FILO o First In Last Out, como en una pila de platos: el primero que ponemos es el último en salir). Algo interesante del órden de los datos en la pila es que, si vieron la documentación de la función MessageBox, es el mismo órden en el que aparecen en el código C de la API de Windows. No es una coincidencia, existe una relación directa entre la manera en la que C declara sus funciones y cómo lo vemos en ensamblador, lo cual es una gran ventaja para nosotros.

Veamos la pila:

Stack

Arriba del último dato empujado, hOwner, se encuentra una dirección: HardCode.0040163A. Esa dirección es donde se verifica el resultado de la comparación entre el serial válido y el introducido por el usuario y después brinca si el resultado no es cero (JNZ) lo que verifica la bandera Z. Si ese salto se ejecuta el programa brincará a 00401668 lo que ocasionará que se muestre el mensaje de error. Lo que vamos a hacer es que no brinque y continue con la ejecución del programa, de tal manera que siempre muestre el mensaje correcto. Podemos invertir el salto (convertirlo de JNZ a JZ) pero entonces si se introducie el serial válido marcará el error. Lo que vamos a hacer es simplemente eliminar ese salto con la instrucción NOP (No Operation) que no hace nada (muy útil).

Primero pondremos un breakpoint una instrucción antes de que se ejecute el salto, en la llamada a strcmp. Reiniciamos el análisis Ctrl + F12, llenamos con clave inválida, el programa rompe y posicionamos el marcador de línea sobre el salto, presionamos la barra del espacio, introducimos la instrucción NOP como se muestra en la imagen:

NOP

Asegúrense de tener seleccionada la opción de “Fill with NOP” ya que como la instrucción NOP ocupa menos bytes que la que estamos sustituyendo, en efecto tendremos 2 instrucciones NOP seguidas para abarcar el espacio original del salto. En este momento podemos eliminar el breakpoint (posicionamos sobre la linea del breakpoint y presionamos F2) y continuar con la ejecución del programa (F9) ¿Que sucede? Si quieren hacer los cambios permanentes: click derecho, copy to executable, all modifications. Seleccionen la opción de Copy All y se abrirá una ventana de dump, al cerrar esa ventana les pregunta el nombre del nuevo ejecutable y les guardará el programa parchado.

(Gracias a Pablo por el código del crackme en C++. No lo pude compilar bajo MinGW sin modificación ya que se quejaba del operador reinterpret_cast, así que le paso el apuntador original como va. Como vi que funcionaba, así lo dejé. Definitivamente la programación Win32 no es lo mio)

14 Comentarios

Geek & Roll - Blog Archive » De cómo ser un cracker

August 10th, 2008

[...] A los interesados en aprender a crackear, se ha empezado una serie de posts sobre el tema. En vez de dejar su correo y esperar a que los ayuden pueden tomar cartas en el asunto y comenzar a estudiar por su cuenta. Si aún tienen dudas pueden dejar sus preguntas en los comentarios del post respectivo. Liga al capítulo 0 y al capítulo 1.1 [...]

Rafyta

August 10th, 2008

Que machin mi compa, ya esperabamos la secuela.

Espero que mi hamster no se entuma con tantos numeritos…

Alberto

January 13th, 2009

de donde me bajo el ensamblador que usas tu en el tutorial 100% completo y gratis?

Puedes darme tu correo Cesar?
es que tengo preguntas que hacerte y prefiero hablar por correo
el mio es japrocra@gmail.com

Cesar

January 13th, 2009

@Alberto: Lo que uso en el tutorial es OllyDBG (pero no es ensamblador, es un debugger) y lo puedes encontrar en su sitio http://www.ollydbg.de/

Con respecto a lo del correo, preferiría que hicieras las preguntas aquí mismo, de esa manera enriqueces el post y ganamos todos :)

japrocra

January 15th, 2009

soy yo, Alberto
Creo que tienes razón a lo de contestar aquí ya que yo tambien tengo un sitio en el que tambien me hacen lo mismo (hablarme en pribado) y prefiero que se llene el sitio.
Ya conseguí el OllyDBG gracias.
Bueno a lo que iba:
Me gustaria que me dijeras (si no es mucho pedir) como crakear el isadora, por que en la versión gratis no me deja guardar lo que hago.
Te puedes bajar el programa desde aquí
Es para algo relacionado con la programación pero no es para hacer lo mismo que haceis con el assambler, es más bien para modificar o hacer videos desde 0 o con camara, para modificar o hacer musica de 0 o de microfono, etc…

japrocra

January 15th, 2009

siento el doble post

que ensamblador me recomendarías y de donde me lo puedo bajar gratis y entero?
que diferencias hay entre un ensamblador y un debugger como el OllyDGB?

japrocra

January 15th, 2009

siento el triple post XD
es que yo no puedo editar los post, pero si tu que puedes, juntalos.

Es para preguntarte tu opinion:
en el hardcoded este, cambié TEST EAX,EAX por MOV EBX,40 en la linea 0040163A. De esta manera le das a ok y en vez de mirar si está bien el código, te pone directamente lo de “Haz crackeado este programa”
que te parece mi simple manera de parchearlo?
Quiero crítica contructiva

japrocra

January 16th, 2009

…jo… perdón otra vez por un cuatruple post…
pero es que no respondes XD

Estuve con un crackme y: Por que me sale en el OllyDbg “acces violation when writing to [00000010} – use Shift+F7/F8/F9 to pass exception to program” debajo del todo del programa en la barra de estado? por que creo que es por eso que no me va como en el tutorial de como resolverlo. Es este el tuto y aquí te puedes bajar el crackme.

PD: respondeme tambien a lo anterior porfa. Y no me eches mucha bronca por el cudrúple post XD.

Cesar

January 18th, 2009

1.- No hago cracks “a domicilio”. Es decir, si deseas crackear un software (para el propósito que sea) hay que aprender primero cómo hacerlo. De nada serviría que yo crackeara ese programa y te diera el crack, además de ser ilegal no aprenderías cómo se hace, lo cual es el objetivo de estos tutoriales.

2.- Te estas confundiendo. Un ensamblador es un programa que toma código ensamblador y lo convierte en un binario que la computadora entiende. Te recomiendo leer mi primer tutorial para que entiendas este tipo de cosas. http://www.geekandroll.com/2008/05/cracking-101-capitulo-0/

Un debugger por el contrario es un software con el que puedes debuggear o depurar una aplicación, ejecutarla paso a paso y ver el estado del procesador, los registros, la pila, etc, para encontrar errores y corregirlos.

3.- Ese es el tipo de comentarios que busco. Excelente que te hayas propuesto a solucionar este sencillo crackme. Generalmente la solución que modifique menos código se considera superior y en este caso encontrar el serial correcto no modifica nada. Si lees el apéndice te podrás dar cuenta cómo modificar el crackme para cambiar solamente un salto por NOPs y lograr el mismo resultado que tu obtienes. Aun asi, si tu manera funciona, felicidades! (no lo puedo comprobar en este momento).

4.- No tengo idea. En este momento no cuento con una PC con Windows y es por eso que no he continuado escribiendo los tutoriales :(

Sigue echándole ganas!

japrocra

January 20th, 2009

Siento lo del crack ese que te pedia, razón no te falta para no querer hacerlo.
Me gustaria que siguieras con los tutos pronto, me encanta tu manera de pensar y escribir y lo daré todo y más (mucho más XD) por el tema este del cracking, pero no solo para evitar las restrigciones que tienen los programas, si no más bien por el hecho de investigar, mejorar, ayudar a gente y… hacer arte!!!estoy muy de acuerdo en lo de considerarlo un arte.

Tengo una facilidad innata para la informática.
Con solo 4 años (y no miento) enseñava a mi padre a programar la radio digital del coche (cuando era novadad lo de la radio digital) y apenas sabiendo un poco de leer, programé los canales de la tele de la casa del pueblo (para tener 4 años no era normal).
Cuando iba en primaria, en mates, me ponian a hacer ejercicios de 2 cursos más, por que si no me aburria y le hacia los ejercicios a los demás lol (siempre me gustaron las mates y todo lo relacionado con ellas y la lógica).
Cuando estudiabamos los numeros binarios, yo no necesitava calculadora ni hacer la cuenta para pasar de binarios a decimal.
Y aprendo muy rápido, en 2 dias casi 3, de que en el cole me mandaran hacer un blog y después de mucho fuchicar en el HTML lo acabé dominando muy bien.
Creo que en esto de la informática no soy malo y reconozco que de programación solo conozco el html, ni si quiera en javascript (bueno, lo entiendo pero no lo hablo XD), y lo de que yo sea superdotado… ayuda ^^.

Espero con paciencia, que tengo mucha (27 Kb reales de internet y una cagada de vaca que uso como ordenador, ¡imagínate! XD) esa continuación de los tutos y esa ayuda con el crackme, haber cuando consigues un windows.
Haber si me apaño con crackmees que encuentre por ahí, a pesar que no se que le pasa a mi OllyDGB.

Bye boss.

japrocra

January 25th, 2009

Solo era para decir que no me pasaré mucho por aquí que estas semanas tendré muchos exámenes y trabajos que hacer (por cierto, estoy en 1º de Bach), y no podré pasarme mucho por aquí.
Si hay alguna manera de suscrivirme a tus tutos para recivirlos por correo a japrocra@gmail.com te agradecería que me lo hicieras o que me digas como hacerlo. Pero solo para los tutos y sus comentarios (no pasa nada si no se puede lo de los comentarios).
Para cualquier cosa puedes contactar conmigo por este correo si no te contesto en los comentarios (no creo que lo hagas ya que yo no soy nadie para ti, pero por si las moscas… ^^ )
Te animo a que sigas con tus tutos, no los dejes de hacer ¬¬

Un saludo,
Yo. XD

Cesar

January 25th, 2009

@japrocra puedes suscribirte al feed RSS de este blog. Te van a llegar todos los posts que ponemos y la gran mayoria NO son de cracking, pero puedes filtrar por categoria. La categoria cracking siempre va a ser relevante para ti.

japrocra

January 30th, 2009

OK,
sabia lo que era lo del RSS pero casi nada y casualmente ayer me puse a investigar precisamente todo lo relacionado con eso para mi blog y ahora ya entiendo de RSS. XD
Perdon por mi ignorancia ^^”

Geek & Roll - Blog Archive » Usando BackTrack 4

August 24th, 2009

[...] de los usos que se le puede dar a BackTrack es el de análisis de binarios de Windows con OllyDbg. Ya antes hablamos de este excelente debugger que funciona muy bien bajo Wine. En esta ocasión voy a reversear el mismo crackme super sencillo [...]

Haz un comentario:

Es necesario que dejes tu nombre y correo electrónico (no se publicarán).

Si dejas un comentario anónimo, con insultos o ajeno al tema, iremos hasta tu casa y le diremos a tu mamá la cantidad de porno que hay en tu computadora. Si, lo sabemos.