![]() |
ReadProcessMemory -> Problem
Hi, ich hoffe ich bin hier in der richtigen Sektion :?
Also mein Problem ist, das ich bei Verwendung von ReadProcessMemory eine Exception bekomme.
Delphi-Quellcode:
so, also bei der Funktion "Readmemory" stürzt er ab. Warum?
var
ThreadID, ProcessID: Integer; WindowHWnd: HWnd; write: Cardinal; WindowHandle: THandle; P: PChar; //Variable für ReadProcessMemory ... Procedure OpenMemory; begin While WindowHWnd = 0 do begin WindowHWnd := FindWindow(nil, 'Spider Solitär'); //FensterHandle suchen sleep(100); end; ThreadID := GetWindowThreadProcessID(WindowHWnd, @ProcessID); //processID bestimmen WindowHandle := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID); //WindowHandle suchen Writeln('ThreadID: ' + IntToStr(ThreadID) + ' / ' + 'ProcessID: ' + IntToStr(ProcessID) + ' / ' + 'WindowHandle: ' + IntToStr(WindowHandle)); //sollte klar sein ;) end; Function ReadMemory: PChar; begin try //Speicher reservieren GetMem(p, SizeOf(P)); //Speicher auslesen --> Error ReadProcessMemory(WindowHandle, Ptr($01324480), @P, SizeOf(P), write); //Aus gelesener Wert befindet sich nun in P, oder? Result := P; //Speicher freigeben + Handle schließen finally FreeMem(P); CloseHandle(WindowHandle); end; begin OpenMemory; Writeln(ReadMemory); //--> geht nicht Readln; end. Mit WriteProcessMemory kann ich ohne Probleme arbeiten. Danke :wink: |
AW: ReadProcessMemory -> Problem
Zitat:
Sicher daß $01324480 stimmt? (Speicheradressen sind selten statisch) Zitat:
Ob was ausgelesen wurde erfährt man über das Result von ReadProcessMemory und wenn, dann das Wieviel über deine "write"-Variable. Und falls nichts ausgelesen wurde, dann bekommt man über GetLastError den Grund dafür. (daß auch ständig Leute das Result in die Fehlerbehandlung (GetLastError) bei den WinAPIs vergessen) Aber SizeOf(P) ließt nur genau 4 Byte und nicht einen ganzen Text. Und wenn nun innerhalb dieser 4 Byte kein #0, als Ende-Markierung vorkommt, dann geht der Zugriff als PChar schief, da das auslesen so lange ließt, bis es eine #0 findet und wenn dieses fehlt, dann knallt's. |
AW: ReadProcessMemory -> Problem
Kann ich nicht lesen. Die Konsole geht zu schnell zu. :(
Zitat:
Wie sähe denn die Zeile richtig aus, oder welchen Datentyp sollte ich dafür nehmen? Edit: Danke, es klappt. Habe nun Integer statt PChar verwendet |
AW: ReadProcessMemory -> Problem
Zitat:
Kennst du schon die F7-Taste und seine Freunde? |
AW: ReadProcessMemory -> Problem
Füge am Ende des Programm ein Readln ein. Dann musst du mit einem Tastendruck die Konsole schließen. Oder starte das Programm aus der Konsole.
Und es wird ein Zeiger auf einen Speicherbereich erwartet,m der natürlich groß genug sein muss. |
AW: ReadProcessMemory -> Problem
Zitat:
Sonst einfach mal ein try..except Block der die exception ausgibt |
AW: ReadProcessMemory -> Problem
Das haben die "neueren" Projektvorlagen zwar schon drin
und ein bissl abgewandelt, isses auch nutzbar. :angle:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} uses SysUtils; begin try { TODO -oEntwickler -cKonsole Main : Hier Code einfügen } except on E: Exception do begin WriteLn(E.ClassName, ': ', E.Message); ReadLn; end; end; end. Aund ansonsten kann dir keiner sagen wie das nun richtig ausgelesen wird, da wir noch nicht erfahren haben, was genau dort ausgelesen werden soll, bzw. in welchem Format diese Daten vorliegen. |
AW: ReadProcessMemory -> Problem
Seit wann werfen API-Funktionen Exceptions?
|
AW: ReadProcessMemory -> Problem
Wenn keine Exception geworfen wird, warum wird dann sein ReadLn am Ende nicht ausgeführt? :gruebel:
|
AW: ReadProcessMemory -> Problem
Es klappt nun.
Ich habe einfach PChar mit integer ausgetauscht. Quellcode, der jetzt geht:
Delphi-Quellcode:
program Tut;
{$APPTYPE CONSOLE} uses SysUtils, Windows; var ThreadID, ProcessID: Integer; WindowHWnd: HWnd; write: Cardinal; WindowHandle: THandle; P: Integer; //Variable für ReadProcessMemory Procedure OpenMemory; begin While WindowHWnd = 0 do begin WindowHWnd := FindWindow(nil, 'Spider Solitär'); sleep(100); end; ThreadID := GetWindowThreadProcessID(WindowHWnd, @ProcessID); WindowHandle := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID); Writeln('ThreadID: ' + IntToStr(ThreadID) + ' / ' + 'ProcessID: ' + IntToStr(ProcessID) + ' / ' + 'WindowHandle: ' + IntToStr(WindowHandle)); end; Function ReadMemory: Integer; var New: Integer; begin try ReadProcessMemory(WindowHandle, Ptr($04D4480), @P, SizeOf(P), write); New := P+$10; ReadProcessMemory(WindowHandle, Ptr(New), @P, SizeOf(P), write); New := P+$8c; ReadProcessMemory(WindowHandle, Ptr(New), @P, SizeOf(P), write); Result := P; finally CloseHandle(WindowHandle); end; end; begin OpenMemory; Writeln(ReadMemory); Readln; end. |
AW: ReadProcessMemory -> Problem
Es kommt eine Exception, aber anders als gedacht ;)
Die Procedere gibt ein PChar zurück und genau der Speicher auf den der Rückgabewert zeigt wird noch in der Procedere selber freigegeben
Delphi-Quellcode:
Das muss doch knallen
Result := P;
{...} FreeMem( P ); |
AW: ReadProcessMemory -> Problem
Zitat:
[edit] Joar, und dann noch das FreeMem. |
AW: ReadProcessMemory -> Problem
Zitat:
|
AW: ReadProcessMemory -> Problem
Zitat:
Delphi-Quellcode:
Function ReadMemory: PChar;
begin try GetMem(p, SizeOf(P)); ReadProcessMemory(WindowHandle, Ptr($01324480), @P, SizeOf(P), write); // so result zeigt jetzt auf die gleiche Adresse wie P Result := P; finally // Jetzt wird der Speicher an der Adresse P freigegeben // Wir erinnern uns, diese Adresse ist auch in Result gespeichert // Was können wir an dieser Adresse jetzt noch erwarten? // Richtig: Datenmüll FreeMem(P); CloseHandle(WindowHandle); end; begin OpenMemory; Writeln(ReadMemory); //--> geht nicht, logisch, weil unter Rückgabeadresse nix ist Readln; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz