Autor Beitrag
Janaki
Hält's aus hier
Beiträge: 1

Win XP
Delphi 3
BeitragVerfasst: So 11.11.07 01:52 
Hallo zusammen,
Ich wollte ein Programm schreiben, um das Passwort bei ICQ auszulesen.
Dazu muss ich ja 'nur' die Speicher Adresse FE7768 des Prozesses auslesen.
Ich hab versucht, ein Programm umzuschreiben, bei dem eigentlich ins Memory geschrieben wurde, aber irgendwie klappt das nicht. ReadProcessMemory liest 0 bytes aus.
Bitte helft mir! vielen Dank im Vorraus

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.Button1Click(Sender: TObject);
var
  WindowTitle : PChar;
  Adresse : Integer;
  NumberOfBytes : Integer;
  c : cardinal;
  write : Integer;
  buf : Pointer;
begin
  WindowTitle := PChar('Anmelden');
  Adresse := $FE7768;
  NumberOfBytes := 8;
  c:=FindWindow(nil,WindowTitle);
  if c=0 then
  begin
    MessageDlg('ICQ ist nicht geöffnet!',mtwarning,[mbOK],0);
    Exit;
  end;
  GetWindowThreadProcessId(c,@c);
  c:=OpenProcess(PROCESS_ALL_ACCESS,False,c); 
  if ReadProcessMemory(c,Ptr(Adresse),buf,NumberOfBytes,write) then
  Form1.Label1.Caption := Format('%.p',[buf])
  else Form1.Label1.Caption := IntToStr(write);
  CloseHandle(c);
end;
AHT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: So 11.11.07 12:28 
So, Vorneweg: Ich kann kein Wort Delphi!
Zitat:

GetWindowThreadProcessId(c,@c)

Bei GetWindowThreadProcessId ist der erstze Parameter ein Handle auf ein Fenster, das scheint richtig zu sein - der zweite Parameter soll aber die Adresse einer Variablen sein, die die PID aufnimmt. Hier übergibts du (wenn ich es richtig sehe) wieder die Adresse, auf der schon das Handle des Fensters gespeichert hast. Das würde ich nicht tun.

Zitat:

OpenProcess(PROCESS_ALL_ACCESS,False,c)

Man öffnet einen Prozess nicht mit mehr Rechten, als man benötigt. Das ist unfein und haut einem seinen Code in einem Account mit eingeschränkten Rechten um die Ohren.

Zitat:

ReadProcessMemory(c,Ptr(Adresse),buf,NumberOfBytes,write)

Wenn du die Adresse direkt Auslesen willst, musst du sie auch als Parameter 2 direkt übergeben und keinen Pointer auf die Adresse.
Der Datentyp von buf scheint nicht zu passen. Hier musst du als dritten Parameter die Adresse einer Variablen übergeben, die mindestens die Anzahl an Bytes groß sein muss, die du auslesen möchtest (bei dir wären das ja 8).
Als letzter Parameter muss ebenfalls die Adresse einer Variablen übergeben werden, und nicht deren Inhalt.

Will hoffen, dass ich die Sache richtig deute. Kann, wie gesagt, kein bischen Delphi. Vielleicht findet sich ja auch noch jemand anders.

Gruß

AHT