Я пытаюсь создать удаленный поток, который будет загружать написанную мной DLL и запускать функцию из нее.
DLL работает нормально (проверено), но по какой-то причине удаленный поток завершается ошибкой, и процесс, в котором он был создан, перестает отвечать.
Я использовал ollyDebug, чтобы попытаться увидеть, что идет не так, и заметил две вещи ...
- Мои строки (имя DLL и имя функции) правильно передаются в удаленный поток
- Поток завершается с ошибкой в LoadLibrary с кодом lasterror 87 "ERROR_INVALID_PARAMETER"
Мое лучшее предположение заключается в том, что каким-то образом удаленный поток не может найти LoadLibrary (это потому, что компоновщик сделан с уважением к моему процессу ???, просто предположение ...)
Что я делаю не так?
Это код для функции дистанционного управления:
static DWORD WINAPI SetRemoteHook (DATA *data)
{
HINSTANCE dll;
HHOOK WINAPI hook;
HOOK_PROC hookAdress;
dll = LoadLibrary(data->dll);
hookAdress = (HOOK_PROC) GetProcAddress(dll,data->func);
if (hookAdress != NULL)
{
(hookAdress)();
}
return 1;
}
Edit:
Это часть, в которой я выделяю память для удаленного процесса:
typedef struct
{
char* dll;
char* func;
} DATA;
char* dllName = "C:\\Windows\\System32\\cptnhook.dll";
char* funcName = "SetHook";
char* targetPrgm = "mspaint.exe";
Data lData;
lData.dll = (char*) VirtualAllocEx( explorer, 0, sizeof(char)*strlen(dllName), MEM_COMMIT, PAGE_READWRITE );
lData.func = (char*) VirtualAllocEx( explorer, 0, sizeof(char)*strlen(funcName), MEM_COMMIT, PAGE_READWRITE );
WriteProcessMemory( explorer, lData.func, funcName, sizeof(char)*strlen(funcName), &v );
WriteProcessMemory( explorer, lData.dll, dllName, sizeof(char)*strlen(dllName), &v );
rDataP = (DATA*) VirtualAllocEx( explorer, 0, sizeof(DATA), MEM_COMMIT, PAGE_READWRITE );
WriteProcessMemory( explorer, rDataP, &lData, sizeof(DATA), NULL );
Edit:
Похоже, проблема в том, что удаленный поток вызывает «мусорный» адрес
вместо базового адреса LoadLibrary. Возможно ли Visual Studio связана с
адрес удаленного процесса LoadLibrary неправильный?
Edit:
когда я пытаюсь запустить тот же точный код, что и в локальном потоке (я использую дескриптор текущего процесса в CreateRemoteThread), все это работает просто отлично. Что может вызвать это?
Должен ли я добавить код вызывающей функции? Кажется, делает свою работу как
код выполняется в удаленном потоке с правильными параметрами ...
Код скомпилирован под VS2010.
data - это простая структура с символами * в именах. (Поскольку явное написание строк в коде привело бы к указателям на мой исходный процесс).
Что я делаю не так?