我正在以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仍然在系统上下文进程中成功。
谢谢你的帮助。