Windows Vista / Windows 7-Berechtigung: SeDebugPrivilege & OpenProcess
Alles, was ich über die Eskalation zu den für meine Bedürfnisse geeigneten Berechtigungen finden konnte, ist mit meinen aktuellen Methoden einverstanden, aber das Problem besteht. Ich hoffe, vielleicht hat jemand einige Windows Vista / Windows 7-interne Erfahrungen, die etwas Licht scheinen könnten, wo es nur Dunkelheit gibt. Ich bin mir sicher, dass es noch lange dauern wird, aber bitte nehmen Sie es mit mir.
Kontex 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 auchSeDebugPrivilege
(nein, es ist kein Rechtschreibfehler vonSetDebugPrivilege
), von dem ich glaube, dass ich es richtig erwerbe, obwohl ich frage, ob keine weiteren Berechtigungen erforderlich sind und damit die Ursache für meine Probleme. Code hat bisher auf allen Versionen von Windows XP und in meinen Testumgebungen mit Vista 32 Bit und Windows 7 64 Bit erfolgreich funktioniert.
Access Token
einschließenSeDebugPrivilege
rights.UsingEnumProcesses
, um eine Liste der aktuellen PIDs auf dem System zu erstellen.Öffnen eines Handles mitOpenProcess
mitPROCESS_ALL_ACCESS
ZugangsrechtUsingReadProcessMemory
, um den Speicher des anderen Prozesses zu lesen.ProblemAlles hat während der Entwicklung und meiner persönlichen Tests (einschließlich Windows XP 32 und 64, Windows Vista 32 und Windows 7 x64) einwandfrei funktioniert. Während einer Testbereitstellung auf Windows Vista (32-Bit) - und Windows 7 (64-Bit) -Maschinen eines Kollegen scheint jedoch ein Berechtigungs- / Rechteproblem mit @ zu besteheOpenProcess
Scheitern mit einem generischenAccess Denied
Error. Dies tritt sowohl bei Ausführung als eingeschränkter Benutzer (wie zu erwarten) als auch bei expliziter Ausführung als Administrator auf (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 miterlebt und vertraue darauf, dass das Problem besteht. Der einzige Unterschied, den ich zwischen der tatsächlichen Umgebung und meiner Testumgebung feststellen kann, ist, dass dastatsächlic Fehler tritt auf, wenn ein Domänenadministratorkonto an der UAC-Eingabeaufforderung verwendet wird, während meine Tests (die fehlerfrei funktionieren) ein lokales Administratorkonto an der UAC-Eingabeaufforderung verwenden.
Obwohl die verwendeten Anmeldeinformationen es der Benutzerkontensteuerung ermöglichen, als Administrator ausgeführt zu werden, erhält der Prozess immer noch nicht die richtigen Rechte, um @ zu könneOpenProcess
auf einem anderen Prozess. Ich kenne die Interna von Vista / Windows 7 nicht gut genug, um zu wissen, woran das liegen könnte, und ich hoffe, dass jemand eine Idee hat, woran das liegen könnte.
Die Person, die diesen Fehler gemeldet hat und deren Umgebung diesen Fehler regelmäßig reproduzieren kann, hat eine kleine Anwendung mit dem NamenRunWithDebugEnabled
ist ein kleines Bootstrap-Programm, das anscheinend seine eigenen Berechtigungen eskaliert und dann die übergebene ausführbare Datei startet (wodurch die eskalierten Berechtigungen übernommen werden). Wenn das Programm mit diesem Programm ausgeführt wird und an der UAC-Eingabeaufforderung dieselben Domänenadministrator-Anmeldeinformationen verwendet, funktioniert es ordnungsgemäß und kann erfolgreich @ aufrufeOpenProcess
und funktioniert wie vorgesehen.
So ist dies definitiv ein Problem beim Erwerb der richtigen Berechtigungen, und es ist bekannt, dass das Domänenadministratorkonto ist ein Administratorkonto, das auf die richtigen Rechte zugreifen kann. (Offensichtlich wäre es toll, diesen Quellcode zu erhalten, aber ich wäre nicht hier, wenn das möglich wäre.)
Anmerkungeie bereits erwähnt, werden die Fehler durch das fehlgeschlagene @ gemeldeOpenProcess
Versuche sindAccess Denied
. Laut MSDN-Dokumentation vonOpenProcess
:
Wenn der Aufrufer das SeDebugPrivilege-Privileg aktiviert hat, wird der angeforderte Zugriff unabhängig vom Inhalt der Sicherheitsbeschreibung gewährt.
Dies lässt mich glauben, dass es unter diesen Bedingungen möglicherweise ein Problem gibt, entweder mit (1) Erhalten vonSeDebugPrivileges
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.
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
/////////////////////////////////////////////////////////
}
Vielen Dank
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 unter Windows Vista und Windows 7 ordnungsgemäß als Administrator ausgeführt) Bedingungen, es wäre sehr dankbar.
Ich wäre nicht hier, wenn ich nicht absolut verblüfft wäre, aber ich hoffe, dass die Erfahrung und das Wissen der Gruppe wieder einmal hell erstrahlen. Ich danke Ihnen, dass Sie sich die Zeit genommen haben, diese Textwand zu lesen. Alleine die guten Absichten werden geschätzt, danke, dass Sie der Typ sind, der Stack Overflow für alle so nützlich macht!