Domanda

Tutto quello che ho potuto trovare su escalation di privilegi appropriati per le mie esigenze ha concordato con i miei metodi attuali, ma il problema esiste. Sto sperando che forse qualcuno ha qualche Windows Vista / Windows 7 interni esperienza che potrebbero brillare po 'di luce dove c'è solo il buio. Sono sicuro che questo sarà arrivare a lungo, ma si prega di portare con me.

Contesto

Sto lavorando a un'applicazione che richiede l'accesso alla memoria di altri processi sul computer corrente. Questo, ovviamente, richiede diritti di amministratore. Si richiede inoltre SeDebugPrivilege (no, non è un errore ortografico di SetDebugPrivilege), che credo a me stesso di essere acquisendo in modo corretto, anche se mi domanda se più privilegi non sono necessari e, quindi, la causa dei miei problemi. Codice finora ha lavorato con successo su tutte le versioni di Windows XP, e la mia prova 7 a 64 bit ambienti di Vista a 32 bit e Windows.

Processo

  • programma sarà sempre essere eseguito con i diritti di amministratore. Questo può essere assunto durante questo post.
  • Escalation Access Token del processo corrente per includere i diritti SeDebugPrivilege.
  • Utilizzo EnumProcesses per creare una lista di PID attuali sul sistema
  • L'apertura di un manico utilizzando OpenProcess con diritti di accesso PROCESS_ALL_ACCESS
  • Utilizzo ReadProcessMemory di leggere la memoria dell'altro processo.

Problema:

Tutto è stato lavorando bene durante lo sviluppo e la mia prova personale (incluso Windows XP 32 e 64, Windows Vista 32 e Windows 7 x64). Tuttavia, nel corso di una distribuzione di prova su entrambi Windows Vista (32-bit) e Windows 7 (64-bit) macchine di un collega, sembra che ci sia un problema di privilegi / diritti con OpenProcess in mancanza con un errore Access Denied generico. Ciò si verifica sia quando si esegue come utente limitato (come ci si aspetterebbe) e anche quando viene eseguito in modo esplicito come amministratore (tasto destro del mouse ? Esegui come amministratore e quando viene eseguito da un comando di livello amministratore pronta).

Tuttavia, questo problema è stato irriproducibile per me nel mio ambiente di prova. Ho assistito alla prima mano problema, quindi ho fiducia che il problema esiste. L'unica differenza che posso discernere tra l'ambiente reale e il mio ambiente di test è che il reale errore si verifica quando si utilizza un account di amministratore di dominio al prompt UAC, mentre i miei test (che funzionano senza errori) utilizzare un account di amministratore locale al prompt UAC.

Sembra che, anche se le credenziali in uso permettono UAC a 'Esegui come amministratore', il processo non è ancora ottenere i diritti corretti per essere in grado di OpenProcess in un altro processo. Io sono abbastanza non hanno familiarità con la struttura interna di Vista / Windows 7 per sapere cosa questo potrebbe essere, e sto sperando che qualcuno ha un'idea di quello che potrebbe essere la causa.

Il Kicker

La persona che ha segnalato questo errore, e chi è l'ambiente in grado di riprodurre con regolarità questo bug, ha una piccola applicazione chiamata lungo le linee di RunWithDebugEnabled che è un piccolo programma di bootstrap che sembra intensificare i propri privilegi e poi lanciare l'eseguibile passato a esso (ereditando così i privilegi aggiuntivi). Quando viene eseguito con questo programma, utilizzando le stesse credenziali di dominio di amministratore a UAC prompt, il programma funziona correttamente ed è in grado di chiamare con successo OpenProcess e funziona come previsto.

Quindi questo è sicuramente un problema con l'acquisizione dei privilegi corretti,ed è noto che l'account Amministratore di dominio è un account amministratore che dovrebbe essere in grado di accedere ai diritti corretti. (Ottenendo Ovviamente questo codice sorgente sarebbe grande, ma io non sarei qui se ciò fosse possibile).

Note

Come osservato, gli errori segnalati dal fallito OpenProcess tentativi sono Access Denied. Secondo MSDN la documentazione di OpenProcess :

  

Se il chiamante ha abilitato il privilegio SeDebugPrivilege, l'accesso richiesto è concesso a prescindere dal contenuto del descrittore di sicurezza.

Questo mi porta a credere che forse c'è un problema in queste condizioni sia con (1) Ottenere SeDebugPrivileges o (2) La richiesta di altri privilegi che non sono stati menzionati nella documentazione MSDN, e che potrebbe differire tra un account di dominio Administrator e un account di amministratore locale

Esempio di codice:

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
   /////////////////////////////////////////////////////////
}



Grazie!

Se qualcuno ha una certa comprensione in quanto eventuali permessi, privilegi, diritti, ecc che io possa mancare di aprire correttamente un altro processo (supponendo che l'eseguibile è stato correttamente "Esegui come amministratore" ndr) su Windows Vista e Windows 7 sotto le condizioni di cui sopra, sarebbe più molto apprezzato.

Non sarei qui se non fossi assolutamente perplesso, ma sono fiducioso che ancora una volta, l'esperienza e la conoscenza del gruppo brilla. Vi ringrazio per aver trovato il tempo di leggere questo muro di testo. Le sole buone intenzioni sono apprezzati, grazie per essere il tipo di persona che fa Stack Overflow in modo utile a tutti!

È stato utile?

Soluzione

Così, dopo un sacco di debug e fastidio un sacco di gente per informazioni, sono stato finalmente in grado di rintracciare il ragazzo che ha scritto l'applicazione RunWithDebugEnabled e ottenere una carrellata di come funziona.

Il problema, in questo caso, è che il privilegio Debug programs nella politica locale per l'amministratore del dominio era stato rimosso, e quindi la SeDebugPrivilege pedina non era presente nel token di accesso processo. Essa non può essere attivata se non è presente a tutto, e ho ancora conosco nessun modo per aggiungere il privilegio di un token di accesso esistente.


Come funziona la magia attuali:
Quindi l'applicazione magica RunWithDebugEnabled avrebbe usato i suoi diritti di amministratore per installarsi come un servizio e iniziare a se stesso, in esecuzione quindi sotto l'utente SYSTEM conto piuttosto che il dominio di amministratore. Con privilegi SYSTEM, l'applicazione crea un nuovo token di accesso che è identico al token amministratore, solo con il SeDebugPrivilege presente token. Questo nuovo token viene utilizzato per CreateProcessAsUser() ed eseguire il programma con la nuova SeDebugPrivilege abilitato che mancava prima.

Io in realtà non mi piace questa "soluzione" qui, e hanno continuato la mia ricerca di un modo 'pulito' per ottenere questo privilegio. Sarò distacco questo come un'altra domanda qui su SO, che cercherò di ricordarsi di collegare qui anche per aiutare gli altri seguano lungo e per riferimento futuro.

Modifica Rappresenta SYSTEM (o equivalente) da Administrator Account


Vi ringrazio tutti per il vostro tempo ed energie per aiutare a eseguire il debug e risolvere questo problema. In realtà è molto apprezzato!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top