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:

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;
}
Y en el del builder este:

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;
}
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.
("\\\\.\\PhysicalDrive0")
Responder

Volver a “C/C++”