Alles, was ich über die Eskalation zu den entsprechenden Privilegien für meine Bedürfnisse finden konnte, stimmt mit meinen derzeitigen Methoden überein, aber das Problem besteht. Ich hoffe, vielleicht hat jemand einige interne Erfahrungen mit Windows Vista / Windows 7 gemacht, die etwas Licht ins Dunkel bringen könnten, wo nur Dunkelheit ist. Ich bin sicher, das wird lang, aber bitte haben Sie Geduld.
Kontext
Ich arbeite an einer Anwendung, die den Zugriff auf den Speicher anderer Prozesse auf dem aktuellen Computer erfordert. Dies erfordert natürlich Administratorrechte. Es erfordert auch SeDebugPrivilege
(Nein, es ist kein Schreibfehler von SetDebugPrivilege
). Code hat bisher erfolgreich auf allen Versionen von Windows XP und auf meinen Testumgebungen mit Vista 32 Bit und Windows 7 64 Bit funktioniert.
Verfahren
- Programm wird Stets mit Administratorrechten ausgeführt werden. Davon kann in diesem Beitrag ausgegangen werden.
- Eskalieren des aktuellen Prozesses
Access Token
einschließenSeDebugPrivilege
Rechte. - Verwenden von
EnumProcesses
um eine Liste der aktuellen PIDs auf dem System zu erstellen - Öffnen eines Griffs mit
OpenProcess
mitPROCESS_ALL_ACCESS
Zugangsrechte - Verwenden von
ReadProcessMemory
um den Speicher des anderen Prozesses auszulesen.
Problem:
Während der Entwicklung und meiner persönlichen Tests hat alles gut funktioniert (einschließlich Windows XP 32 & 64, Windows Vista 32 und Windows 7 x64). Während einer Testbereitstellung auf Windows Vista (32-Bit) und Windows 7 (64-Bit) Computern eines Kollegen scheint es jedoch ein Berechtigungs-/Rechteproblem mit . zu geben OpenProcess
scheitern mit einem generischen Access Denied
Error. Dies tritt sowohl bei der Ausführung als eingeschränkter Benutzer (wie zu erwarten) als auch bei der Ausführung explizit als Administrator (Rechtsklick → Als Administrator ausführen und bei Ausführung über eine Eingabeaufforderung auf Administratorebene).
Dieses Problem war jedoch für mich in meiner Testumgebung nicht reproduzierbar. Ich habe das Problem aus erster Hand erlebt, daher vertraue ich darauf, dass das Problem existiert. Der einzige Unterschied, den ich zwischen der tatsächlichen Umgebung und meiner Testumgebung feststellen kann, ist, dass die tatsächlich Fehler tritt auf, wenn ein Domänenadministratorkonto an der UAC-Eingabeaufforderung verwendet wird, während meine Tests (die ohne Fehler funktionieren) ein lokales Administratorkonto an der UAC-Eingabeaufforderung verwenden.
Es scheint, dass, obwohl die verwendeten Anmeldeinformationen es UAC ermöglichen, als Administrator ausgeführt zu werden, der Prozess immer noch nicht die richtigen Rechte erhält, um in der Lage zu sein OpenProcess
auf einen anderen Prozess. Ich bin mit den Interna von Vista/Windows 7 nicht vertraut genug, um zu wissen, was dies sein könnte, und ich hoffe, jemand hat eine Idee, was die Ursache sein könnte.
Der Kicker
Die Person, die diesen Fehler gemeldet hat und deren Umgebung diesen Fehler regelmäßig reproduzieren kann, hat eine kleine Anwendung namens RunWithDebugEnabled
Dabei handelt es sich um ein kleines Bootstrap-Programm, das anscheinend seine eigenen Berechtigungen erweitert und dann die an es übergebene ausführbare Datei startet (und somit die erweiterten Berechtigungen erbt). Wenn dieses Programm mit denselben Domänenadministrator-Anmeldeinformationen an der UAC-Eingabeaufforderung ausgeführt wird, funktioniert das Programm ordnungsgemäß und kann erfolgreich aufgerufen werden OpenProcess
und funktioniert wie vorgesehen.
Dies ist also definitiv ein Problem beim Erwerb der richtigen Berechtigungen, und es ist bekannt, dass das Domänenadministratorkonto ist ein Administratorkonto, das in der Lage sein sollte, auf die richtigen Rechte zuzugreifen. (Natürlich wäre es großartig, diesen Quellcode zu erhalten, aber ich wäre nicht hier, wenn das möglich wäre).
Anmerkungen
Wie bereits erwähnt, sind die von der fehlgeschlagenen gemeldeten Fehler OpenProcess
Versuche sind Access Denied
. Laut MSDN-Dokumentation von OpenProcess
:
Wenn der Aufrufer das Privileg SeDebugPrivilege aktiviert hat, wird der angeforderte Zugriff unabhängig vom Inhalt der Sicherheitsbeschreibung gewährt.
Dies führt mich zu der Annahme, dass es unter diesen Bedingungen vielleicht ein Problem gibt, entweder mit (1) Erhalten SeDebugPrivileges
oder (2) Erfordern anderer Berechtigungen, die in keiner MSDN-Dokumentation erwähnt wurden und die sich zwischen einem Domänenadministratorkonto und einem lokalen Administratorkonto unterscheiden können
Beispielcode:
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
/////////////////////////////////////////////////////////
}
Danke!
Wenn jemand einen Einblick in die möglichen Berechtigungen, Privilegien, Rechte usw. hat, die mir möglicherweise fehlen, um einen anderen Prozess korrekt zu öffnen (vorausgesetzt, die ausführbare Datei wurde ordnungsgemäß mit “Als Administrator ausführen” ausgeführt) unter Windows Vista und Windows 7 unter den oben genannten Bedingungen , wäre sehr dankbar.
Ich wäre nicht hier, wenn ich nicht völlig ratlos wäre, aber ich hoffe, dass die Erfahrung und das Wissen der Gruppe noch einmal hell erstrahlen. Ich danke Ihnen, dass Sie sich die Zeit genommen haben, diese Textwand zu lesen. Allein die guten Absichten werden geschätzt, danke, dass Sie die Art von Person sind, die Stack Overflow für alle so nützlich macht!
Okay jetzt das ist eine Frage.
– CMircea
28. Mai ’10 um 21:01
Wenn Sie nur aus dem Prozessspeicher lesen möchten, können Sie wahrscheinlich nach einem bestimmten Recht fragen und nicht nur nach PROCESS_ALL_ACCESS (ich weiß, dass dies nicht der Sinn der Frage ist)
– Anders
29. Mai ’10 um 19:55
@Anders Laut MSDN,
OpenProcess
sollte unabhängig vom angeforderten Zugriff funktionieren, wenn der BasisprozessSeDebugPrivilege
aktiviert. Um dies auf den notwendigen Zugriff zu reduzierenPROCESS_VM_READ
würde noch brauchenSeDebugPrivilege
funktionieren, daher bin ich mir nicht sicher, ob das Ergebnis anders ausfallen würde (es sei denn, die MSDN-Dokumentation ist falsch, was nicht unmöglich ist).– KevenK
29. Mai ’10 um 20:50
Welche Prozesse können Sie nicht öffnen? Viele Sicherheitssoftware verwenden Kernel-Modus-Hooks, um den Zugriff auf ihre Prozesse zu blockieren. Wenn das nicht der Fall ist, ist vielleicht etwas mit den SIDs in den Token der Problemprozesse herum. Sie müssen Process Explorer auf einem problematischen Computer ausführen, um einige Antworten zu erhalten.
– Lukas
29. Mai ’10 um 22:47
Ist AdjustTokenPrivileges erfolgreich? Wenn dies der Fall ist, müssen Sie GetLastError immer noch untersuchen, da es ERROR_NOT_ALL_ASSIGNED zurückgeben kann. In diesem Fall ist SeDebugPrivilege aus irgendeinem Grund nicht im Prozesstoken vorhanden. Machen Sie in diesem Code einen Identitätswechsel? Stellen Sie sicher, dass der Gruppe Administratoren die Debug-Berechtigung in der lokalen Sicherheitsrichtlinie erteilt wird (dies ist die Standardeinstellung).
– Lukas
30. Mai ’10 um 1:11