Windows Vista / полномочие Windows 7: SeDebugPrivilege & OpenProcess

Все, что я смог найти о возрастании к соответствующим полномочиям для моих потребностей, согласилось с моими существующими методами, но проблема существует. Я надеюсь, возможно, что у кого-то есть некоторый Windows Vista / опыт внутренностей Windows 7, который мог бы пролить некоторый свет, где существует только темнота. Я уверен, что это станет длинным, но терпите меня.

Контекст

Я работаю над приложением, которое требует доступа к памяти других процессов на текущей машине. Это, очевидно, требует прав администратора. Это также требует SeDebugPrivilege (не, это не орфографическая ошибка SetDebugPrivilege), который я полагаю я получать правильно, хотя я подвергаю сомнению, не ли больше полномочий необходимо и таким образом причина моих проблем. Код до сих пор работал успешно над всеми версиями Windows XP, и на моем тесте Vista 32 бита и среды Windows 7 64 битов.

Процесс

  • Программа будет Всегда запускаться с Правами Администратора. Это может быть принято всюду по этому сообщению.
  • Возрастание текущего процесса Access Token включать SeDebugPrivilege права.
  • Используя EnumProcesses создать список текущего PIDs в системе
  • Открытие использования дескриптора OpenProcess с PROCESS_ALL_ACCESS права доступа
  • Используя ReadProcessMemory считать память другого процесса.

Проблема:

Все хорошо работало во время разработки и моего персонального тестирования (включая Windows XP 32 и 64, Windows Vista 32 и Windows 7 x64). Однако во время тестового развертывания и на Windows Vista (32-разрядный) и на Windows 7 (64-разрядные) машины коллеги, там, кажется, проблема полномочия/прав с OpenProcess сбой с дженериком Access Denied ошибка. Это происходит оба при выполнении как ограниченный Пользователь (как ожидался бы), и также, когда выполнено явно как Администратор (Щелкните правой кнопкой по Выполнениюкак по Администратору и, когда выполнено от командной строки Уровня администратора).

Однако эта проблема была невоспроизводимой для меня в моей тестовой среде. Я засвидетельствовал проблему на собственном опыте, таким образом, я полагаю, что проблема существует. Единственная разница, которую я могу различить между фактической средой и моей тестовой средой, - то, что фактическая ошибка происходит при использовании учетной записи Администратора домена при подсказке контроля учётных записей, тогда как мои тесты (которые работают без ошибок) используют учетную запись локального администратора при подсказке контроля учётных записей.

Кажется что, хотя используемые учетные данные позволяют контролю учётных записей 'работать как администратор', процесс все еще не получает корректные права смочь к OpenProcess на другом процессе. Я не достаточно знаком с внутренностями Vista/Windows 7 для знания то, чем это могло бы быть, и я надеюсь, что у кого-то есть идея того, что могло быть причиной.

Строка над заголовком

Человек, который сообщил об этой ошибке, и кто среда, может регулярно воспроизводить эту ошибку, назвали небольшое приложение вроде RunWithDebugEnabled который является маленькой программой самозагрузки, которая, кажется, наращивает ее собственные полномочия и затем запускается, исполняемый файл передал ей (таким образом наследование наращиваемых полномочий). Когда выполнено с этой программой, с помощью тех же учетных данных Администратора домена при подсказке контроля учётных записей, программа работает правильно и может успешно звонить 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 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 при вышеупомянутых условиях, он будет больше всего значительно цениться.

Я не был бы здесь, если бы я не был абсолютно озадачен, но я надеюсь что еще раз опыт и знания ярких сияний группы. Я благодарю Вас за не торопление для чтения этой стены текста. Одни только благие намерения ценятся, благодарит быть типом человека, который делает Переполнение стека настолько полезным для всех!

25
задан Peter Mortensen 2 December 2017 в 19:50
поделиться

1 ответ

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

В данном случае проблема заключается в том, что привилегия Отладка программ в локальной политике для администратора домена была удалена, и, таким образом, токен SeDebugPrivilege не присутствовал в процессе токен доступа. Его нельзя включить, если он вообще отсутствует, и я до сих пор не знаю способа добавить привилегию к существующему токену доступа.


Как работает текущая магия:
Итак, волшебное приложение RunWithDebugEnabled будет использовать свои права администратора, чтобы установить себя как службу и запустить себя, таким образом, работая под пользователем SYSTEM учетной записи, а не администратора домена. С привилегиями SYSTEM приложение затем создает новый токен доступа, идентичный токену администратора, только с токеном SeDebugPrivilege . Этот новый токен используется для CreateProcessAsUser () и запускает программу с недавно включенным SeDebugPrivilege , который отсутствовал ранее.

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

РЕДАКТИРОВАТЬ: Выдать себя за СИСТЕМУ (или эквивалент) из учетной записи администратора



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

13
ответ дан 28 November 2019 в 21:58
поделиться
Другие вопросы по тегам:

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