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

2019-10-19 03:17发布

我有一个程序,我处理步行获得HANDLE每一个过程,因为我“走”下来列表(正常工作),但是当我做我的问题在于:

HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID)其中PROCESS_ALL_ACCESS是接入令牌,处理继承被设置为FALSE ,并PE32是PROCESSENTRY32

GetLastError()返回错误代码5,和所有由手柄是不符合任何合适的工艺在间谍++地址六十四分之三十二(我试过建设同时根据平台的目标应用程序,但你会期望,结果是一样的)。


设置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 64位专业版。
  2. 是的,devenv.exe的开始以“以管理员身份运行”权限,这意味着调试器和应用程序本身是相同的亲和力下开始。
  3. 我曾尝试切换UAC或运行与UAC的应用程序完全关闭。 尽管如此错误代码5。
  4. 我只是试图用做PROCESS_QUERY_LIMITED_INFORMATION和我收到的错误代码6,或ERROR_INVALID_HANDLE 。 也试图与PROCESS_QUERY_INFORMATION | PROCESS_VM_READ PROCESS_QUERY_INFORMATION | PROCESS_VM_READ ,结果是错误5试。
  5. SeDebugPrivilege启用,与Sysinternals的进程资源管理器验证。 此外,从devenv的产卵所有进程/无论调试器被称为继承SeDebugPrivilege所以...这是奇怪的。

谢谢大家对我付出的时间,我达到了斗智斗勇这个问题结束:S

Answer 1:

你确定你是不是传递0作为一个进程ID值? ID为0的系统空闲进程包括在名[系统进程]下的快照,但不能打开的句柄它作为文档OpenProcess具体说,它会失败。 那么它说多一点:

如果指定的过程是系统处理(00000000),则操作失败和最后错误代码是ERROR_INVALID_PARAMETER。 如果指定的进程是空闲进程或CSRSS进程之一,该功能失败,一个错误代码ERROR_ACCESS_DENIED因为它们的访问限制阻止用户级代码打开它们。

好吧,这不是因为我是能够打开的句柄CSRSS完全真实(当然,实际上它并不具备所要求的权利)。 但它可能会失败,对于一些受保护的进程(audiodg),所以你不应该这样做。 相反,检查进程的名称,如果这是你想要的。



文章来源: WinAPI: OpenProcess() returns error 5 with SeDebugPrivilege enabled for host process