Entwickler-Ecke
Windows API - String aus Prozess lesen ?
thebe - Sa 28.12.02 00:40
Titel: String aus Prozess lesen ?
N'Abend..
Folgende Frage: wie kann man Strings aus einem Prozess auslesen *ohne Fehlermeldungen zu kriegen ;)*
Ich hab bereits folgenden Code:
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:
- Wie krieg ich die Prozess ID eines Fensterlosen Prozesses *zb. Taskbar Icon*. Alle Varianten die ich dazu gesehen hab, benötigen nen Fenster Handle
- 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
Delete - 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 - 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 ?
Delete - 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:
Quelltext
1:
| ReadProcessMemory(SvrH, Pointer(CountInt1), by, Length(edit1.Text), BytesRead); |
Dein Charackter-Array ist nämlich schon ein Zeiger.
Oder so:
Quelltext
1:
| ReadProcessMemory(SvrH, Pointer(CountInt1), Integer(@by), Length(edit1.Text), BytesRead); |
thebe - 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 ?
Delete - 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 - 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 - Do 20.02.03 19:21
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
Tino: Code-Tags hinzugefügt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!