A petición popular me dispuse a crear otra serie de escritos dedicados al cracking, no como actividad ilegal, sino como el arte que es. ¿Porqué lo hago? la respuesta en sí es sencilla: Por que me gusta crackear. Pero hay otras razones de peso:
- Muchos de los tutoriales en español disponibles son muy antigüos, y aunque la información sigue siendo válida, a veces es difícil conseguir las herramientas de las que hacen uso, o la versión exacta del programa víctima que usaron
- Hay un interés por mejores tutoriales, mejor escritos y más accesibles a los usuarios novatos
- En su tiempo recibí muy buenos comentarios sobre mis propios tutoriales, lo que me lleva a pensar que tal vez tengo algo de talento en eso
Antes de que se quieran poner a crackear sus programas favoritos, hay que estudiar lo que hay detrás de un programa. Es muy similar a tocar la guitarra: uno quiere agarrar la guitarra y tocar Stairway to Heaven, y con la suficiente práctica sucederá, pero tenemos que empezar por unos sencillos acordes primero. Todo es parte del proceso. Aún así, en este tutorial #0 voy a ilustrar la teoría utilizando un programa real, ejecutándose bajo un debugger.
Hay algunos conceptos que tenemos que revisar antes de comenzar a crackear. Algunos parecerán obvios, otros no tanto. Lo importante es tener la cabeza despejada, abrir la mente y comprender cada uno de los detalles. Uno de los conceptos clave es saber cómo se ejecuta un programa en la computadora. Esto nos ayuda a saber cómo atacar al programa. Un programa típicamente se guarda en memoria no volatil, es decir, memoria que se mantiene aún cuando se apaga la computadora (como el disco duro, memoria flash). Cuando el programa se ejecuta, este se copia a la memoria RAM, ya que de ahí el CPU puede accesarlo de manera directa. El CPU ejecuta el programa instrucción por instrucción. Como podemos ver, aún cuando la computadora se compone de múchos subsistemas, el que nos interesa para crackear es el CPU, ahí es donde ocurre la magia.
Para crackear, necesitamos entender cómo es que el CPU ejecuta el programa, el problema es que el CPU entiende instrucciones binarias solamente. Binario es muy conveniente para una máquina ya que es muy fácil de representar por hardware los dos estados (0 y 1), pero no lo es para nosotros y por eso necesitamos lenguajes de más alto nivel. El lenguaje que le sigue al lenguaje máquina es el llamado “ensamblador”. Cada familia de procesadores tiene su propio lenguaje ensamblador. En nuestro caso, necesitamos entender lenguaje ensamblador para el x86.
Algo que sería buena señal es que en estos momentos ya tienen en sus manos un manual para ensamblador x86, o mejor aún, ya lo estudiaron de alguna manera. Como recomendación personal está el libro “The Art of Assembly“. No es específico de cracking, e introduce un concepto de ensamblador de “alto nivel” que podría confundir a algunos, pero tiene una sección que deben leer titulada “Una introducción a la familia de CPUs 80×86 de Intel“. Del lenguaje ensamblador no necesitamos todo, aunque entre más sepas del lenguaje, más se te facilita tu tarea. Lo básico son algunas instrucciones con las que se van a topar al inicio: instrucciones de salto, comparaciones, movimiento de datos, llamadas a funciones y lo referente a la pila (es decir, stack, no pila de batería). Como primer ejercicio, vamos a revisar algunas de estas instrucciones: Leer el resto de este post.