我使用
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
一起使用,但这似乎没有效果
任何人都可以解释我做错了什么,谢谢。
问题在这里:
CreateProcess(fname, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL,NULL, &si, pi);
这本质上并不是错误的,但是使用
CREATE_SUSPENDED
创建标志会产生几个后果。由于进程是自初始化,因此CreateProcess
调用仅执行主线程进行初始化所需的最低限度。
值得注意的是,内核不会将模块(除了ntdll.dll)映射到地址空间。映射模块(并解析导入)是进程主线程的责任。在开始执行之前,在进程的地址空间中找不到太多内容。
任何读取待加载模块支持的内存的尝试都将失败。