Autor Beitrag
scrooge
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 200



BeitragVerfasst: So 08.08.04 17:14 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: 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.

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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:
ausblenden 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..3of 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

_________________
JSXGraph
scrooge Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 200



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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...?

_________________
JSXGraph
scrooge Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 200



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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

_________________
JSXGraph