Hooks in Windows-Systemen verfügen über sehr leistungsstarke Funktionen. Durch diese Technologie können nahezu alle Nachrichten in Windows-Systemen abgefangen, überwacht und verarbeitet werden. Diese Technologie kann in verschiedenen Softwareprogrammen weit verbreitet eingesetzt werden, insbesondere in Software, die Überwachung, automatische Aufzeichnung und andere Systemüberwachungsfunktionen erfordert. Dieser Artikel behandelt dieses Thema und hofft, den Lesern als Referenz zu dienen.
1. Mechanismus und Hakentyp
Windows-Anwendungen sind alle nachrichtengesteuert und der Betrieb der Anwendung hängt von der Art und dem Inhalt der empfangenen Nachricht ab. Hooks ähneln dem Dos-Interrupt-Interception-Verarbeitungsmechanismus. Hook ist eine Plattform für den Nachrichtenverarbeitungsmechanismus von Windows. Durch die Installation verschiedener Hooks kann die Anwendung darauf Unterprogramme einrichten, um bestimmte Nachrichten im angegebenen Fenster zu überwachen und die Nachricht zu verarbeiten, bevor sie das Zielfenster erreicht.
In Windows gibt es zwei Arten von Hooks: Der eine ist der System-Hook (RemoteHook), der Nachrichten innerhalb des gesamten Systems überwacht, und der andere ist der Thread-Hook (LocalHook), der nur Nachrichten innerhalb des Prozesses abfängt. Für System-Hooks sollte die Hook-Funktion in der Dynamic Link Library (DLL) des Windows-Systems implementiert werden. Für Thread-Hooks kann die Hook-Funktion in der DLL oder in der entsprechenden Anwendung implementiert werden. Dies liegt daran, dass Windows beim Erstellen eines Hooks durch einen Entwickler zunächst eine Datenstruktur im Systemspeicher erstellt, die Informationen über den Hook enthält, und die Struktur dann zur vorhandenen Hook-Liste hinzufügt. Die neuen Hooks werden vor den älteren sortiert Haken. Wenn ein Ereignis auftritt und ein lokaler Hook installiert ist, wird die Hook-Funktion im aktuellen Prozess aufgerufen. Wenn es sich um einen Remote-Hook handelt, muss das System die Hook-Funktion in den Adressraum anderer Prozesse einfügen. Dazu muss sich die Hook-Funktion in einer dynamischen Linkbibliothek befinden. Wenn Sie also einen Remote-Hook verwenden möchten, müssen Sie ihn einfügen Der Haken Fügen Sie die Funktion in die Dynamic Link Library ein. Für die durch Hooks überwachten Nachrichtentypen stellt Windows insgesamt folgende Typen zur Verfügung: Wie in Tabelle 1 dargestellt:
Tabelle 1. Windows-Nachrichtentypen
Konstantenbezeichner des Nachrichtentyps | Wert | Nachrichtentyp | Anwendungsbereich |
WH_CALLWNDPROC | 4 | Nachricht an Fenster | Thread oder System |
WH_CALLWNDPROCRET | 12 | Die vom Fenster zurückgegebene Nachricht | Thread oder System |
WH_CBT | 5 | Meldungen wie Fensteränderungen und Fokuseinstellungen | Thread oder System |
WH_DEBUG | 9 | Ob Hooks anderer Hooks ausgeführt werden sollen | Thread oder System |
WH_FOREGROUNDIDLE | 11 | Das Vordergrundprogramm ist inaktiv | Thread oder System |
WH_GETMESSAGE | 3 | In der Nachrichtenwarteschlange gepostete Nachrichten | Thread oder System |
WH_JOURNAL WIEDERGABE | 1 | Spielen Sie die aufgezeichneten Nachrichten ab | System |
WH_JOURNALRECORD | 0 | Überwachen und protokollieren Sie Eingabenachrichten | System |
WH_KEYBOARD | 2 | Tastaturnachrichten | Thread oder System |
WH_MOUSE | 7 | Mausnachricht | Thread oder System |
WH_MSGFILTER | -1 | Menü-Bildlaufleisten, Dialogmeldungen | Thread oder System |
WH_SHELL | 10 | Shell-Nachrichten | Thread oder System |
WH_SYSMSGFILTER | 6 | Menü-Bildlaufleisten, Dialogmeldungen für alle Threads | System |
2. Implementierung von Hooks in der VB-Programmierung
(1) Format der Hook-Funktion (HOOK-Funktion). Die Hook-Funktion ist eigentlich eine Funktion. Wenn es sich um einen System-Hook handelt, muss die Funktion in der Dynamic Link Library platziert werden. Diese Funktion hat ein bestimmtes Parameterformat, das in VB wie folgt lautet:
Private Funktion HookFunc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long |
Unter diesen stellt nCode die Situation dar, in der der Hook generiert wird, und es gibt je nach Hook unterschiedliche Sätze möglicher Werte. Die Rückgabewerte der Parameter wParam und lParam umfassen den Inhalt der überwachten Nachricht, der variiert mit der Art der vom Hook überwachten Nachricht. Sie unterscheidet sich je nach Wert von nCode. Für mit VB festgelegte Hook-Funktionen lautet die allgemeine Rahmenform wie folgt:
Private Funktion HookFunc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Wählen Sie den Fall von nCode aus case ncode<0:hookfunc=callnexthookex(hHookFunc, nCode, wParam, lParam) Fallwert 1: Verarbeitung 1: HookFunc=X1 case2:Verarbeitungsprozess 2:HookFunc=X1 … Ende auswählen end Funktion |
Der Rückgabewert der Funktion, wenn die Nachricht verarbeitet werden soll, übergeben Sie 0, andernfalls übergeben Sie 1 und essen die Nachricht.
(2) Installation und Ausführung von Haken. Zum Installieren von Hooks werden mehrere API-Funktionen verwendet: Sie können die API-Funktion SetWindowsHookEx() verwenden, um eine anwendungsdefinierte Hook-Subroutine in der Hook-Liste zu installieren. Die Deklaration der SetWindowsHookEx()-Funktion lautet wie folgt:
Deklarieren Sie die Funktion SetWindowsHookEx Lib user32 Alias SetWindowsHookExA(ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long |
Der idHook-Wert ist der Nachrichtentyp, den er verarbeitet; der lpfn-Wert ist der Adresszeiger der Hook-Subroutine. Wenn der Parameter dwThreadId 0 oder die Kennung eines von einem anderen Prozess erstellten Threads ist, muss lpfn auf die Hook-Subroutine in der DLL verweisen. Darüber hinaus kann lpfn auf einen Hook-Subroutinencode des aktuellen Prozesses verweisen. Der hMod-Wert ist das Handle der Anwendung und identifiziert die DLL, die die Unterroutine enthält, auf die lpfn zeigt. Wenn dwThreadId einen vom aktuellen Prozess erstellten Thread identifiziert und sich der Unterprogrammcode im aktuellen Prozess befindet, muss hMod 0 sein. Der dwThreadId-Wert ist die Kennung des Threads, der dem installierten Hook-Unterprozess zugeordnet ist. Wenn er 0 ist, ist der Hook-Unterprozess allen Threads zugeordnet. Wenn der Hook erfolgreich installiert wurde, wird das Handle des Hook-Unterprozesses zurückgegeben. Wenn die Installation fehlschlägt, wird 0 zurückgegeben.
Darüber hinaus sollte die Funktion CallNextHookEx() im Allgemeinen in der Hook-Subroutine aufgerufen werden, um die nächste Hook-Subroutine auszuführen, auf die die Hook-Liste verweist. Andernfalls erhalten Anwendungen mit anderen installierten Hooks keine Hook-Benachrichtigungen, was zu falschen Ergebnissen führt. Die Deklaration der Funktion CallNextHookEx() lautet wie folgt:
Deklarieren Sie die Funktion CallNextHookEx Libuser32 Alias CallNextHookEx(ByVal hHook As Long, ByVal ncode As Lonog, ByVal wParam As Long, lParam As Any) As Long |
Der hHook-Wert ist der Rückgabewert von SetWindowsHookEx() und nCode, wParam und lParam sind die drei Parameter in der Hook-Funktion. Bevor das Programm beendet wird, muss die Funktion UnhookWindowsHookEx() aufgerufen werden, um die mit dem Hook verknüpften Systemressourcen freizugeben. Die Funktion UnhookWindowsEx() wird wie folgt deklariert:
Deklarieren Sie die Funktion Unhook WindowsHookEx Lib user32 Alias Unhook WindowsHookEx(ByVal hHook As Long)As Long |
hHook ist der Rückgabewert bei der Installation des Hooks, also das Handle des Hook-Unterprozesses.
(3) Probleme, die bei der Installation von Hooks in VB beachtet werden sollten. Der lpfn-Parameter ist die Adresse eines HookFunc. VB legt fest, dass der HookFunc-Code in einem Standard-BAS-Modul platziert und als Adresse von HookFunc übergeben werden muss. Er kann nicht in einem Klassenmodul platziert oder an ein übergeordnetes Formular angehängt werden. Für RemoteHook sollte HookFunc in der Dynamic Link Library enthalten sein. Wenn Sie also RemoteHook in VB verwenden, müssen Sie auch zwei API-Funktionen verwenden: GetModuleHandle() und GetProcAddress(). Ihre Deklarationen lauten wie folgt:
Deklarieren Sie die Funktion GetModuleHandle Libkernel32 Alias GetModuleHandleA(ByVal lpModuleName As String) As Long Deklarieren Sie die Funktion GetProcAddress Lib kernel32 Alias GetProcAddress(ByVal hModule As Long, ByVal lpProcName As String) As Long |
Der hmod-Wert ist das Modulnamen-Handle, das den Hook-Prozess enthält. Wenn es sich um LocalHook handelt, kann der Wert Null sein (0 wird in VB übergeben), und wenn es RemoteHook ist, können Sie ihn mit GetModuleHandle (name.dll) übergeben .