Privilegio de Windows Vista / Windows 7: SeDebugPrivilege y OpenProcess

Todo lo que he podido encontrar sobre escalar a los privilegios apropiados para mis necesidades ha coincidido con mis métodos actuales, pero el problema existe. Espero que alguien tenga alguna experiencia interna de Windows Vista / Windows 7 que pueda iluminar algo donde solo hay oscuridad. Estoy seguro de que esto tomará mucho tiempo, pero por favor tengan paciencia conmigo.

Contexto

Estoy trabajando en una aplicación que requiere acceder a la memoria de otros procesos en la máquina actual. Esto, obviamente, requiere derechos de administrador. También requiereSeDebugPrivilege (no, no es un error ortográfico deSetDebugPrivilege), que creo que estoy adquiriendo correctamente, aunque me pregunto si no se necesitan más privilegios y, por lo tanto, la causa de mis problemas. Hasta ahora, el código ha funcionado con éxito en todas las versiones de Windows XP y en mis entornos de prueba Vista 32 bit y Windows 7 64 bit.

ProcesoPrograma voluntadSiempre ejecutarse con derechos de administrador. Esto se puede suponer a lo largo de esta publicación.Escalando el proceso actualAccess Token para incluirSeDebugPrivilege derechos.UtilizandoEnumProcesses para crear una lista de PID actuales en el sistemaAbrir una manija usandoOpenProcess conPROCESS_ALL_ACCESS derechos de accesoUtilizandoReadProcessMemory para leer la memoria del otro proceso.Problema:

Todo ha funcionado bien durante el desarrollo y mis pruebas personales (incluidos Windows XP 32 y 64, Windows Vista 32 y Windows 7 x64). Sin embargo, durante una implementación de prueba en máquinas Windows Vista (32 bits) y Windows 7 (64 bits) de un colega, parece haber un problema de privilegios / derechos conOpenProcess fallando con un genéricoAccess Denied error. Esto ocurre tanto cuando se ejecuta como un Usuario limitado (como se esperaría) como también cuando se ejecuta explícitamente como Administrador (clic derecho →Ejecutar como administrador y cuando se ejecuta desde un símbolo del sistema de nivel de administrador).

Sin embargo, este problema ha sido irreproducible para mí en mi entorno de prueba. He presenciado el problema de primera mano, así que confío en que el problema existe. La única diferencia que puedo discernir entre el entorno real y mi entorno de prueba es que elreal se produce un error al usar una cuenta de administrador de dominio en el indicador de UAC, mientras que mis pruebas (que funcionan sin errores) usan una cuenta de administrador local en el indicador de UAC.

Parece que aunque las credenciales que se utilizan permiten a UAC 'ejecutarse como administrador', el proceso aún no obtiene los derechos correctos para poderOpenProcess en otro proceso No estoy lo suficientemente familiarizado con los aspectos internos de Vista / Windows 7 para saber cuál podría ser, y espero que alguien tenga una idea de cuál podría ser la causa.

El pateador

La persona que ha informado este error, y el entorno de quién puede reproducir este error regularmente, tiene una pequeña aplicación llamada a lo largo de las líneas deRunWithDebugEnabled que es un pequeño programa de arranque que parece escalar sus propios privilegios y luego lanzar el ejecutable que se le pasa (heredando así los privilegios escalados). Cuando se ejecuta con este programa, utilizando las mismas credenciales de administrador de dominio en el indicador de UAC, el programa funciona correctamente y puede llamar con éxitoOpenProcess y opera según lo previsto.

Por lo tanto, este es definitivamente un problema con la adquisición de los privilegios correctos, y se sabe que la cuenta de administrador de dominioes una cuenta de administrador que debería poder acceder a los derechos correctos. (Obviamente, obtener este código fuente sería genial, pero no estaría aquí si fuera posible).

Notas

Como se señaló, los errores informados por el errorOpenProcess los intentos sonAccess Denied. De acuerdo con la documentación de MSDN deOpenProcess:

Si la persona que llama ha habilitado el privilegio SeDebugPrivilege, el acceso solicitado se otorga independientemente del contenido del descriptor de seguridad.

Esto me lleva a creer que quizás haya un problema en estas condiciones, ya sea con (1) ObtenciónSeDebugPrivileges o (2) Requerir otros privilegios que no se han mencionado en ninguna documentación de MSDN y que pueden diferir entre una cuenta de Administrador de dominio y una cuenta de Administrador local

Código de muestra:
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
   /////////////////////////////////////////////////////////
}




¡Gracias!

Si alguien tiene alguna idea de los posibles permisos, privilegios, derechos, etc., que me puede faltar para abrir correctamente otro proceso (suponiendo que el ejecutable se haya ejecutado correctamente "Ejecutar como administrador" ed) en Windows Vista y Windows 7 en las condiciones anteriores , sería muy apreciado

No estaría aquí si no estuviera absolutamente perplejo, pero espero que una vez más la experiencia y el conocimiento del grupo brillen. Le agradezco por tomarse el tiempo de leer este muro de texto. Solo se agradecen las buenas intenciones, ¡gracias por ser el tipo de persona que hace que Stack Overflow sea tan útil para todos!

Respuestas a la pregunta(1)

Su respuesta a la pregunta