Privilégio do Windows Vista / Windows 7: SeDebugPrivilege e OpenProcess

Tudo o que consegui encontrar sobre a escalação para os privilégios apropriados para minhas necessidades concordou com meus métodos atuais, mas o problema existe. Espero que talvez alguém tenha alguma experiência interna com o Windows Vista / Windows 7 que possa brilhar um pouco onde há apenas escuridão. Tenho certeza que isso vai demorar, mas por favor, tenha paciência comigo.

Contexto

Estou trabalhando em um aplicativo que requer acesso à memória de outros processos na máquina atual. Obviamente, isso requer direitos de administrador. Também requerSeDebugPrivilege (não, não é um erro de ortografiaSetDebugPrivilege), que acredito estar adquirindo corretamente, embora questione se não são necessários mais privilégios e, portanto, a causa dos meus problemas. Até agora, o código funcionou com êxito em todas as versões do Windows XP e nos meus ambientes de teste Vista 32 bits e Windows 7 64 bits.

ProcessoO programaSempre ser executado com direitos de administrador. Isso pode ser assumido ao longo deste post.Escalando os processos atuaisAccess Token incluirSeDebugPrivilege direitos.UsandoEnumProcesses para criar uma lista de PIDs atuais no sistemaAbrir uma alça usandoOpenProcess comPROCESS_ALL_ACCESS direitos de acessoUsandoReadProcessMemory para ler a memória do outro processo.Problema:

Tudo funcionou bem durante o desenvolvimento e meus testes pessoais (incluindo Windows XP 32 e 64, Windows Vista 32 e Windows 7 x64). No entanto, durante uma implantação de teste nas máquinas Windows Vista (32 bits) e Windows 7 (64 bits) de um colega, parece haver um problema de privilégio / direitos comOpenProcess falhando com um genéricoAccess Denied erro. Isso ocorre tanto ao executar como um usuário limitado (como seria de se esperar) quanto ao executar explicitamente como administrador (clique com o botão direito do mouse em →Executar como administrador e quando executado a partir de um prompt de comando no nível do administrador).

No entanto, esse problema não foi reproduzível para mim no meu ambiente de teste. Testemunhei o problema em primeira mão, por isso confio que o problema existe. A única diferença que posso discernir entre o ambiente real e meu ambiente de teste é que oreal ocorre um erro ao usar uma conta de administrador de domínio no prompt do UAC, enquanto meus testes (que funcionam sem erros) usam uma conta de administrador local no prompt do UAC.

Parece que, embora as credenciais usadas permitam que o UAC seja 'executado como administrador', o processo ainda não está obtendo os direitos corretos para poderOpenProcess em outro processo. Não estou familiarizado o suficiente com os internos do Vista / Windows 7 para saber o que pode ser isso, e espero que alguém tenha uma idéia do que poderia ser a causa.

The Kicker

A pessoa que relatou esse erro e o ambiente em que é capaz de reproduzir esse erro regularmente, possui um pequeno aplicativo chamado ao longo das linhas deRunWithDebugEnabled que é um pequeno programa de autoinicialização que parece escalar seus próprios privilégios e, em seguida, iniciar o executável passado a ele (herdando os privilégios escalados). Quando executado com este programa, usando as mesmas credenciais de Administrador de Domínio no prompt do UAC, o programa funciona corretamente e pode chamar com êxitoOpenProcess e opera como pretendido.

Portanto, esse é definitivamente um problema com a aquisição dos privilégios corretos e é sabido que a conta do Administrador do Domínioé uma conta de administrador que deve poder acessar os direitos corretos. (Obviamente, obter esse código fonte seria ótimo, mas eu não estaria aqui se isso fosse possível).

Notas

Como observado, os erros relatados pela falhaOpenProcess tentativas sãoAccess Denied. De acordo com a documentação do MSDN deOpenProcess:

Se o chamador tiver ativado o privilégio SeDebugPrivilege, o acesso solicitado será concedido, independentemente do conteúdo do descritor de segurança.

Isso me leva a acreditar que talvez exista um problema nessas condições com (1) ObtençãoSeDebugPrivileges ou (2) Exigir outros privilégios que não foram mencionados em nenhuma documentação do MSDN e que podem diferir entre uma conta de Administrador de Domínio e uma conta de Administrador Local

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




Obrigado!

Se alguém tiver alguma ideia de quais permissões, privilégios, direitos, etc. possíveis, podem estar faltando para abrir outro processo corretamente (supondo que o executável tenha sido corretamente "Executar como Administrador") no Windows Vista e Windows 7 nas condições acima , seria muito apreciado.

Eu não estaria aqui se não estivesse absolutamente perplexo, mas espero que mais uma vez a experiência e o conhecimento do grupo brilhem. Agradeço-lhe por reservar um tempo para ler esta parede de texto. Apenas as boas intenções são apreciadas, obrigado por ser o tipo de pessoa que torna o Stack Overflow tão útil para todos!

questionAnswers(1)

yourAnswerToTheQuestion