Inyección de parámetros en .exe (C++)
Publicado: 27 May 2022, 16:45
La inyección de parámetros al final del archivo para que puedan ser interpretados por este es muy útil, por ejemplo,
en la creación de rats, keyloggers etc, ya que cada usuario podrá crear un server personalizado.
Creamos dos proyectos (yo estoy en visual studio), uno para el stub y otro para el builder.
El builder inyectará los parámetros en el stub, y este leerá el mensaje inyectado por el builder.
En el archivo main.cpp del stub añadimos el siguiente código:
Y en el del builder este:
Una vez hecho esto compilamos los dos proyectos.
Colocamos los dos ejecutables en el mismo directorio para más comodidad y ejecutamos el builder.
Introducimos en este caso una ip, un puerto y el nombre con el que se creará el stub inyectado.
Ejecutamos el nuevo .exe y nos debería mostrar los parámetros que introducimos con el builder.
en la creación de rats, keyloggers etc, ya que cada usuario podrá crear un server personalizado.
Creamos dos proyectos (yo estoy en visual studio), uno para el stub y otro para el builder.
El builder inyectará los parámetros en el stub, y este leerá el mensaje inyectado por el builder.
En el archivo main.cpp del stub añadimos el siguiente código:
Código: Seleccionar todo
#include <fstream> //librería necesaria para la lectura y escritura del archivo
#include <iostream>
#include <Windows.h>
using namespace std;
#define STUB_SIZE 232448
//Establecemos el tamaño que tendrá el stub una vez compilado. Será a partir de donde empezará a
//leerse a si mismo para obtener los parámetros inyectados por el builder.
struct Settings { //Creamos la estructura que contendrá los parámetros
int port;
char ip[16];
};
int main() {
Settings data; //Instanciamos la estructura
char filename[256]; //Variable en la que guardaremos la ruta del stub, es decir, este archivo
GetModuleFileNameA(NULL, filename, 256); //Obtenemos la ruta y la guardamos en la variable anteriormente mencionada
ifstream file(filename, ios::binary); //Abrimos el stub como lectura binaria
file.seekg(STUB_SIZE); //Con seekg establecemos la posición del siguiente carácter que se extraerá del flujo de entrada.
file.read((char*)&data, sizeof(Settings)); //Leemos los datos inyectados por el builder
file.close(); //Cerramos el archivo
cout << data.ip << endl; //Mostramos los datos
cout << data.port << endl;
system("pause");
return 0;
}
Código: Seleccionar todo
#include <fstream>//librería necesaria para la lectura y escritura del archivo
#include <Windows.h>
#include <iostream>
using namespace std;
#define STUB_NAME "Stub.exe" //ruta del stub
struct Settings { //Creamos la estructura que contendrá los parámetros
int port;
char ip[16];
char built[32]; //nombre del nuevo archivo
};
int main() {
Settings data; //Instanciamos la estructura
cout << endl << "Ip: ";
cin >> data.ip;
cout << endl << "Port: ";
cin >> data.port;
cout << endl << "Built name: ";
cin >> data.built;
ifstream stub(STUB_NAME, ios::binary); //abrimos el stub como modo de lectura binaria
ofstream built(data.built, ios::binary); //cremos el nuevo archivo
built << stub.rdbuf(); //volcamos el contenido del stub en el nuevo archivo creado
stub.close(); //cerramos el stub
built.write((char*)&data, sizeof(Settings)); //escribimos los parámetros al final del nuevo archivo (que ahora contiene el código del stub)
built.close(); //lo cerramos
return 0;
}
Colocamos los dos ejecutables en el mismo directorio para más comodidad y ejecutamos el builder.
Introducimos en este caso una ip, un puerto y el nombre con el que se creará el stub inyectado.
Ejecutamos el nuevo .exe y nos debería mostrar los parámetros que introducimos con el builder.