Autor Beitrag
thebe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP Home
D6 Enterprise
BeitragVerfasst: Sa 28.12.02 00:40 
N'Abend..

Folgende Frage: wie kann man Strings aus einem Prozess auslesen *ohne Fehlermeldungen zu kriegen ;)*

Ich hab bereits folgenden Code:
ausblenden 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:
var
        SvrH: THandle;
        by: array[1..256] of byte;
        temp: string;
        CountInt1, BytesRead, CountInt2: cardinal;

begin
        SvrH := OpenProcess(PROCESS_ALL_ACCESS, false, 1084); //1084 steht da weil ich per TaskManager die ID weis und leider kein Fenster Handle hab um die ID irgendwo her zukriegen. Jemand Vorschläge ??
        if SvrH > 0 then
                ShowMessage('Handle!');

        CountInt1 := $1;
        repeat
                ReadProcessMemory(SvrH, Pointer(CountInt1), Pointer(@by), Length(edit1.Text), BytesRead);

                for CountInt2 := 1 to Length(Edit1.Text) do
                        temp[CountInt2] := Chr(by[CountInt2]);

                CountInt1 := CountInt1 + 1;
        until (CountInt1 = $FFFFFFFF) OR (temp = Edit1.Text);

        ShowMessage('Addy: '+IntToStr(CountInt1));

        CloseHandle(SvrH);


Hat jemand ne Ahnung was ich falsch mache ?

Zwei Fragen dazu:
  1. Wie krieg ich die Prozess ID eines Fensterlosen Prozesses *zb. Taskbar Icon*. Alle Varianten die ich dazu gesehen hab, benötigen nen Fenster Handle
  2. Wie krieg ich die Größe des Prozess Speichers raus ? Auf Swissdelphicenter.ch steht zwar ne Lösung, die funzt aber nur auf NT/2k/XP

Vielen Dank für jede Hilfe scho ma :)

MfG
Thebe
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 28.12.02 01:05 
Was soll denn das für ein String sein?

Oder willst du den Speicher eines Prozesses auslesen? Dann versuch es mal mit ReadProcessmemory.
thebe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP Home
D6 Enterprise
BeitragVerfasst: Sa 28.12.02 02:49 
"ReadProcessMemory(SvrH, Pointer(CountInt1), Pointer(@by), Length(edit1.Text), BytesRead);"

Das mach ich ja schon ;)

Also folgendes:
Ich geh durch den Prozess Speicher von Anfang bis (Ende minus gesuchte Stringlänge). Ich les (Stringlänge) Bytes in ein ByteArray und übertrag diese Bytes dann in einen temporären String. Diesen String vergleich ich dann mit dem gesuchten String. Wenn Übereinstimmung, wird die Adresse zurück geliefert.

So weit so gut, nur ich krieg da Fehlermeldungen daß ich auf Adressen zugreife, auf die ich nit zugreifen kann. Ich hab folgende Vermutung: Ich weiß leider NICHT wo der Prozess Speicher anfängt und wo er aufhört, ich les von Speicher Addy $000000000 bis $fffffffff alles ein. Wahrscheinlich ist dort der Fehler, daß ich auf Speicher zugreif, auf den ich nit zugreifen kann. Doch nur WIE krieg ich raus, von wo bis wo ich einlesen muss ?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 28.12.02 06:02 
Also das ist etwas komplex das Thema. Ich würde dir das Buch "Windows Programmierung für Experten" von Jeffrey Richter empfehlen. Ohne das wirst du kaum eine Chance haben.

Nur so viel: Du brauchst mit Sicherheit die Berechtigung um den Speicher eines fremden Prozesses auszulesen.

Aber versuch mal das:
ausblenden Quelltext
1:
ReadProcessMemory(SvrH, Pointer(CountInt1), by, Length(edit1.Text), BytesRead);					

Dein Charackter-Array ist nämlich schon ein Zeiger.
Oder so:
ausblenden Quelltext
1:
ReadProcessMemory(SvrH, Pointer(CountInt1), Integer(@by), Length(edit1.Text), BytesRead);					
thebe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP Home
D6 Enterprise
BeitragVerfasst: Sa 28.12.02 07:17 
Nee, daß isses nit
wenn ich da deine Vorschläge ausprobier kommt er mir mit Fehldermeldung "Inkompatible Typen: Integer und Pointer" bzw. "Array und Pointer". Daß muss da scho so hin wie es is.

Kann es sein das ich das Prog per CreateProcess aufrufen muss, damit ich überhaupt die Berechtigung kriege, den Speicher auszulesen ?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 28.12.02 07:23 
Ich weiß es nicht. Ich konnte bisher immer erfolgreich einen großen Bogen um so Rumgefusche in fremden Speicherbereichen machen.

Was willst du den erreichen? Soll das ein Spiele-Trainer werden?
thebe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP Home
D6 Enterprise
BeitragVerfasst: Sa 28.12.02 14:12 
soll ne Exe Datei von Englisch -> Deutsch übersetzen, ohne daß man per HEX Editor dran rumpfuschen muss (CRC usw.)

Ich hab ma aus Jux und Dollerei ne LED-Komponente annen Return von ReadProcessMemory rangehängt und rausgekommen is:
Ich kann auf fragmentartige Teile im Speicher zugreifen, mal hier die Bytes, mal dort jene Bytes. Aber ob die zum gesuchtem Prog gehören oder nicht, daß kann ich leider nicht sagen..

Sonst noch jemand hier der sich damit ein Stückchen auskennt ?? :D
XtrmK3v0r
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 20.02.03 19:21 
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
by : array of char;
bytes_read : Cardinal;
...
...
SetLength(by,Length(Edit1.Text));  // Größe festlegen
...
offset:=0;  // Standardmäßig bei 0
ReadProcessMemory(hProcess,Ptr(offset),by,sizeof(by),bytes_read);
...
...
Edit1.Text:=StrPas(by);  // weiss nich mehr genau obs so war aber so in der art

So errm die ReadProcessMemory Methode verlangt als Startaddresse das Offset nicht die Basisaddresse des Prozesses. Das wäre ja sonst Schwachsinn :d.....du ließt damit an Addresse: Basisaddresse+Offset im Speicher! By ist ein Array somit also ein Zeiger deshalb musst du nur BY schreiben.

Moderiert von user profile iconTino: Code-Tags hinzugefügt.