【问题标题】:How to change permission of mapped and committed memory space?如何更改映射和提交的内存空间的权限?
【发布时间】: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 也没有意义,因为WriteProcessMemoryReadProcessMemory 已经处理了保护。
  • 你从哪里得到这个地址?这是部分内的地址。您自己创建此部分?或如何?什么是创建部分保护?而是 GetLastError() 显示 RtlGetLastNtStatus() 的结果
  • 根据想法,您必须获得STATUS_SECTION_PROTECTION 状态,该状态映射到ERROR_INVALID_PARAMETER,因为初始部分分配保护是PAGE_WRITECOPY - 与请求的PAGE_EXECUTE_READWRITE 不兼容。如果这不是图像部分

标签: c++ winapi memory-management win32-process


【解决方案1】:

如果是外部进程,您必须以管理员身份运行应用程序,并且必须使用 VirtualQueryEx()。

您的问题似乎是您没有以管理员身份运行。如果您以管理员身份运行并使用 VirtualQueryEx() 并且仍然失败,那么您需要检查 OpenProcess() 返回的句柄并确保它是好的。

调用 API 后检查返回值并使用 GetLastError() 进一步诊断问题。

【讨论】:

    猜你喜欢
    • 2020-09-06
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多