| Autor |
Beitrag |
Schlitzesofa
Hält's aus hier
Beiträge: 9
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 Narses: 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 
Hält's aus hier
Beiträge: 9
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 18.01.09 16:13
Schlitzesofa hat folgendes geschrieben : | 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 ...
Schlitzesofa hat folgendes geschrieben : | 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.
Schlitzesofa hat folgendes geschrieben : | | 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
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: 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
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 19.01.09 15:00
uall@ogc hat folgendes geschrieben : | 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):
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
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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
|
|
|