Привилегия Windows Vista/Windows 7: SeDebugPrivilege & OpenProcess
Все, что я смог найти в отношении перехода к соответствующим привилегиям для моих нужд, согласуется с моими нынешними методами, но проблема существует. Я надеюсь, что у кого-то есть опыт работы с внутренними компонентами Windows Vista/Windows 7, который может пролить свет на темноту. Я уверен, что это будет долго, но, пожалуйста, потерпите меня.
контекст
Я работаю над приложением, которое требует доступа к памяти других процессов на текущем компьютере. Это, очевидно, требует прав администратора. Это также требует SeDebugPrivilege
(нет, это не опечатка SetDebugPrivilege
), который, как я считаю, я получаю правильно, хотя я сомневаюсь, что больше привилегий не нужно и, следовательно, причина моих проблем. До сих пор код успешно работал во всех версиях Windows XP, а также в моей тестовой 64-битной среде Vista и Windows 7.
Процесс
- Программа всегда будет работать с правами администратора. Это можно предположить на протяжении всего этого поста.
- Эскалация текущего процесса
Access Token
включатьSeDebugPrivilege
прав. - С помощью
EnumProcesses
создать список текущих PID в системе - Открытие ручки с помощью
OpenProcess
сPROCESS_ALL_ACCESS
права доступа - С помощью
ReadProcessMemory
читать память другого процесса.
Проблема:
Все работало нормально во время разработки и моего личного тестирования (включая Windows XP 32 и 64, Windows Vista 32 и Windows 7 x64). Однако во время тестового развертывания на компьютерах Windows Vista (32-разрядной) и Windows 7 (64-разрядной) коллеги, кажется, возникает проблема с привилегиями / правами OpenProcess
терпеть неудачу с общим Access Denied
ошибка. Это происходит как при работе от имени ограниченного пользователя (как и следовало ожидать), так и при явном запуске от имени администратора (щелкните правой кнопкой мыши → Запуск от имени администратора и при запуске из командной строки уровня администратора).
Однако эта проблема была невоспроизводимой для меня в моей тестовой среде. Я был свидетелем проблемы из первых рук, поэтому я верю, что проблема существует. Единственное различие, которое я могу различить между фактической средой и моей тестовой средой, заключается в том, что настоящая ошибка возникает при использовании учетной записи администратора домена в приглашении UAC, тогда как в моих тестах (которые работают без ошибок) используется учетная запись локального администратора на UAC подскажите.
Похоже, что хотя используемые учетные данные позволяют UAC "работать от имени администратора", процесс все еще не получает правильные права, чтобы иметь возможность OpenProcess
на другом процессе. Я недостаточно знаком с внутренними компонентами Vista / Windows 7, чтобы знать, что это может быть, и я надеюсь, что кто-то имеет представление о том, что может быть причиной.
Кикер
Человек, который сообщил об этой ошибке, и окружение которого может регулярно воспроизводить эту ошибку, имеет небольшое приложение, названное так: RunWithDebugEnabled
это небольшая программа начальной загрузки, которая, по-видимому, наращивает свои собственные привилегии, а затем запускает исполняемый файл, переданный ей (таким образом, наследуя расширенные привилегии). При запуске с этой программой, используя те же учетные данные администратора домена в приглашении UAC, программа работает правильно и может успешно вызвать OpenProcess
и работает как задумано.
Так что это определенно проблема с получением правильных привилегий, и известно, что учетная запись администратора домена является учетной записью администратора, которая должна иметь доступ к правильным правам. (Очевидно, что получить этот исходный код было бы здорово, но я не был бы здесь, если бы это было возможно).
Заметки
Как отмечается, ошибки, о которых сообщают OpenProcess
попытки Access Denied
, Согласно документации MSDN OpenProcess
:
Если вызывающая сторона включила привилегию SeDebugPrivilege, запрошенный доступ предоставляется независимо от содержимого дескриптора безопасности.
Это приводит меня к мысли, что, возможно, в этих условиях существует проблема либо с (1) получением SeDebugPrivileges
или (2) Требование других привилегий, которые не были упомянуты в какой-либо документации MSDN, и которые могут отличаться между учетной записью администратора домена и учетной записью локального администратора
Образец кода:
void sample()
{
/////////////////////////////////////////////////////////
// Note: Enabling SeDebugPrivilege adapted from sample
// MSDN @ http://msdn.microsoft.com/en-us/library/aa446619%28VS.85%29.aspx
// Enable SeDebugPrivilege
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tokenPriv;
LUID luidDebug;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE)
{
if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE)
{
tokenPriv.PrivilegeCount = 1;
tokenPriv.Privileges[0].Luid = luidDebug;
tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, 0, NULL, NULL) != FALSE)
{
// Always successful, even in the cases which lead to OpenProcess failure
cout << "SUCCESSFULLY CHANGED TOKEN PRIVILEGES" << endl;
}
else
{
cout << "FAILED TO CHANGE TOKEN PRIVILEGES, CODE: " << GetLastError() << endl;
}
}
}
CloseHandle(hToken);
// Enable SeDebugPrivilege
/////////////////////////////////////////////////////////
vector<DWORD> pidList = getPIDs(); // Method that simply enumerates all current process IDs
/////////////////////////////////////////////////////////
// Attempt to open processes
for(int i = 0; i < pidList.size(); ++i)
{
HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pidList[i]);
if(hProcess == NULL)
{
// Error is occurring here under the given conditions
cout << "Error opening process PID(" << pidList[i] << "): " << GetLastError() << endl;
}
CloseHandle(hProcess);
}
// Attempt to open processes
/////////////////////////////////////////////////////////
}
Спасибо!
Если у кого-то есть представление о возможных разрешениях, привилегиях, правах и т. Д., Которые мне могут не хватать, чтобы правильно открыть другой процесс (при условии, что исполняемый файл был правильно запущен с правами "Запуск от имени администратора") в Windows Vista и Windows 7 при указанных выше условиях., это было бы очень высоко ценится.
Я не был бы здесь, если бы не был полностью озадачен, но я надеюсь, что снова опыт и знания группы сияют ярко. Я благодарю вас за то, что вы нашли время прочитать эту стену текста. Мы ценим только добрые намерения, спасибо за то, что вы такой тип людей, который делает переполнение стека таким полезным для всех!
1 ответ
Так что после долгих отладок и беспокойства большого количества людей об информации, я наконец смог отследить парня, который написал RunWithDebugEnabled
приложение и получить краткое изложение того, как оно работает.
Проблема в этом случае заключается в том, что Debug programs
привилегия в локальной политике для администратора домена была удалена, и, таким образом, SeDebugPrivilege
токен отсутствует в токене доступа процесса. Его нельзя включить, если его вообще нет, и я до сих пор не знаю, как добавить привилегию к существующему токену доступа.
Как работает текущая магия:
Итак RunWithDebugEnabled
Волшебное приложение будет использовать свои права администратора, чтобы установить себя в качестве службы и запустить себя, таким образом, работая под SYSTEM
учетная запись пользователя, а не администратор домена. С SYSTEM
привилегии, приложение затем создает новый токен доступа, который идентичен токену администратора, только с SeDebugPrivilege
токен присутствует. Этот новый токен используется для CreateProcessAsUser()
и запустите программу с новым включенным SeDebugPrivilege
чего раньше не было
На самом деле мне здесь не нравится это "решение", и я продолжаю поиски "более чистого" способа получения этой привилегии. Я буду публиковать это как еще один вопрос здесь, на SO, который я постараюсь не забыть, чтобы связать здесь также, чтобы помочь другим следовать и для дальнейшего использования.
РЕДАКТИРОВАТЬ: олицетворять СИСТЕМУ (или эквивалент) из учетной записи администратора
Я благодарю всех вас за ваше время и силы, помогающие отладить и решить эту проблему. Это действительно высоко ценится!