我正在尝试创建一个远程线程,该线程将加载我编写的 DLL,并从中运行一个函数。DLL 工作正常(已检查),但由于某种原因,远程线程失败并且创建它的进程停止响应。
我使用 ollyDebug 尝试查看出了什么问题,我注意到两件事......
- 我的字符串(dll 名称和函数名称)正确传递给远程线程
- 线程在 LoadLibrary 上失败,最后一个错误代码为 87“ERROR_INVALID_PARAMETER”
我最好的猜测是,远程线程找不到 LoadLibrary (这是因为链接器完成了对我的进程的repspect???,只是猜测......)
我究竟做错了什么?
这是远程功能的代码:
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;
}
编辑:
这是我将内存分配给远程进程的部分:
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 );
编辑:看起来问题是远程线程正在调用“垃圾”地址而不是 LoadLibrary 基地址。是否有可能 Visual Studio 链接远程进程 LoadLibrary 地址错误?
编辑:当我尝试运行与本地线程相同的代码时(我在 CreateRemoteThread 中使用当前进程的句柄),整个事情都运行良好。什么会导致这种情况?
我应该添加调用功能代码吗?它似乎正在完成它的工作,因为代码正在使用正确的参数在远程线程中执行......
代码在VS2010下编译。
data 是一个简单的结构,名称带有 char* 。(因为在代码中明确编写字符串会导致指向我原始进程的指针)。
我究竟做错了什么?