WinAPI:OpenProcess()返回错误5,并为主机进程启用SeDebugPrivilege

WinAPI: OpenProcess() returns error 5 with SeDebugPrivilege enabled for host process

本文关键字:主机 进程 SeDebugPrivilege 启用 OpenProcess 错误 返回 WinAPI      更新时间:2023-10-16

我有一个例程,在这个例程中,我处理walk,以在列表中"walk"时获得每个进程的HANDLE(这很好),但当我这样做时,我的问题在于:

HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID),其中PROCESS_ALL_ACCESS是访问令牌,句柄继承设置为FALSE,pe32是PROCESSENTRY32

GetLastError()返回错误代码5,生成的所有句柄都是与Spy++32/64中的任何适当进程不对应的地址(我曾尝试在两个平台目标下构建应用程序,但正如您所料,结果是相同的)。


为我正在使用的主机进程设置SeDebugPrivilege的代码是:

BOOL EnableDebugPrivilege(BOOL bEnable)
{
HANDLE hToken = nullptr;
LUID luid;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) return FALSE;
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) return FALSE;
TOKEN_PRIVILEGES tokenPriv;
tokenPriv.PrivilegeCount = 1;
tokenPriv.Privileges[0].Luid = luid;
tokenPriv.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) return FALSE;
return TRUE;
}

一些对您有帮助的问题:

  1. 我运行的是Windows 7 x64 Professional
  2. 是的,devenv.exe是以"以管理员身份运行"权限启动的,这意味着调试器和应用程序本身是在相同的关联下启动的
  3. 我尝试过切换UAC或在完全关闭UAC的情况下运行应用程序。仍然错误代码5
  4. 我刚刚尝试使用PROCESS_QUERY_LIMITED_INFORMATION进行此操作,但收到错误代码6或ERROR_INVALID_HANDLE。同样尝试使用PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,结果再次出现错误5
  5. SeDebugPrivilege已启用,使用SysInternals的Process Explorer进行验证。此外,所有从devenv/调试器中派生的进程都继承SeDebugPrivilege,所以……这很奇怪

非常感谢大家抽出时间,我对这个问题束手无策:S

您确定没有将0作为进程ID值传递吗?ID为0的系统空闲进程以[system process]的名称包含在快照中,但您无法打开它的句柄,因为OpenProcess的文档特别指出它将失败。好吧,它说了更多:

如果指定的进程是系统进程(0x00000000)函数失败,最后一个错误代码为error_INVALID_PARAMETER。如果指定的进程是空闲进程或CSRSS之一进程,此函数失败,最后一个错误代码为ERROR_ACCESS_DENIED,因为它们的访问限制阻止用户级代码。

嗯,这并不完全正确,因为我能够打开CSRSS的句柄(当然,它实际上并没有请求的权限)。但对于某些受保护的进程(audiodg),它可能会失败,所以您不应该这样做。相反,如果进程是您想要的,请检查该进程的名称。