Привилегия 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, Согласно документации MSDNOpenProcess:

Если вызывающая сторона включила привилегию 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 при указанных выше условиях , это было бы очень высоко ценится.

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

Ответы на вопрос(1)

Ваш ответ на вопрос