0

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

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

1 回答 1

0

每页内存的内存保护常数与句柄无关,无论是否继承。

调用 VirtualQuery 需要某些进程访问权限,如果您没有这些权限,则 VirtualQueryEx 将失败。

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

于 2020-05-17T01:07:19.690 回答