gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:57 25 4
gpt4 key购买 nike

我有一个例程,当我“遍历”列表时(工作正常),我会遍历进程以获取每个进程的 HANDLE,但我的问题在于:

HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID) 其中 PROCESS_ALL_ACCESS 是访问 token ,句柄继承设置为 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 的文档特别指出它将失败。好吧,它说得更多:

If the specified process is the System Process (0x00000000), the function fails and the last error code is ERROR_INVALID_PARAMETER. If the specified process is the Idle process or one of the CSRSS processes, this function fails and the last error code is ERROR_ACCESS_DENIED because their access restrictions prevent user-level code from opening them.

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

关于c++ - WinAPI:OpenProcess() 返回错误 5,并为主机进程启用了 SeDebugPrivilege,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20725051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com