Подтвердить что ты не робот

Почему OpenProcessToken терпит неудачу с ERROR_ACCESS_DENIED

Я запускаю процесс как пользователь в группе "Администраторы", пытаясь получить токен процесса для другого процесса. Другой процесс выполняется пользователем, не входящим в группу "Администраторы". Вот суть кода, который я использую. pid в этом коде представляет собой идентификатор процесса процесса без администратора. Все это на Windows XP SP 2 и все на одном компьютере. Здесь нет удаленного доступа.

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_ACCESS_DENIED. Я добавил код для понимания привилегий процесса, запускающего этот код, и включения как можно большего числа, а также для сбора информации о процессе, для которого я пытаюсь получить токен. Это связано с запросом большего доступа (READ_CONTROL | ACCESS_SYSTEM_SECURITY в дополнение к PROCESS_QUERY_INFORMATION) из OpenProcess и вызова GetKernelObjectSecurity (дескриптор). Вот что у меня есть:

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, является членом группы "Администраторы".

Здесь информация из 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 (non-admin) позволяет получить доступ к группе "Администраторы". Возможно, я неверно истолковываю. Так почему OpenProcessToken терпит неудачу с ERROR_ACCESS_DENIED? Я попытался изменить TOKEN_DUPLICATE на TOKEN_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_GROUP_MANDATORY, который здесь не кажется релевантным.

По умолчанию процесс системного контекста также имел некоторые дополнительные привилегии:

SeAuditPrivilege
SeCreatePermanentPrivilege
SeLockMemoryPrivilege
SeTcbPrivilege

Но я отключил их все, и OpenProcessToken все еще преуспел в процессе системного контекста.

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Вместо того, чтобы вдаваться в подробности сначала, вы пошли по пути устранения? - запустите процесс как LOCAL_SYSTEM и посмотрите, делает ли это трюк. В конце концов, если Бог не может этого сделать, тогда никто не может: P.

Ответ 2

Я думаю, что SECURITY_DESCRIPTOR целевого процесса разрешает пользователю SYSTEM открывать свой токен процесса. Это будет печально, что вы ничего не можете сделать.

Ответ 3

да, есть решение, в котором вы можете запустить службу или экземпляр вашего приложения в качестве службы. таким образом, вы получите код, работающий как система....

Другой вариант (но более навязчивый), поскольку вы уже являетесь администратором, заключается в изменении целевого процесса acl....