无法读取内存的所有请求部分

问题描述 投票:0回答:1

我使用

CreateProcess
运行了一个可执行文件,如下所示
CreateProcess(fname, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL,NULL, &si, pi)
之后我想读取
LoadLibrary
地址处的进程内存,所以我使用了这段代码

void read_mem(PROCESS_INFORMATION pi)
{
    SIZE_T bytes = 0;
    char messageBoxOriginalBytes[6] = {};
    HINSTANCE hMod = GetModuleHandle("user32.dll");
    if (!hMod)
    {
        printf("unable to locate user32.dll\n");
        return 1;
    }
    msg_func = GetProcAddress(hMod, "MessageBoxA");
    if (msg_func == NULL)
    {
        printf(" unable to locate messagebox\n");
        CloseHandle(hMod);
        return 1;
    }
    if (!ReadProcessMemory(pi.hProcess, msg_func, messageBoxOriginalBytes, 6, &bytes))
    {
        printf("Failed to read process memory  %d\n", GetLastError());
        return 1;
    } 
}

注意

CreateProcess
中的pi是通过引用传递的

我得到的错误是 299,对应于

仅完成了 ReadProcessMemory 或 WriteProcessMemory 请求的一部分。

我确实尝试将

OpenProcess
PROCESS_ALL_ACCESS
一起使用,但这似乎没有效果

任何人都可以解释我做错了什么,谢谢。

c windows winapi process psapi
1个回答
0
投票

问题在这里:

CreateProcess(fname, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL,NULL, &si, pi);

这本质上并不是错误的,但是使用

CREATE_SUSPENDED
创建标志会产生几个后果。由于进程是自初始化,因此
CreateProcess
调用仅执行主线程进行初始化所需的最低限度。

值得注意的是,内核不会将模块(除了ntdll.dll)映射到地址空间。映射模块(并解析导入)是进程主线程的责任。在开始执行之前,在进程的地址空间中找不到太多内容。

任何读取待加载模块支持的内存的尝试都将失败。

© www.soinside.com 2019 - 2024. All rights reserved.