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..255] of 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 |
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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!