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

时间:2013-11-12 15:02:46

标签: security winapi visual-c++ win32-process

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

我创建了一个由两个不同进程加载的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;
 }

1 个答案:

答案 0 :(得分:0)

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

调用VirtualQuery需要某些process access rights,如果没有,则VirtualQueryEx将失败。

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