Autor Beitrag
Schlitzesofa
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 17.01.09 23:44 
Hallo,

ich würde gern die API-Funktion DrawText hooken, d.h. den auszugebenden Text manipulieren usw.

Kennt jemand dazu ein Tutorial oder ein einfaches Beispileprogramm?
Ich habe nur wenig Erfahrung mit Hooks.

Ich habe bisher einen globalen Tastaturhook mit Callbackfunktion hinbekommen.
Nun ist das Problem, daß ich nicht weiß, wie man eine bestimmte Funktion aus einer API hookt.
Ich vermute mal, daß das abfangen der Windows-Nachrichten mit WH_Getmessage bei dieser Sache nichts bringt, da ein Aufruf von DrawText sicherlich nicht mit einer Windows-Message verbunden ist.
Falls das doch so sein sollte, wärs nett wenn mir jemand sagen könnte, wie ich die richtige Message rausfiltern kann.

Ansonsten habe ich mich mal umgehört und die uallCollection gefunden.
Gibt es dazu eine Dokumentation bzw. ein Tutorial? Ich habe mir einige Beispiele angesehen, unter anderem das einfache Bsp. mit dem lokalen Hook der MessageBox. Kann man daraus einen globalen Hook machen, indem man einfach die Funktion in eine DLL exportiert?
Ein weiteres Bsp. ("1337 global hook") macht schon fast das, was ich will, allerdings stürtzt dabei immer mein System ab. Mir ist aufgefallen, daß dabei die Funktion "GlobalInjectLibrary" verwendet wird. Heist das, daß mit "uallHook.HookApiIAT" prinzipiell keine globalen Hooks möglich sind?

Vielen Dank!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 18.01.09 00:12 
Irgendwo hab ich glaube seinen Beispielcode für einen Leet-Hook rumliegen, der jegliche Textausgaben in Leetspeak wandelt ... Müsst ich raussuchen.

Prinzipiell sind mit der uallCollection auch globale Hooks möglich, jedoch musst Du diese über eine DLL realisieren ODER mit Shellcode im Zielprozess arbeiten. Dieser Shellcode darf seinerseits dann jedoch keine externen Abhängigkeiten mehr aufweisen, daher ist der Einsatz einer Hook-DLL zu bevorzugen.

Bei Omorphia nutzen wir die uallCollection z.B. um vom Debugger die Exceptions im Userland abzufangen (wodurch die Omorphia-Bibliothek schon vor der Delphi-IDE erfährt ...); da wir das allerdings nur für den eigenen Prozess tun, ist bei uns keine DLL nötig.

Zeig am besten mal Source von Dir, dann kann man da besser sagen, wo dein Problem liegt.

Edit: HookApiIAT steht für API-Hook auf Import Address Table-Basis. Die IAT gilt immer nur für einen Prozess. Da jeder Prozess seinen eigenen Adressraum hat, musst Du in jedem Prozess deinen Code einbinden UND die Aufrufe der vorhandenen Routine verbiegen.

Moderiert von user profile iconNarses: EXE-File aus dem Archiv entfernt.
Einloggen, um Attachments anzusehen!
_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Schlitzesofa Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 18.01.09 15:32 
Den Beispielcode habe ich schon in einer etwas anderen Form gehabt.
Das war das Programm, was immer abstürzt (und zwar systemweit).

Ich habe zur Zeit noch keinen eigenen Quelltext, da ich erstmal versuche, mich an anderen Programmen zu orientieren.
Wenn ich einen globalen API-Hook machen wollte, müsste ich also die Funktion "GlobalInjectLibrary" verwenden und meine Ersatzfunktion müsste ich in eine DLL auslagern, stimmt das so?

Falls es bei den Abstürzen bleiben sollte --> Kann man auch mit einem einfachen WH_Getmessage - Hook vom Aufruf einer API-Funktion (z.B. DrawText) erfahren?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 18.01.09 16:13 
user profile iconSchlitzesofa hat folgendes geschrieben Zum zitierten Posting springen:
Den Beispielcode habe ich schon in einer etwas anderen Form gehabt.
Das war das Programm, was immer abstürzt (und zwar systemweit).

Gab da glaub unter XP einen Bug, unter Win2K lief es halbwegs ...

user profile iconSchlitzesofa hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe zur Zeit noch keinen eigenen Quelltext, da ich erstmal versuche, mich an anderen Programmen zu orientieren.
Wenn ich einen globalen API-Hook machen wollte, müsste ich also die Funktion "GlobalInjectLibrary" verwenden und meine Ersatzfunktion müsste ich in eine DLL auslagern, stimmt das so?

Es gibt mehrere Möglichkeiten, dies zu tun. Möglichkeit 1 ist der Aufruf von GlobalInjectLibrary, Möglichkeit 2 ist die Nutzung der entsprechenden Registry-Zweige, um die DLL global zu laden.

In jedem Falle müsste das Programm aber dann noch über einen IAT oder Codehook dafür sorgen, dass die entsprechenden Aufrufe umgelenkt werden.

user profile iconSchlitzesofa hat folgendes geschrieben Zum zitierten Posting springen:
Falls es bei den Abstürzen bleiben sollte --> Kann man auch mit einem einfachen WH_Getmessage - Hook vom Aufruf einer API-Funktion (z.B. DrawText) erfahren?

Ein WH_GetMessage-Hook taugt maximal zum einschleusen\injecten des Codes zum Verbiegen der Aufrufpunkte; Damit bringt man keinen Code dazu, etwas anderes zu tun, als er normal tun würde (einen Hook aufrufen ist eine "normale Aktivität").

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: So 18.01.09 17:53 
Da gabs mal einen Shellhook von Toms, anhand dessen als Beispiel müsste das recht einfach sein.
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: So 18.01.09 19:34 
Hi,
ich habe leider zur Zeit kein Delphi installeirt sonst würde ich es mal unter WinXP testen. Injecte du mal die dll mit dem 1337-Hook einzeln in die Prozesse und schau bei welchem es crashed.

Ich kann mir das leider erst wieder nächtes WE anschaun.

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Schlitzesofa Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 19.01.09 15:00 
user profile iconuall@ogc hat folgendes geschrieben Zum zitierten Posting springen:
Hi,
ich habe leider zur Zeit kein Delphi installeirt sonst würde ich es mal unter WinXP testen. Injecte du mal die dll mit dem 1337-Hook einzeln in die Prozesse und schau bei welchem es crashed.

Ich kann mir das leider erst wieder nächtes WE anschaun.



Hallo,

ich vermute, die Ursache für den Crash liegt in der Stringmanipulation.

Ich habe mal folgendes gemacht (zunächst Quelltext):

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:
procedure ReplaceAnsiChar(p: pointer; pos: Integer; c: AnsiChar);
begin
    pAnsiChar(integer(p)+pos)^ := c;
end;

procedure ReplaceWideChar(p: pointer; pos: Integer; c: WideChar);
begin
    pWideChar(integer(p)+pos*2)^ := c;
end;

function myGetTextExtentPoint32W(DC: HDC; Str: PWideChar; Count: Integer; var Size: TSize): BOOL; stdcall;
begin
    if Count > 3 then
      ReplaceWideChar(Str, 1'W');
    result := nextGetTextExtentPoint32W(DC,Str,Count,Size);
end;

function myGetTextExtentPoint32A(DC: HDC; Str: PAnsiChar; Count: Integer; var Size: TSize): BOOL; stdcall;
begin
    if Count > 3 then
      ReplaceAnsiChar(Str, 1'A');
    result := nextGetTextExtentPoint32A(DC,Str,Count,Size);
end;


D.h. ich verzichte zunächst auf den Aufruf von "isBadReadPtr", weil ich bei msdn.microsoft.com/e...aa366713(VS.85).aspx gefunden habe, daß diese Funktion NICHT mehr benutzt werden sollte. --> möglicherweise ist das Blödsinn, ich habe es mir nicht genau durchgelesen!
Stattdessen frage ich die Textlänge ab und wenn diese eine gewisse Länge überschreitet, ersetze ich ein Zeichen ('A' falls Ansi und 'W' falls Wide).

Das Prinzip habe ich bei allen Funktionen angewendet (also nicht nur GetTextExtendPoint32) und es stürzt jetzt zumindest nicht mehr ab.
Vielleicht hilft Dir das ja irgendwie weiter.

Ansonsten hätte ich noch eine Frage:
Im Explorer und auf dem Desktop werden alle Ersetzungen mit 'W' durchgeführt, im Firefox wird allerdings durch 't' ersetzt. Woran liegt das?
Benutzt der Firefox eine andere Zeichenart als WideChar (z.B. 4 Byte)?
Was müsste ich ändern, damit die Ersetzung auch dort korrekt dargestellt wird?
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Di 20.01.09 14:53 
Ähm in mehr als 50% der Fälle hast du keine Schreibrechte auf den Speicherbereich -> Prüfe mit IsBadWritePtr / VietualQuery und hol dir die mit VirtualProtect.

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit