Entwickler-Ecke

Windows API - ReadProcessMemory - Irgendwas läuft falsch


gissuf - Do 09.07.09 20:00
Titel: ReadProcessMemory - Irgendwas läuft falsch
Guten Tag

Ich habe mir ein Dummyprogramm geschrieben, mit dem ich ganz einfach 4 Verschiedene Zahlen in den Speicher schreibe.

Nun möchte ich mit dem 2ten Programm die erste Zahl auslesen.

Ich habe also mit TSearch nach der richtigen Adresse gesucht. "45ECC8" ist es.

Nun funktioniert das auslesen leider nicht, und ich weiss nicht warum.

Das Auslesen ist anscheinend erfolgreich, jedoch wird wohl das falsche ausgelesen.

Könnt ihr mir evtl. helfen?

Hier mein Souce:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm3.Button1Click(Sender: TObject);
var windowname, threadid, processid, handlewindow : integer;
    buff : array[0..255of byte;
    red : cardinal;
begin
windowname := FindWindow(nil'Form2');
threadid := GetWindowThreadProcessId(windowname, @processid);
handlewindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
if ReadProcessMemory(handlewindow,pointer($45ECC8),@buff,4, red) = true then
  showmessage('Ging')
  else
  showmessage('nein');
ShowMessage(pchar(@buff));
end;


BenBE - Fr 10.07.09 10:46

Wenn Du einen Integer anzeigen willst, musst Du IntToStr verwenden. Mit PChar interpretierst Du den Speicherinhalt als String, was dir nur komische Zeichen bescheren wird.

Test: Sende in der jetzigen Version mal die Zahl 5001036.


gissuf - Fr 10.07.09 21:56

ok mein "neuer" source:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm3.Button1Click(Sender: TObject);
var windowname, threadid, processid, handlewindow : integer;
    buff : array of byte;
    red : cardinal;
begin
SetLength(buff, 4);
windowname := FindWindow(nil'Form2');
threadid := GetWindowThreadProcessId(windowname, @processid);
handlewindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
if ReadProcessMemory(handlewindow,pointer($45ECC8),@buff,4, red) = true then
  showmessage('Ging')
  else
  showmessage('nein');
ShowMessage(inttostr(cardinal(@buff)));
end;


leider bin ich wohl einfach zu dämlich dafür.

egal ob readprocess erfolgreich war oder nicht, es kommt immer die selbe zahl raus.

ausserdem noch ne frage:
wie kann ich ermitteln, was sich hinter der adresse verbirgt, also Integer, String, Whatever, weil ich muss das dann ja je nachdem anders behandeln.

vielen dank

edit:
was ich mit der Zahl 5001036 testen soll, hab ich leider auch nicht ganz verstanden *cry*


Flamefire - Sa 11.07.09 05:04

funktioniert so bei dynamischen arrays nicht!
also:

Delphi-Quelltext
1:
2:
3:
//...
if ReadProcessMemory(handlewindow,pointer($45ECC8),@buff[0],4, red) = true then
//...ShowMessage(inttostr(PCardinal(@buff[0])^));


oder gleich

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm3.Button1Click(Sender: TObject);
var windowname, threadid, processid, handlewindow : integer;
    buff : Cardinal;
    red : cardinal;
begin
windowname := FindWindow(nil'Form2');
threadid := GetWindowThreadProcessId(windowname, @processid);
handlewindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
if ReadProcessMemory(handlewindow,pointer($45ECC8),@buff,4, red) = true then
  showmessage('Ging')
  else
  showmessage('nein');
ShowMessage(inttostr(buff));
end;