Autor Beitrag
gissuf
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 09.07.09 20:00 
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:
ausblenden 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;
Einloggen, um Attachments anzusehen!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
gissuf Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 10.07.09 21:56 
ok mein "neuer" source:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Sa 11.07.09 05:04 
funktioniert so bei dynamischen arrays nicht!
also:
ausblenden Delphi-Quelltext
1:
2:
3:
//...
if ReadProcessMemory(handlewindow,pointer($45ECC8),@buff[0],4, red) = true then
//...ShowMessage(inttostr(PCardinal(@buff[0])^));


oder gleich
ausblenden 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;