Autor |
Beitrag |
gissuf
Hält's aus hier
Beiträge: 5
|
Verfasst: 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:
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; |
Einloggen, um Attachments anzusehen!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: 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; |
|
|
|