Me he dado cuenta de que llevo en este foro desde 2019 y nunca he aportado nada, así que voy a aprovechar que desde hace unos años estoy bicheando con cosas de hacking/cracking para compartir lo que voy aprendiendo y tener un proceso documentado :)
Para entender este tutorial voy a explicar absolutamente todo lo que pueda, para que cualquier persona sin conocimientos básicos que lea este post pueda entender el máximo de conceptos posibles. Lo importante para mí no es aprender el "algoritmo", sino entender los fundamentos básicos y utilizarlos como herramienta para hacer todo este tipo de locuras.
Nos situamos en la piel del hacker: tenemos un programa (.exe) que nos pide cierto login, serial key, o cualquier mierda para autenticarnos. En este caso, me he tomado la molestia de hacer un pequeño programa en C++ con un login sencillo para poder crackearlo.
Como veis, he intentado simular un gestor de passwords rudimentario. Al ejecutar el .exe, nos encontramos con esto:
Ten en cuenta que a la hora de crackear un .exe, no vas a tener acceso a este código, pero sí puedes acceder a su código en ensamblador. Simplemente he creado yo mismo el programa para poder mostrar su código y enseñar que esto del cracking no es ningún truco de magia ni nada por el estilo.
Si queréis aprender ensamblador, podéis hacerlo por vuestra cuenta en páginas como esta (en verdad he escogido una al azar, pero hay miles de vídeos y páginas web donde podéis aprender). Al aprender ensamblador, estaría bien que aprendierais como funciona un procesador por dentro, pero eso ya lo dejo a gusto de cada uno según las ganas que tengáis de maquinar.
Como esto del ensamblador da para otro post como mínimo, de momento lo dejo aquí y sigo con el tutorial.
¿Qué es lo que vamos a hacer en este programa? Como vamos a tener acceso a su código ensamblador, podemos modificar las partes que queramos para que el programa haga lo que nosotros queramos. En este caso, vamos a buscar la parte del login en el programa y modificaremos la parte donde evalúe la condición para superar el login.
Para ello, abrimos el .exe en el debugger:
Nos aparecerá una ventana del debugger con el código ensamblador, y otra ventana que, en este caso, es un cmd donde se ejecuta el programa. Podemos encontrar la parte del login de dos maneras:
1. Ejecutando el programa paso a paso (opción Step over) hasta que hayamos introducido el usuario y la contraseña. Una vez introducidos estos, el código pasará a ejecutar la evaluación de la condición para poder pasar el login.
2. En este programa tan sencillo, basta con buscar referencias a strings y encontrar la parte del código donde esté "Login SUCCESFUL".
En este post, os enseñaré a hacerlo de la segunda manera. Para buscar referencias a strings, hacemos click derecho en el código, opción Buscar en, Todos los módulos, Referencias a cadena:
Se nos abrirá una ventana en el programa con todas las referencias a cadena de éste. Lo normal es que nos encontremos una barbaridad, pero podemos filtrar la búsqueda. En este caso no es necesario porque a simple vista se puede encontrar fácil.
Ahí está lo que buscamos. Hacemos click derecho y le damos a la opción Mostrar en el desensamblador. Nos llevará a la parte del código donde se encuentra esta cadena.
Vamos a comentar un poco este código. Vemos que hay un salto condicional (je programasecreto.401666; "jump if equal") que se cumple según lo que evalúe la instrucción anterior test. Si se da el salto, llegamos a la instrucción que printea "Login SUCCESFUL". Si no se da el salto, entonces se ejecuta el código de "Login UNSUCCESFUL. Intentelo de nuevo." Para que siempre se cumpla el login, podemos hacer que en vez de ser un salto condicional, sea un salto a secas, es decir, que ese salto siempre se cumpla (en vez de je sea un jmp). Hacemos click derecho en la instrucción de salto y le damos a la opción ensamblar. Nos aparecerá la instrucción que queremos editar.
En la imagen se ve como ya he cambiado la instrucción, y el propio programa me dice que está bien escrita, así que le damos a aceptar y ya podemos cerrar la ventana. Una vez editada la instrucción que queríamos, vamos a la barra de opciones del programa, seleccionamos Archivo, Parchear archivo, Aplicar el parche. Guardamos el nuevo .exe crackeado con el nombre que queramos... y listo. Ya podemos probar nuestro programa crackeado:
Podemos meter cualquier usuario y cualquier contraseña que siempre se va a hacer el login correctamente.
Para entender este tutorial voy a explicar absolutamente todo lo que pueda, para que cualquier persona sin conocimientos básicos que lea este post pueda entender el máximo de conceptos posibles. Lo importante para mí no es aprender el "algoritmo", sino entender los fundamentos básicos y utilizarlos como herramienta para hacer todo este tipo de locuras.
Nos situamos en la piel del hacker: tenemos un programa (.exe) que nos pide cierto login, serial key, o cualquier mierda para autenticarnos. En este caso, me he tomado la molestia de hacer un pequeño programa en C++ con un login sencillo para poder crackearlo.
C++:
#include <iostream>
#include <string>
using namespace std;
int main(){
string user;
string password;
cout << "- - - - - Gestor de passwords - - - - -" << endl << endl;
while(true){
cout << "Usuario: " ;
cin >> user;
cout << "Password: " ;
cin >> password;
if(!(user == "manologamer" && password == "villarea1968")){
cout << "Login UNSUCCESFUL. Intentelo de nuevo." << endl;
}
else {
cout << "Login SUCCESFUL" << endl;
string fin;
cout << "Credenciales almacenadas: " << endl << "[email protected] :: jaimitoelmejo123" << endl
<< "[email protected] :: betismanquepierda" << endl << "[email protected] :: yastinbibe45" << endl;
return 0;
}
}
return 0;
}
Como veis, he intentado simular un gestor de passwords rudimentario. Al ejecutar el .exe, nos encontramos con esto:
Ten en cuenta que a la hora de crackear un .exe, no vas a tener acceso a este código, pero sí puedes acceder a su código en ensamblador. Simplemente he creado yo mismo el programa para poder mostrar su código y enseñar que esto del cracking no es ningún truco de magia ni nada por el estilo.
¿Qué coño es ensamblador?
Ensamblador (en inglés, assembly) es un lenguaje de bajo nivel que está por encima del binario (1's y 0's, que es lo que entiende la máquina). Este lenguaje varía dependiendo de qué arquitectura tenga nuestro procesador (x86, MIPS, etc...). En mi caso, aprendí ensamblador haciendo programas en MIPS para una asignatura de la carrera, pero una vez que entiendes un lenguaje ensamblador (cual sea), los otros no son tan difíciles de comprender. Es importante tener conocimientos de este lenguaje, porque gracias a esto vamos a poder modificar nuestro programa de manera que se pueda saltar la verificación de credenciales.Si queréis aprender ensamblador, podéis hacerlo por vuestra cuenta en páginas como esta (en verdad he escogido una al azar, pero hay miles de vídeos y páginas web donde podéis aprender). Al aprender ensamblador, estaría bien que aprendierais como funciona un procesador por dentro, pero eso ya lo dejo a gusto de cada uno según las ganas que tengáis de maquinar.
Como esto del ensamblador da para otro post como mínimo, de momento lo dejo aquí y sigo con el tutorial.
Ya sé ensamblador. ¿Ahora qué?
Una vez que tengas nociones suficientes de ensamblador, toca pasar a la acción. Para poder ver el código ensamblador de un .exe, vamos a utilizar cualquier programa debugger que esté hecho para este fin. En mi caso, voy a utilizar x64dbg que es gratuito y podéis descargarlo en su página oficial. Os recomiendo que os descarguéis el mismo para seguir el tutorial porque cada debugger es un dolor de cabeza distinto.¿Qué es lo que vamos a hacer en este programa? Como vamos a tener acceso a su código ensamblador, podemos modificar las partes que queramos para que el programa haga lo que nosotros queramos. En este caso, vamos a buscar la parte del login en el programa y modificaremos la parte donde evalúe la condición para superar el login.
Para ello, abrimos el .exe en el debugger:
Nos aparecerá una ventana del debugger con el código ensamblador, y otra ventana que, en este caso, es un cmd donde se ejecuta el programa. Podemos encontrar la parte del login de dos maneras:
1. Ejecutando el programa paso a paso (opción Step over) hasta que hayamos introducido el usuario y la contraseña. Una vez introducidos estos, el código pasará a ejecutar la evaluación de la condición para poder pasar el login.
2. En este programa tan sencillo, basta con buscar referencias a strings y encontrar la parte del código donde esté "Login SUCCESFUL".
En este post, os enseñaré a hacerlo de la segunda manera. Para buscar referencias a strings, hacemos click derecho en el código, opción Buscar en, Todos los módulos, Referencias a cadena:
Se nos abrirá una ventana en el programa con todas las referencias a cadena de éste. Lo normal es que nos encontremos una barbaridad, pero podemos filtrar la búsqueda. En este caso no es necesario porque a simple vista se puede encontrar fácil.
Ahí está lo que buscamos. Hacemos click derecho y le damos a la opción Mostrar en el desensamblador. Nos llevará a la parte del código donde se encuentra esta cadena.
Vamos a comentar un poco este código. Vemos que hay un salto condicional (je programasecreto.401666; "jump if equal") que se cumple según lo que evalúe la instrucción anterior test. Si se da el salto, llegamos a la instrucción que printea "Login SUCCESFUL". Si no se da el salto, entonces se ejecuta el código de "Login UNSUCCESFUL. Intentelo de nuevo." Para que siempre se cumpla el login, podemos hacer que en vez de ser un salto condicional, sea un salto a secas, es decir, que ese salto siempre se cumpla (en vez de je sea un jmp). Hacemos click derecho en la instrucción de salto y le damos a la opción ensamblar. Nos aparecerá la instrucción que queremos editar.
En la imagen se ve como ya he cambiado la instrucción, y el propio programa me dice que está bien escrita, así que le damos a aceptar y ya podemos cerrar la ventana. Una vez editada la instrucción que queríamos, vamos a la barra de opciones del programa, seleccionamos Archivo, Parchear archivo, Aplicar el parche. Guardamos el nuevo .exe crackeado con el nombre que queramos... y listo. Ya podemos probar nuestro programa crackeado:
Podemos meter cualquier usuario y cualquier contraseña que siempre se va a hacer el login correctamente.