Les hooks dans les systèmes Windows ont des fonctions très puissantes. Grâce à cette technologie, presque tous les messages des systèmes Windows peuvent être interceptés, surveillés et traités. Cette technologie peut être largement utilisée dans divers logiciels, en particulier les logiciels nécessitant une surveillance, un enregistrement automatique et d'autres fonctions de surveillance du système. Cet article aborde ce sujet, dans l’espoir de servir de référence aux lecteurs.
1. Mécanisme et type de crochet
Les applications Windows sont toutes basées sur des messages et le fonctionnement de l'application dépend du type et du contenu du message qu'elle reçoit. Les hooks sont similaires au mécanisme de traitement d'interception des interruptions Dos. Hook est une plate-forme de mécanisme de traitement de messages Windows. En installant divers hooks, l'application peut y configurer des sous-programmes pour surveiller certains messages dans la fenêtre spécifiée et traiter le message avant qu'il n'atteigne la fenêtre cible.
Sous Windows, il existe deux types de hooks, l'un est le hook système (RemoteHook), qui surveille les messages dans l'ensemble du système, et l'autre est le hook de thread (LocalHook), qui intercepte uniquement les messages au sein du processus. Pour les hooks système, la fonction hook (HookFunction) doit être implémentée dans la bibliothèque de liens dynamiques (DLL) du système Windows. Pour les hooks de thread, la fonction hook peut être implémentée dans la DLL ou dans l'application correspondante. En effet, lorsqu'un développeur crée un hook, Windows crée d'abord une structure de données dans la mémoire système, qui contient des informations sur le hook, puis ajoute la structure à la liste de hooks existante, et les nouveaux Hooks seront triés devant les anciens. crochets. Lorsqu'un événement se produit, si un hook local est installé, la fonction hook du processus en cours sera appelée. S'il s'agit d'un hook distant, le système doit insérer la fonction hook dans l'espace d'adressage des autres processus. Pour ce faire, la fonction hook doit être dans une bibliothèque de liens dynamiques, donc si vous souhaitez utiliser un hook distant, vous devez le mettre. le hook Mettez la fonction dans la bibliothèque de liens dynamiques. Pour les types de messages surveillés par les hooks, Windows fournit un total des types suivants : Comme indiqué dans le tableau 1 :
Tableau 1. Types de messages Windows
Identifiant constant du type de message | valeur | Type de message | Champ d'application |
WH_CALLWNDPROC | 4 | Message envoyé à la fenêtre | fil ou système |
WH_CALLWNDPROCRET | 12 | Le message renvoyé par la fenêtre | fil ou système |
WH_CBT | 5 | Messages tels que les changements de fenêtre et les paramètres de focus | fil ou système |
WH_DEBUG | 9 | S'il faut exécuter des Hooks d'autres Hooks | fil ou système |
WH_FOREGROUNDIDLE | 11 | Le programme de premier plan est inactif | fil ou système |
WH_GETMESSAGE | 3 | Messages publiés dans la file d'attente des messages | fil ou système |
LECTURE WH_JOURNAL | 1 | Lire les messages enregistrés | système |
WH_JOURNALRECORD | 0 | Surveiller et enregistrer les messages d'entrée | système |
WH_KEYBOARD | 2 | Messages du clavier | fil ou système |
WH_MOUSE | 7 | message de la souris | fil ou système |
WH_MSGFILTER | -1 | Barres de défilement des menus, messages de dialogue | fil ou système |
WH_SHELL | 10 | messages du shell | fil ou système |
WH_SYSMSGFILTER | 6 | Barres de défilement des menus, messages de dialogue pour tous les fils de discussion | système |
2. Implémentation de hooks dans la programmation VB
(1) Format de la fonction hook (fonction HOOK). La fonction Hook est en fait une fonction. S'il s'agit d'un hook système, la fonction doit être placée dans la bibliothèque de liens dynamiques. Cette fonction a un certain format de paramètre, qui est le suivant en VB :
Fonction privée HookFunc (ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long |
Parmi eux, nCode représente la situation dans laquelle le hook est généré, et il existe différents ensembles de valeurs possibles en fonction du hook ; les valeurs de retour des paramètres wParam et lParam incluent le contenu du message surveillé, qui varie ; avec le type de message surveillé par le Hook. Il diffère selon la valeur de nCode. Pour les fonctions hook définies avec VB, la forme générale du framework est la suivante :
Fonction privée HookFunc (ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Sélectionnez le cas de nCode cas ncode<0:hookfunc=callnexthookex(hHookFunc, nCode, wParam, lParam) valeur de cas 1 : Traitement 1 : HookFunc=X1 case2 : Processus de traitement 2 : HookFunc = X1 … fin de la sélection fonction de fin |
La valeur de retour de la fonction Si le message doit être traité, passez 0, sinon passez 1 et mangez le message.
(2) Installation et exécution de crochets. Plusieurs fonctions API sont utilisées pour installer des hooks : Vous pouvez utiliser la fonction API SetWindowsHookEx() pour installer un sous-programme de hook défini par l'application dans la liste des hooks. La déclaration de la fonction SetWindowsHookEx() est la suivante :
Déclarer la fonction SetWindowsHookEx Lib user32 Alias SetWindowsHookExA(ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long |
La valeur idHook est le type de message qu'il gère ; la valeur lpfn est le pointeur d'adresse du sous-programme hook. Si le paramètre dwThreadId est 0 ou l'identifiant d'un thread créé par un autre processus, lpfn doit pointer vers le sous-programme hook dans la DLL. De plus, lpfn peut pointer vers un code de sous-programme hook du processus en cours. La valeur hMod est le handle de l'application, identifiant la DLL qui contient le sous-programme pointé par lpfn. Si dwThreadId identifie un thread créé par le processus en cours et que le code du sous-programme se trouve dans le processus en cours, hMod doit être égal à 0. La valeur dwThreadId est l'identifiant du thread associé au sous-processus hook installé. Si elle est égale à 0, le sous-processus hook est associé à tous les threads. Si le hook est installé avec succès, le handle du sous-processus du hook sera renvoyé. S'il échoue, 0 sera renvoyé.
De plus, la fonction CallNextHookEx() doit généralement être appelée dans le sous-programme de hook pour exécuter le sous-programme de hook suivant pointé par la liste de hooks. Sinon, les applications avec d'autres hooks installés ne recevront pas de notifications de hook, ce qui entraînera des résultats incorrects. La déclaration de la fonction CallNextHookEx() est la suivante :
Déclarer la fonction CallNextHookEx Libuser32 Alias CallNextHookEx (ByVal hHook As Long, ByVal ncode As Lonog, ByVal wParam As Long, lParam As Any) As Long |
La valeur hHook est la valeur de retour de SetWindowsHookEx() et nCode, wParam et lParam sont les trois paramètres de la fonction Hook. Avant la fin du programme, la fonction UnhookWindowsHookEx() doit être appelée pour libérer les ressources système associées au hook. La fonction UnhookWindowsEx() est déclarée comme suit :
Déclarer la fonction Décrocher WindowsHookEx Lib user32 Alias Décrocher WindowsHookEx(ByVal hHook As Long)As Long |
hHook est la valeur de retour lors de l'installation du hook, c'est-à-dire le handle du sous-processus du hook.
(3) Problèmes auxquels il convient de prêter attention lors de l'installation de hooks dans VB. Le paramètre lpfn est l'adresse d'un HookFunc. VB stipule que le code HookFunc doit être placé dans un module .BAS standard et transmis en tant qu'adresse de HookFunc. Il ne peut pas être placé dans un module de classe ou attaché à un formulaire supérieur. Pour RemoteHook, HookFunc doit être inclus dans la bibliothèque de liens dynamiques, donc si RemoteHook est utilisé dans VB, deux fonctions API, GetModuleHandle() et GetProcAddress(), seront également utilisées. Leurs déclarations sont les suivantes :
Déclarer la fonction GetModuleHandle Libkernel32 Alias GetModuleHandleA(ByVal lpModuleName As String) As Long Déclarer la fonction GetProcAddress Lib kernel32 Alias GetProcAddress (ByVal hModule As Long, ByVal lpProcName As String) As Long |
La valeur hmod est le handle du nom du module contenant le processus hook. S'il s'agit de LocalHook, la valeur peut être Null (0 est transmis dans VB), et s'il s'agit de RemoteHook, vous pouvez utiliser GetModuleHandle (name.dll) pour la transmettre. .