Entwickler-Ecke

Windows API - ReadProcessMemory und PlainText


einbrecher2007 - Di 15.12.09 17:38
Titel: ReadProcessMemory und PlainText
Hi,

Ich benutze folgendermaßen ReadProcessMemory:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var
   Buffer : Array[0..512Of Char;
   N : DWORD;
   result : String;
begin
   ReadProcessMemory(ProgramToRead,
   Ptr(0),
   @Buffer,
   512,
   N);
   Buffer[512] := #0;
   Memo1.Text := StrPas(Buffer);
end;


Leider kriege ich in dem Memo nur soclhe Zeichen angezeigt:

|€/ƒ|ÿÿÿÿy/ƒ|ÿq%u
r%u˜ô

Kann ich das Memory nicht irgendwie als PlainText anzeigen lassen?
Oder wie kriege ich den Speicher des Programms brauchbar ausgelesen?

mfg


Gausi - Di 15.12.09 18:26

Naja, wenn an der Stelle im Speicher nunmal kein Text steht, sondern ein Bild, ein Integer, ein sonstwas - was willst du denn dann anzeigen? Einzig sinnvoll wäre dann eine Anzeige der Bytes im Hexadezimal-Format, wie man es von einem Hex-Editor her kennt.


einbrecher2007 - Di 15.12.09 23:46

Habe es jetzt folgendermaßen hinbekommen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button2Click(Sender: TObject);
var
  lBuf: string;
  lRead,c : Cardinal;
begin
C := wndMain;
  GetWindowThreadProcessId(c, @c); //Get ProcessID and ignore ThreadID
  c := OpenProcess(PROCESS_ALL_ACCESS, False, c);  //Get ProcessHandle
  SetLength(lBuf, 16);
  ReadProcessMemory(c, Ptr($11546A64), @lBuf[1], 16, lRead);
  Memo1.Text := lBuf;
  CloseHandle(c);
  end;


Leider bekomme ich immer nur ein einziges Zeichen ausgegeben.
Wenn ich dann auf $11546A66 lese krieg ich auch das 2. und
auf $11546A68 das dritte usw... Kann man das nicht alles mit einem Mal auslesen?


Gausi - Mi 16.12.09 08:45

Da würde ich vermuten, dass der String als WideString im Speicher vorliegt. Wenn der String aus "normalen Zeichen" betsteht, ist dabei jedes zweite Byte 0.


SAiBOT - Mi 16.12.09 09:02

Noch dazu würde ich vermuten, deine IDE-Version liegt unter 2009. :wink:


einbrecher2007 - Mi 16.12.09 09:51

Vielen Dank!

Funktioniert jetzt wunderbar, nachdem ich lBuf als WideString definiert habe =)


Weiß nicht, ob ich dafür extra nen Thread eröffnen sollte, aber:

Kennt sich jemand mit der Funktion CreateToolHelp32SnapShot aus?

Wie kann ich damit die Startadresse eines bestimmten Prozesses/Fensters im Speicher rausfinden?


BenBE - Di 22.12.09 13:43

Dazu gibt's hier im Forum ne ganze Menge Threads. Einfach die zurückgelieferten Strukturen auswerten.