如何从进程ID获取进程句柄?

ana*_*and 20 c++ winapi windows-vista

我有进程ID,我想得到它的进程句柄.

有没有可用的API.

我尝试使用OpenProcess但它返回NULL,并且GetLastError = 0.

这是我在尝试Vista.

我想我需要在使用OpenProcess之前启用SeDebugPrivilege.但是为了启用SeDebugPrivilege,我需要获得它的Process句柄.

Mat*_*ner 25

OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);
Run Code Online (Sandbox Code Playgroud)

您需要验证您是否使用了有效的进程ID,并且您是否被允许从该进程请求的访问权限.

  • 不要求PROCESS_ALL_ACCESS,你不太可能在安全的安装上得到它.只询问你需要什么. (12认同)
  • 是的,尝试请求SYNCHRONIZE,这几乎不会失败.然后从那里升级所请求的权限. (5认同)

bdd*_*bdd 11

这是你想要的?

HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
CloseHandle(processHandle); 
Run Code Online (Sandbox Code Playgroud)

另外,这里是我用来在注入DLL之前设置debug privledge的一些代码.

void Loader::EnableDebugPriv(void)
{
    HANDLE              hToken;
    LUID                SeDebugNameValue;
    TOKEN_PRIVILEGES    TokenPrivileges;

    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
        if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &SeDebugNameValue))
        {
            TokenPrivileges.PrivilegeCount              = 1;
            TokenPrivileges.Privileges[0].Luid          = SeDebugNameValue;
            TokenPrivileges.Privileges[0].Attributes    = SE_PRIVILEGE_ENABLED;

            if(AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
            {
                CloseHandle(hToken);
            }
            else
            {
                CloseHandle(hToken);
                throw std::exception("Couldn't adjust token privileges!");              
            }
        }
        else
        {
            CloseHandle(hToken);
            throw std::exception("Couldn't look up privilege value!");
        }
    }
    else
    {
        throw std::exception("Couldn't open process token!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经成功地在Windows Vista上使用了上述代码.