代码之家  ›  专栏  ›  技术社区  ›  dbyron

为什么OpenProcessToken失败并出现错误\u ACCESS\u DENIED

  •  14
  • dbyron  · 技术社区  · 16 年前

    我正在以Administrators组中的用户身份运行一个进程,试图为另一个进程获取进程令牌。另一个进程由不在Administrators组中的用户运行。以下是我正在使用的代码的要点。此代码中的pid表示非管理进程的进程id。所有这些都在WindowsXPSP2上,并且都在同一台机器上。这里没有远程访问。

    HANDLE handle;
    HANDLE token;
    
    handle = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pid);
    token = NULL;
    OpenProcessToken(handle,TOKEN_DUPLICATE,&token);
    

    OpenProcess的参考: http://msdn.microsoft.com/en-us/library/ms684320%28VS.85%29.aspx

    OpenProcessToken的参考: http://msdn.microsoft.com/en-us/library/aa379295%28VS.85%29.aspx

    OpenProcess成功,但无论我将DesiredAccess参数传递给OpenProcessToken的是什么,它都会失败,GetLastError()返回ERROR\u ACCESS\u DENIED。我添加了一些代码,以了解运行此代码的进程的权限,并尽可能多地启用这些代码,以及收集有关我试图获取令牌的进程的信息。这涉及到从OpenProcess请求更多的访问(除了处理查询信息外,还包括读取控制访问系统安全性)和调用GetKernelObjectSecurity(handle)。我得到的是:

    current user: PLEASE_T\dbyron (S-1-5-21-3405506234-1792454352-3826119157-1005)
    current process: group 0: flags: 0x00000007 sid: S-1-5-21-3405506234-1792454352-3826119157-513 (PLEASE_T\None)
    current process: group 1: flags: 0x00000007 sid: S-1-1-0 (\Everyone)
    current process: group 2: flags: 0x0000000F sid: S-1-5-32-544 (BUILTIN\Administrators)
    current process: group 3: flags: 0x00000007 sid: S-1-5-32-545 (BUILTIN\Users)
    current process: group 4: flags: 0x00000007 sid: S-1-5-4 (NT AUTHORITY\INTERACTIVE)
    current process: group 5: flags: 0x00000007 sid: S-1-5-11 (NT AUTHORITY\Authenticated Users)
    current process: group 6: flags: 0xC0000007 sid: S-1-5-5-0-91553 (no account mapping)
    current process: group 7: flags: 0x00000007 sid: S-1-2-0 (\LOCAL)
    SeDebugPrivilege privilege enabled
    SeTakeOwnershipPrivilege privilege enabled
    SeSecurityPrivilege privilege enabled
    SeChangeNotifyPrivilege privilege enabled
    SeBackupPrivilege privilege enabled
    SeRestorePrivilege privilege enabled
    SeSystemtimePrivilege privilege enabled
    SeShutdownPrivilege privilege enabled
    SeRemoteShutdownPrivilege privilege enabled
    SeDebugPrivilege privilege enabled
    SeSystemEnvironmentPrivilege privilege enabled
    SeSystemProfilePrivilege privilege enabled
    SeProfileSingleProcessPrivilege privilege enabled
    SeIncreaseBasePriorityPrivilege privilege enabled
    SeLoadDriverPrivilege privilege enabled
    SeCreatePagefilePrivilege privilege enabled
    SeIncreaseQuotaPrivilege privilege enabled
    SeUndockPrivilege privilege enabled
    SeManageVolumePrivilege privilege enabled
    SeImpersonatePrivilege privilege enabled
    SeCreateGlobalPrivilege privilege enabled

    我已经尝试获得所有可能的特权,我认为上面的组信息表明调用OpenTokenProcess的进程是Administrators组的成员。

    以下是来自GetKernelObjectSecurity的信息:

    control(SE_DACL_PRESENT | SE_SELF_RELATIVE, 0x00008004)
    owner sid: S-1-5-21-3405506234-1792454352-3826119157-2807 (PLEASE_T\dummyusr)
    group sid: S-1-5-21-3405506234-1792454352-3826119157-513 (PLEASE_T\None)
    grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-21-3405506234-1792454352-3826119157-2807 (PLEASE_T\dummyusr)
    grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-32-544 (BUILTIN\Administrators)
    grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-18 (NT AUTHORITY\SYSTEM)

    因此,dummyusr(非管理员)进程似乎允许访问Administrators组。有可能我误解了,那么为什么OpenProcessToken会失败并出现错误\u ACCESS\u DENIED?我尝试过将TOKEN\u DUPLICATE更改为TOKEN\u QUERY,但这不会改变结果。

    我错过了特权吗?还有什么会拒绝我访问此进程的访问令牌?我在一台没有防病毒软件的机器上试过,结果还是一样的。

    我还尝试了在系统上下文中运行。在这种情况下,有关当前进程的信息是:

    current user: NT AUTHORITY\SYSTEM (S-1-5-18)
    current process: group 0: flags: 0x0000000E sid: S-1-5-32-544 (BUILTIN\Administrators)
    current process: group 1: flags: 0x00000007 sid: S-1-1-0 (\Everyone)
    current process: group 2: flags: 0x00000007 sid: S-1-5-11 (NT AUTHORITY\Authenticated Users)

    请注意,BUILTIN\Administrators组的标志略有不同。管理员进程有0xF,系统进程有0xE。从 http://msdn.microsoft.com/en-us/library/aa379624%28VS.85%29.aspx ,0x1位表示SE\u GROUP\u MANDATORY,此处似乎不相关。

    默认情况下,系统上下文进程还具有一些附加权限:

    SeAuditPrivilege
    SeCreatePermanentPrivilege
    SeLockMemoryPrivilege
    SeTcbPrivilege

    但是我禁用了它们,OpenProcessToken仍然在系统上下文进程中成功。

    谢谢你的帮助。

    3 回复  |  直到 16 年前
        1
  •  1
  •   Hassan Syed    16 年前

    你有没有走上淘汰的路线,而不是一头扎进细节?--按以下方式运行进程 LOCAL_SYSTEM 看看这是否管用。毕竟,如果上帝做不到,那么就没有人能做到。

        2
  •  0
  •   Andrei    12 年前

    我猜目标进程的安全描述符只允许系统用户打开其进程令牌。 这就意味着你无能为力。

        3
  •  -1
  •   user3409863    9 年前

    是的,有一个解决方案,你可以运行一个服务或你的应用程序实例作为服务。这样,您就可以让您的代码作为系统运行。。。。

    由于您已经是管理员,另一个选择(但更具侵入性)是更改目标进程acl。。。。