Autor Beitrag
einbrecher2007
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 15.12.09 17:38 
Hi,

Ich benutze folgendermaßen ReadProcessMemory:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.
einbrecher2007 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 15.12.09 23:46 
Habe es jetzt folgendermaßen hinbekommen:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.
SAiBOT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 323
Erhaltene Danke: 6

XP SP2; 7
D7; D2009
BeitragVerfasst: Mi 16.12.09 09:02 
Noch dazu würde ich vermuten, deine IDE-Version liegt unter 2009. :wink:

_________________
Debuggers don't remove bugs, they only show them in slow-motion.
einbrecher2007 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
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: Di 22.12.09 13:43 
Dazu gibt's hier im Forum ne ganze Menge Threads. Einfach die zurückgelieferten Strukturen auswerten.

_________________
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.