Pregunta

Todo lo que he podido encontrar sobre la escalada de los privilegios adecuados para mis necesidades ha acordado con mis métodos actuales, pero existe el problema. Estoy esperando que tal vez alguien tiene alguna Vista / Windows 7 internos experiencia de Windows que podría brillar un poco de luz donde sólo hay oscuridad. Estoy seguro de que esto va a hacer larga, pero por favor tengan paciencia conmigo.

Contexto

Estoy trabajando en una aplicación que requiera el acceso a la memoria de otros procesos en el equipo actual. Esto, obviamente, requiere derechos de administrador. También requiere SeDebugPrivilege (no, no es un error ortográfico de SetDebugPrivilege), que creo que a mí mismo para ir adquiriendo correctamente, aunque me pregunta si hay más privilegios que no son necesarios y por lo tanto la causa de mis problemas. hasta el momento código ha trabajado con éxito en todas las versiones de Windows XP y en mi examen 7 64 bits entornos de 32 bits de Vista y Windows.

Proceso

  • Programa Siempre puede ejecutar con derechos de administrador. Esto se puede suponer lo largo de este puesto.
  • La escalada de Access Token del proceso actual para incluir los derechos SeDebugPrivilege.
  • Uso EnumProcesses para crear una lista de PIDs actuales en el sistema
  • La apertura de un mango con OpenProcess con derechos de acceso PROCESS_ALL_ACCESS
  • Uso ReadProcessMemory para leer la memoria de otro proceso.

Problema:

Todo ha estado trabajando muy bien durante el desarrollo y mis pruebas personales (incluyendo Windows XP 32 y 64, Windows Vista 32 y Windows 7 x64). Sin embargo, durante un despliegue de prueba en Windows Vista (32 bits) y Windows 7 (64 bits) máquinas de un colega, parece que hay un problema de privilegio / derechos con OpenProcess fallar con un error Access Denied genérico. Esto ocurre tanto cuando se ejecuta como un usuario limitado (como era de esperar) y también cuando se ejecuta de forma explícita como administrador (botón derecho del ratón ? Ejecutar como administrador y cuando se ejecuta desde un comando de nivel de administrador del sistema).

Sin embargo, este problema ha sido irreproducible para mí en mi entorno de prueba. He sido testigo de primera mano el problema, por lo que confía en que el problema existe. La única diferencia que puedo discernir entre el entorno real y mi entorno de prueba es que el real de error está ocurriendo cuando se utiliza una cuenta de administrador de dominio en el mensaje de UAC, mientras que mis pruebas (que funcionan sin errores) utilizar una cuenta de administrador local en el mensaje de UAC.

Parece que a pesar de las credenciales que se utilizan permiten UAC a 'Ejecutar como administrador', el proceso todavía no es la obtención de los derechos correctos para poder OpenProcess en otro proceso. Soy lo suficientemente familiarizado con el funcionamiento interno de Vista / Windows 7 para saber lo que esto podría ser, y estoy esperando que alguien tiene una idea de lo que podría ser la causa.

El pateador

La persona que ha reportado este error, y quién ambiente pueden reproducirse regularmente este error, tiene una pequeña aplicación llamada en la línea de RunWithDebugEnabled que es un pequeño programa de arranque que aparece a escalar sus propios privilegios y luego lanzar el ejecutable pasado a que (heredando así los privilegios escalados). Cuando se ejecuta con este programa, utilizando las mismas credenciales de administrador de dominio en la UAC, el programa funciona correctamente y es capaz de llamar con éxito OpenProcess y opera como se pretendía.

Así que este es sin duda un problema con la adquisición de los privilegios correctos,y se sabe que la cuenta de administrador de dominio es una cuenta de administrador que debe ser capaz de acceder a los derechos correctos. (Obviamente obtener el código fuente sería grande, pero yo no estaría aquí si eso fuera posible).

Notas

Como se ha señalado, los errores reportados por la fallida intentos OpenProcess son Access Denied. De acuerdo con la documentación de MSDN de OpenProcess :

Si la persona que llama ha permitido el privilegio SeDebugPrivilege, se concede el acceso solicitado sin tener en cuenta el contenido del descriptor de seguridad.

Esto me lleva a pensar que tal vez no es un problema en estas condiciones, ya sea con (1) SeDebugPrivileges La obtención o (2) Exigir otros privilegios que no se han mencionado en la documentación de MSDN y que puede diferir entre una cuenta de administrador de dominio y una cuenta de administrador local

Ejemplo de código:

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 una idea de lo posibles permisos, privilegios, derechos, etc., que me puede faltar para abrir correctamente otro proceso (suponiendo que el ejecutable ha sido debidamente "Ejecutar como Administrador" ed) en Windows Vista y Windows 7 bajo las condiciones anteriores, sería lo más grandemente apreciado.

Yo no estaría aquí si no estaban sorprendidos, absolutamente, pero tengo la esperanza de que una vez más la experiencia y conocimiento del grupo brilla brillante. Os doy las gracias por tomarse el tiempo de leer este muro de texto. Las buenas intenciones por sí solas son apreciados, gracias por ser el tipo de persona que hace desbordamiento de la pila de manera útil para todos!

¿Fue útil?

Solución

Así que después de un montón de depuración y molestando a mucha gente para la información, que finalmente fue capaz de localizar a la persona que escribió la aplicación RunWithDebugEnabled y obtener un resumen de cómo funciona.

El problema, en este caso, es que el privilegio Debug programs en la política local para el administrador del dominio había sido eliminado, y por lo tanto la SeDebugPrivilege ficha no estaba presente en el token de acceso del proceso. No se puede activar si no está presente en todo, y todavía sabe de ninguna manera de agregar el privilegio de un token de acceso existente.


¿Cómo funciona la magia actuales:
Por lo que la aplicación de la magia RunWithDebugEnabled usaría sus derechos de administrador para instalar como un servicio y empezar a sí mismo, lo que se corre bajo el usuario SYSTEM cuentas en lugar del administrador de dominio. Con privilegios SYSTEM, la aplicación crea un nuevo token de acceso que es idéntica a la ficha Administrador, sólo con la SeDebugPrivilege presente ficha. Este nuevo token se utiliza para CreateProcessAsUser() y ejecutar el programa con el SeDebugPrivilege acaba de habilitar que faltaba antes.

En realidad, no me gusta esta "solución" aquí, y han continuado mi búsqueda de una manera 'limpia' para obtener este privilegio. Voy a publicar esto como otra pregunta aquí en SO, que voy a tratar de recordar para enlazar aquí también ayuda a otros a seguir adelante y para referencia futura.

EDIT: Impersonate sistema (o equivalente) de la cuenta del administrador


Muchas gracias a todos por su tiempo y energías en ayudar a depurar y solucionar este problema. Realmente es muy apreciada!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top