Merkwürdiges Problem mit Handle
-
Hi leutz!
Wie der Titel schon sagt, habe ich ein Problem an ein handle zu kommen.
Hier ein bisschen Code von meiner CProcess Klasse:CProcess.H
class CProcess { public: void SetProcessData(LPCTSTR ProzessKlassenName, LPCTSTR ProzessFensterName); private: HWND GetHwnd(LPCTSTR lpClassName, LPCTSTR lpWindowName); DWORD GetPID(HWND hWnd); HANDLE GetHANDLE(); HWND hWnd; DWORD PID; HANDLE hProc; };
CProcess.cpp
void CProcess::SetProcessData(LPCTSTR ProzessKlassenName, LPCTSTR ProzessFensterName) { hWnd = GetHwnd(ProzessKlassenName, ProzessFensterName); PID = GetPID(hWnd); hProc = GetHANDLE(); } HWND CProcess::GetHwnd(LPCTSTR lpClassName, LPCTSTR lpWindowName) { return FindWindow(lpClassName, lpWindowName); } DWORD CProcess::GetPID(HWND hWnd) { DWORD Temp; GetWindowThreadProcessId(hWnd, &Temp); return Temp; } HANDLE CProcess::GetHANDLE() { return OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); }
In der Funktion GetHANDLE bekomme ich aber kein richtiges Handle zurück!
Ich bekommt zwar eins, aber es scheint ungültig zu sein, das es auch beim Neustarten der Zielanwendung immer gleich ist.
Ich bekomme nichtmal eine fehlermeldung, außer wenn ich mit WriteProcessMemory darauf zugreifen will, weil das handle ja anscheind ungültig ist.Ich kann mir einfach nicht erklären, was ich falsch gemacht habe.
Wisst ihr einen rat? Danke im Vorraus
-
Warum nimmst Du PROCESS_ALL_ACCESS, nur um den Handle zu erfragen?
Da würde doch PROCESS_QUERY_INFORMATION sicherlich auch ausreichen, oder?
Problem mit PROCESS_ALL_ACCESS ist, das es schiefläuft, wenn Du keinen Zugriff für ALLE Operationen (create, read, write, terminate usw.) mit diesem Prozess hast! Gehen wir mal davon aus Du dürftest NUR lesend auf den Prozess zugreifen... dann geht PROCESS_ALL_ACCESS schief, weil es auch WRITE, CREATE, TERMINATE usw. enthält, wofür Du evtl. gar keine Erlaubnis hast!
PROCESS_QUERY_INFORMATION geht nur schief, wenn Du nicht mal Infos abholen darfst... da ist es egal ob Du den Prozess terminieren darfst, oder?
In diesem Falle ist weniger oft mehr... auch wenn PROCESS_ALL_ACCESS bequemer ist...
-
also ich möchte anschließend mit WriteProcessMemory den Speicher des Programms manipulieren. Da brauche ich doch all_acces oder?
-
Wieso? PROCESS_VM_WRITE sollte da doch reichen :p
Required to write to memory in a process using WriteProcessMemory.
-
Wie gesagt, PROCESS_ALL_ACCESS beinhaltet ALLES, nicht weniger! Es geht schief, wenn Du den Prozess nicht terminieren darfst, aber alles andere dürfen würdest! Das reicht schon, um den Zugriff mit PROCESS_ALL_ACCESS zu verhindern!
PROCESS_ALL_ACCESS heißt:
Ich will ALLES mit diesem Prozess machen! Das Du letztendlich nur auf den Speicherbereich zugreifen willst, verschweigst Du...OS schaut nach, stellt fest, das Du nur bestimmte Sachen darfst...
Also antwortet es: DARFST DU ABER NICHT ALLES MACHEN!...und schon ist der Handle ungültig...
PROCESS_QUERY_INFORMATION | PROCESS_VM_WRITE
oder aber wie flenders schreibt:
PROCESS_VM_WRITE alleine reicht schon aus....Also:
Sag dem Betriebssystem, WAS GENAU Du machen willst (und NUR das), dann wird das sicherlich funktionieren (sofern Du halt die notwendigen Rechte hast).
-
ich habe es jetzt mal mit PROCESS_VM_WRITE und diesem Querry versucht, aber erhalte immernoch den selben handle
Habe ich vielleicht irgendwas bei der Klasse falsch gemacht? Also ich habe sowas ja schonmal gemacht und da hat es auch geklappt nur komischerweise gehts hier aufeinmal nichtmehr, seitdem ich es in eine Klasse verpackt hab, damit ich nicht jedesmal aus dem Hauptprogramm die ganzen befehle aufrufen muss. mhh
-
Liefern denn GetHwnd und GetPID gültige Werte zurück? Außerdem: wie greifst du überhaupt mit WriteProcessMemory auf das Handle zu, wenn hProc doch private ist
-
GetPID liefert einen korrekten wert zurück (Hab ich mit Spy++ überprüft) demnach müsste der Hwnd wert auch korrekt sein. Das ist das was mich so verwundert.
WriteMemory gehört zu der Klasse und deshalb kann ich problemlos auf hproc zugreifen.
-
Ich habe mich natürlich auch erstmal von PROCESS_ALL_ACCESS blenden lassen. Aber bitte was bekommst Du von OpenProcess geliefert? Wenn da ein Wert != NULL zurückkommt, ist es gültig. Punkt.
Oder überschreibst du das Handle an einer anderen Stelle versehentlich mit etwas unsinnigem? Schau Dir bitte an, was OpenProcess zurückgibt. Dann schaust Du Dir an, ob hProc beim Schreibzugriff noch immer den gleichen Wert hat.
Was geht denn überhaupt schief beim Schreiben? Gibt es dazu auch einen Fehlercode? Hast Du das mal mit VirtualQueryEx geschaut, ob Du überhaupt in den gewünschten Bereich schreiben darfst?
-
Ich habe ja den debugger rüberlaufen lassen. OpenProcess schmeißt mir jedesmal 0x000000f8 zurück, selbst wenn ich die ziel anwendung neugestartet hab. Die PID und das hWnd sind korrekt. Komischerweise bekomme ich beim OpenProcess trotzdem immer einen falschen wert zurück, ich versteh das einfach nicht. Ich sitze hier schon seit Stunden und suche vergeblich nach einem fehler den ich gemacht haben könnte... Ich komme einfach zu keinem ergebnis
hier nocheinmal ein link zu meiner Klasse:
http://mandrill.fuxx0r.net/c++/paste.php?p=1173
-
0x000000f8 ist ein gültiges Handle. Das Handle ist sowieso nur ein Index in die Process eigene Handle-Table. Da Du jedesmal gleich viel Handles belegst, wirst Du auch jedesmal den gleichen Wert zurückbekommen. Das ist nicht ungewöhnlich. Aber was ist jetzt das Problem?
-
WriteProcessMemory bricht beim schreiben ab!
GetLastError() schmeißt mir den wert 299 zurück. Der bedeutet:
"Nur ein Teil der ReadProcessMemory- oder WriteProcessMemory-Anforderung wurde abgeschlossen."Was auch immer das heißen mag...
Ich rufe die WriteProcessMemory funktion aus meiner Klasse herraus auf.
Der übergebene wert hProc wird richtig übergeben.
Irgendwie will er aber trotzdem nicht in den Speicher schreiben.Hier meine WriteMemory funtion:
bool CProcess::WriteMemory(long BaseAdress, long Buffer) { if(WriteProcessMemory(hProc, (void*)BaseAdress, (void*)Buffer, 1, NULL)) return true; else return false; }
-
-King- schrieb:
Hast Du das mal mit VirtualQueryEx geschaut, ob Du überhaupt in den gewünschten Bereich schreiben darfst?
-
also 1 Byte um einen LONG Wert zu schreiben ist ein bißchen zu klein
-
außerdem:
lpBuffer
[in] Pointer to the buffer that contains data to be written into the address space of the specified process.sollte heißen:
DWORD dwAdress, dwBuffer = 123456; WriteProcessMemory(hProcess,reinterpret_cast<LPVOID>(dwAdress),&dwBuffer,sizeof(DWORD),0);
-
lol!
Ich Idiot!Endlich! Es Funktioniert!!!!
DANKE DANKE DANKE!!!!!!!!
-
na penner, es geht doch.