如何限制/授予对子进程内存的读/写访问权限?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何限制/授予对子进程内存的读/写访问权限?相关的知识,希望对你有一定的参考价值。

是否有可能以编程方式调整进程的特权,以便如果以后在任何时候创建子进程,它将始终(永远)具有对该进程的内存的写访问权限?

我创建了一个由两个不同进程加载的dll。在代码的某个点上,我创建了一个过程。我观察到,根据哪个进程加载了我的dll,我可以对子进程的内存进行PAGE_EXECUTE_WRITECOPY0访问。我的猜测是,加载过程必须设置一些限制,导致这种行为,因为我对这两个过程都没有做任何不同的事情。我在Process Explorer中查看了该进程的安全性信息,但发现两者之间没有任何区别。 hToken值由调用我的API的调用者提供给我。这是造成这种情况的原因吗?我该如何测试以确认是否呢?

CreateProcessAsUserW(hToken, exe, cmd_line, NULL, NULL, 
    false,
    CREATE_SUSPENDED | CREATE_UNICODE_ENVIRONMENT | DETACHED_PROCESS | EXTENDED_STARTUPINFO_PRESENT | CREATE_BREAKAWAY_FROM_JOB,
    NULL, NULL, 
    &si, &pi);

MEMORY_BASIC_INFORMATION buffer;
// 'address' is some valid address
SIZE_T num = VirtualQueryEx(pi.hProcess_handle, address,&buffer,sizeof(MEMORY_BASIC_INFORMATION)); 
if(num > 0)

        DWORD access = buffer.AllocationProtect;  // 0x0 or 0x80 depending on which process loads dll 
        DWORD state = buffer.State;
        DWORD type = buffer.Type;
 
答案

每页内存的Memory Protection Constant与句柄无关,无论是否继承。

调用VirtualQuery需要特定的process access rights,如果您没有它们,则VirtualQueryEx将失败。

0不是AllocationProtect的有效值,因此,我认为问题的根源是VirtualQuery失败,原因是地址错误或您没有所需的进程访问权限。

以上是关于如何限制/授予对子进程内存的读/写访问权限?的主要内容,如果未能解决你的问题,请参考以下文章

拖动跟踪期间的读/写访问、POSIX 权限和沙箱

如何在使用 .NET 安装期间授予对文件夹的读/写权限

S3 存储桶策略授予/限制对特定联合用户的访问权限

限制对 Redshift 表的访问,仅授予对视图的访问权限

在vagrant homestead上配置php.ini

如何授予用户对系统表的有限访问权限?