Entwickler-Ecke
Windows API - ReadProcessMemory bis zum nächsten Null-Byte lesen lassen
scrooge - So 08.08.04 17:14
Titel: ReadProcessMemory bis zum nächsten Null-Byte lesen lassen
Hi,
versuche jetzt mal systemqweites Api-Hooking Porg zu schreiben. Im Moment bin ich bnoch an der Proc dran die für eine angegebenes Modul, ide Import Tasbles nach der entsprechenden Dll und der zu hookenden importierten Proc sucht.
Dummerweise gibt da ja eine Strukur die sich Import_By_Name_nennt, die in Teilen aus einem variablen Stzring besteht (nutllterminiert).
Frage: Kennt jemand eine effiziente Methode um die String auszulesen (zu lesende Größe lässt sich ja schlecht angeben).
Schon mal danke für die Hilfe.
Sebastian
maxk - So 08.08.04 17:16
Ich habe zwar deine genaue Frage nicht verstanden, aber wenn du einen nullterminierten String, dessen Größe du nicht kennst, lesen willst, dann musst du wohl Zeichenweise einlesen, bis #0 kommt. Oder du liest jeweils 100 Byte und suchst dann mit pos die #0 um ab dort zu schneiden. Für kurze ist das erste schneller, für lange das Zweite.
raziel - So 08.08.04 17:28
Ist für sowas nicht PChar ideal? Einfach die Speicherstelle einer PChar Variable zuweisen und per MessageBox ausgeben lassen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| var Form1: TForm1; c: PChar; carr: array [0..3] of char;
procedure TForm1.Button1Click(Sender: TObject); begin carr[0] := Chr(65); carr[1] := Chr(65); carr[2] := Chr(65); carr[3] := Chr(0); end;
procedure TForm1.Button2Click(Sender: TObject); begin c := @carr; ShowMessage(c); end; |
Gibt "AAA" aus. Wenn man Zeile 11 ändert in
carr[1] := Chr(0);erhält man - logischerweise - "A".
raziel
scrooge - So 08.08.04 19:32
Das mit der MesasgeBox wird wohl nicht grasd gut gehen, denn wenn man einfach mal die Adresse angeben könnte die in einem andren Prozess zeigt und somit auf diese Weise recht einfach doch dann den PRozess auslesen kann, dann geben Schutzkonzepte irgendwie nicht viel Sinn (OpenProcess besitzt denke ich nicht umsonst einen Parameter indem man die gewollten Rechte angeben kann, die logischwerweise je nachdem auch verwährt werden können).
Außerdem will ich keine Message ausgeben. Jeder event. spätere User dieses Prog würde mir an den Hals springen, wenn er hundert MAl ne MesageBox auf dem Bildschirm gezeigt bekäme.
zum ersten: Welche Länge hat denn so ein durchschnittlicher (?) Funktionsname maximal ??
raziel - So 08.08.04 19:39
Das war ja auch nur zum testen... :roll:
Und wieso Schutzmechanismen? Bei einem Systemweiten API-Hook liegt afaik der Witz darin, dass eine DLL in den Code-Bereich der anderen Anwendungen injiziert wird. Und dann kann man auch ganz bequem auf deren Speicherbereich zugreifen... Wozu brauchst Du überhaupt den Namen der Funktion?
raziel
//edit: war das nicht mal ursprünglich im CLX/Delphi Language Forum...?
scrooge - Do 12.08.04 21:25
Schon ,aber du musst die rechte trotzdem erst anfragen. Bei MessageBox nicht. //man kann sclhießlich auch die Funktion von außerhalb patchen und dann ne Dll nur mit der Hook-proc injezieren <- bezog sich darauf
Name deshalb., da die Proc auf Procs hooken können ,soll die nichtin kernel32.dll etc vorhjanxden sind. Soweit ich weiß ist aber nur bei denen gesichert, dass die andie selbe stelle im Adresssraum geladen werden.
(PS: soweit ich weiß, war dieses Topic immer schon in der Win-Api Sparte)
raziel - Do 12.08.04 21:39
scrooge hat folgendes geschrieben: |
Name deshalb., da die Proc auf Procs hooken können ,soll die nichtin kernel32.dll etc vorhjanxden sind. Soweit ich weiß ist aber nur bei denen gesichert, dass die andie selbe stelle im Adresssraum geladen werden. |
Nochmal, da komm ich nich ganz mit... :?
Nur bei Funktionen der kernel32.dll ist gesichert, dass die immer an der gleichen Adresse sind? Auch die können sich imho von Windows zu Windows ändern. Und warum Du den Namen der DLL auslesen musst zum Hooken is mir immer noch schleierhaft. Du hast die Adresse der alten zu hookenden Funktion. Dann durchsuchst Du die Import Table Modul für Modul und Funktion für Funktion, vergleichst die Adressen der Funktionen mit der, der alten zu hookenden. Hast Du sie gefunden, speicherst Du die alte Adresse und ersetzt die Adresse im Eintrag in der Import Table mit der neuen Adresse.
raziel
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!