gpt4 book ai didi

c++ - 远程线程调用 LoadLibrary 失败,错误 87

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:47 28 4
gpt4 key购买 nike

我正在尝试创建一个远程线程,它将加载我编写的 DLL,并从中运行一个函数。DLL 工作正常(已检查)但由于某种原因,远程线程失败并且创建它的进程停止响应。

我使用 ollyDebug 尝试查看出了什么问题,我注意到两件事...

  1. 我的字符串(dll 名称和函数名称)已正确传递给远程线程
  2. 线程在 LoadLibrary 上失败,错误代码为 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;
}

编辑:

这是我为远程进程分配内存的部分:

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* 。 (因为在代码中明确编写字符串会导致指向我的原始进程)。

我做错了什么?

最佳答案

ERROR_INVALID_PARAMETER 失败表示传递的参数有问题。

所以应该看一下 data->dll,它表示唯一有问题的参数。

这里初始化:

lData.dll = VirtualAllocEx(explorer, 0, sizeof(char) * (strlen(dllName) + 1), MEM_COMMIT, PAGE_READWRITE);

所以让我们添加一个检查是否应该存储到 lData.dll 中的内存分配真的成功了。

if (!lData.dll) {
// do some error logging/handling/whatsoever
}

这样做之后,您可能已经检测到实现的调用失败,因为(来自 MSDN 的 VirtualAllocEx() 逐字记录):

The function fails if you attempt to commit a page that has not been reserved. The resulting error code is ERROR_INVALID_ADDRESS.

因此您可能希望按照建议修改相关调用的第四个参数(再次逐字来自 MSDN):

To reserve and commit pages in one step, call VirtualAllocEx with MEM_COMMIT | MEM_RESERVE.

PS:对分配 lData.func 的调用重复此练习。 ;-)

关于c++ - 远程线程调用 LoadLibrary 失败,错误 87,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8688137/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com