Coding Designfrage - Wie installiere ich den Hook am besten?
-
Hallo!
Wie ihr vielleicht noch wisst habe ich in der letzten Zeit ein Plugin für Outlook Express geschrieben.OE selbst unterstützt keine Plugins. Deshalb muss man OE die PluginDLL injizieren, welche dann das komplette Hooking vornimmt.
Ok alles klar..das Plugin ist fertig.
Wenn ich Outlook mithilfe meines Loaders starte läuft alles bestens.
Allerdings wie installiert man dieses Plugin jetzt mit einem Installer am besten?
Die erste Möglichkeit die mir in den Sinn kam:
Installer ersetzt die originale Outlook Express Datei durch den Loader und benennt die richtige um. Der Loader lädt nun die richtige Outlook Express Executable und lädt mit ihr das Plugin.Das wäre die einfachste Möglichkeit gewesen. Allerdings macht einem da der Windows Datei Schutz einen Strich durch die Rechnung...beim Ersetzen meckert er rum dass man die WinXP CD einlegen soll damit das Problem repariert wird....das ist einem Kunden natürlich nicht zumutbar, wie ihr euch sicher vorstellen könnt.
Welche Möglichkeit würdet ihr verwenden?
Mir ist gerade folgendes eingefallen, aber vielleicht findet ihr was besseres:Ich lasse im Hintergrund IMMER den Loader laufen. Sobald nun Outlook Express gestartet wird injziert der Loader sofort mein Plugin.
Allerdings: Wie bekommt der Loader es mit, wann Outlook Express gestartet wurde?
Gibt es Events in Windows die aufgerufen werden, wenn eine Anwendung ausgeführt wird?Mein Notfallplan:
Ich setze einen globalen Windowshook auf die Windowprocs. Dort fange ich nun WM_CREATE nachträglich ab und schaue um welche Klasse und welches Fenster es sich handelt. Wenn es sich dabei um Outlooks Fenster handelt kann ich der ausführenden Anwendung ja mein Plugin injizieren.Oder was haltet ihr davon? Habt ihr bessere Möglichkeiten?
Gruß,
KevinP.S.:
Wie komme ich an das HMODULE von welchem das Fenster stammt? Also an das Handle der DLL, welche das Fenster erstellt hat.
-
Einen Hook finde ich zu Performance fressend.
Bau Dir einen Timer, der sieht alle Sekunde mal nach ob das Fenster mit der entsprechenden Fensterklasse von Outlook Express vorhanden ist. Wenn ja injeziert es Dein Plug In.
Weitaus weniger ressourcen fressend ist ein CBT Hook!
-
Hey Martin!
Danke für die Antwort.
Bei Outlook läuft das so:
die originale msimn.exe lädt die msoe.dll und führt in ihr CoCreateOutlookExpress aus. Komplett OE läuft dann in dieser DLL. Alle Fenster etc. werden in dieser DLL erzeugt.
Nun möchte ich auch diese DLL hooken.
Nur wie komme ich über das Outlook Express Fenster ans HMODULE der DLL welche das Fenster erstellt hat?
Ich komme an den Process, sowie ans Instancehandle..aber nur von der Anwendung, welche die DLL geladen hat, in der alles stattfindet.
Komme ich vielleicht irgendwie über die ThreadID des Fensters ans HMODULE von der geladenen msoe.dll?
Gruß,
KevinEdit:
Evtl. der CBT hook und dann beim Erstellen des OE Fensters GetModuleHandle("msoe.dll") aufrufen und wenn das ein gültiges Handle zurückgibt bin ich schon bei der DLL. Meinst du das funktioniert? Müsste doch theoretisch da die Hookprozedur innerhalb des Speichers von msoe.dll aufgerufen wird. Also wurde diese auch geladen.Oder komme ich irgendwie ans Handle des Moduls welches den Code gerade ausführt? Das wäre natürlich dann am allerleichtesten.
-
Man hooked new eine DLL sondern einen Prozess!
Du benötigst IMHO das HMODULE handle der DLL gar nicht um den Prozess zu hooken!
-
Man kann genau so gut eine DLL hooken die von einem Prozess in den Speicher geladen wurde. DLLs haben genau so eine Importtable wie auch Executables.
Und genau das ist bei Outlook Express der Fall.
OE lädt msoe.dll in den Speicher und ruft eine Funktion der DLL auf.
Diese Funktion startet dann komplett OE => Alle Fenster etc. werden aus der DLL heraus und über die Funktionen, die in der Importtable dieser DLL stehen erstellt. :schland:
-
Du verstehst mich nicht...
Ein Hook bezieht sich immer auf einen Prozess oder Thread. Niemals auf ein Stück Code wie eine DLL!
-
Dann hast du mich eben vorhin falsch verstanden

Ich will die DLL hooken, welche eine bestimmte Anwendung in ihren Addressbereich lädt.
Code dieser DLL erstellt alle Fenster.
Folgenedes funktioniert:
CBT Hook, schauen wann das OE Fenster erstellt wird.
Per GetModuleHandle("msoe") an den speicher der DLL kommen, wenn sie geladen wurde und hooken.
-
Surkevin schrieb:
Dann hast du mich eben vorhin falsch verstanden

Ich will die DLL hooken, welche eine bestimmte Anwendung in ihren Addressbereich lädt.
Ich gebe es auf. Man kann keine DLL Hooken sondern nur einen auf bestimmte Ereignisse in einem Prozess reagieren. Diese sind aber unabhängig von DLL und EXE.
Jetzt verstanden? Man hooked einen Prozess und niemals eine DLL!
-
natürlich kannst du DLLs hooken...
Natürlich nicht per SetWindowsHook.Kennst du nicht das ganz normale API Hooking?
Wenn ich ein HMODULE einer geladenen DLL habe kann ich sie selbstverständlich hooken indem ich die IMPORT TABLE modifiziere.Jetzt verstanden?