Я рефлекторно внедряю dll в память других процессов, и мне нужно явно вызвать CreateThread (). Я передаю определенные параметры в DLL, которую я внедряю, используя мою структуру loader_data. У меня есть определенные переменные, которые мне нужно передать, такие как размеры порции памяти и т. Д. Все они успешно доставляются в мою введенную dll, однако при передаче char * в мою структуру она оказывается пустой для моей введенной dll в зарезервированной параметр DllMain.
loader_data_t *parameter = new loader_data_t();
... initialize variables.
lpRemoteLibraryBuffer3 = VirtualAllocEx(proc, NULL, sizeof(loader_data_t), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(proc, lpRemoteLibraryBuffer3, parameter, sizeof(loader_data_t), NULL);
Вот как я выделяю место для параметра.
typedef struct loader_data_t {
char *chunk;
int chunk_size;
ULONG_PTR reloc_address;
};
И это структура, которую я передаю. Я определенно инициализирую его правильно, я проверил, чтобы убедиться, что все настроено правильно. Однако когда он передается зарезервированному параметру в DllMain, все остальные переменные верны, кроме переменной char * chunk. Я действительно запутался, извините за возможно смутное название.
Предполагая, что вы установили ‘chunk’ в коде данных инициализации, указатель в удаленном адресном пространстве будет ссылаться на адрес в локальном процессе.
Самый простой способ обойти это — сделать массив массивом (возможно, последним членом структуры) и выделить блок, достаточно большой для хранения данных блока.
Более сложным было бы выделить второй блок в удаленном процессе для данных чанка, скопировать данные в этот блок, записать этот адрес в член чанка локального экземпляра и только затем записать локальную структуру в удаленный процесс.
Других решений пока нет …