Почему 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 (неадминистратор) процесс предоставляет доступ к Группе администраторов. Возможно, что я неправильно истолковываю Итак, почему 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 все еще преуспел в системном процессе контекста.

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

14
задан dbyron 24 January 2010 в 16:11
поделиться

1 ответ

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

1
ответ дан 1 December 2019 в 17:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: