【发布时间】:2018-11-22 07:53:39
【问题描述】:
我曾尝试在任何进程中读写数据到内存空间。
我使用VirtualProtect()和VirtualProtectEx()函数来改变内存区域的权限。
if(!VirtualProtect(dwAddr, dwSize, PAGE_EXECUTE_READWRITE, &dwOldProtect))
{
printf("VirtualProtect failed error %d", GetLastError());
}
CopyMemory(dwAddr, pBuffer, dwSize);
但我有错误 5(拒绝访问)代码,而不是好的结果。
于是我使用VirtualQuery()函数检查了内存信息。
MEMORY_BASIC_INFORMATION info;
VirtualQuery(dwAddr, &info, sizeof(info));
结果如下:
info.Type = MEM_MAPPED;
info.State = MEM_COMMITED;
info.AllocationProtect = PAGE_WRITECOPY;
info.Protect = PAGE_READ;
因此我无法更改映射和提交内存的权限。
如果有其他方法,请告诉我。
【问题讨论】:
-
请展示一个完整的程序,以便我们可以看到对
OpenProcess的关键调用。但是,使用VirtualProtect没有意义,因为它在调用进程上运行,并且使用VirtualProtectEx也没有意义,因为WriteProcessMemory和ReadProcessMemory已经处理了保护。 -
你从哪里得到这个地址?这是部分内的地址。您自己创建此部分?或如何?什么是创建部分保护?而是
GetLastError()显示RtlGetLastNtStatus()的结果 -
根据想法,您必须获得
STATUS_SECTION_PROTECTION状态,该状态映射到ERROR_INVALID_PARAMETER,因为初始部分分配保护是PAGE_WRITECOPY- 与请求的PAGE_EXECUTE_READWRITE不兼容。如果这不是图像部分
标签: c++ winapi memory-management win32-process