2009-06-16 5 views
3

Si une application (la mienne, ou dans un processus externe, par exemple) appelée SetWindowsHookEx, serait-il possible pour moi de décrocher le hook? Rappelez-vous que ce n'est pas moi qui ai fait la première place, donc je n'ai aucun type de variables ou de pointeurs vers les hooks d'origine.Possible de désactiver un hook fait avec SetWindowsHookEx runtime?

+1

Bien que je n'ai pas de solution pour le moment, je pense que cela devrait être possible. Fondamentalement, chaque AntiSpyware/Virusscanner doit utiliser ceci ou une fonctionnalité équivalente, par exemple pour trouver et décrocher des keyloggers. Bonne question! – merkuro

+0

Je viens de trouver un programme appelé "Rootkit Unhooker 3.8". Ce qui fait à peu près ce que vous voulez, mais toujours pas de longs échantillons de code: http://www.rootkit.com/newsread.php?newsid=902 Bien que je considère cette page légitime, vous voulez probablement télécharger une ancienne version d'un site plus digne de confiance. – merkuro

+0

Je ne pense pas que les rootkits se préoccupent des HHOOKs. Ils sont tellement plus profonds dans le système que je doute qu'ils aient jamais besoin de ce mécanisme particulier. –

Répondre

1

Je ne pense pas que vous le pouvez. Vous avez besoin de la poignée au crochet qui a été inscrit SetWindowsHookEx() afin que vous puissiez décrochez avec UnhookWindowsHookEx()

HMM BTW, si vous pouviez créer votre propre crochet avant tout autre crochet est inscrit (c.-à- pendant le démarrage de l'application), vous pouvez dans ce crochet choisir de ne pas appeler CallNextHookEx() et ainsi empêcher les crochets suivants d'être appelés. Cela pourrait valoir le détour. Je soupçonne que cela pourrait ne pas être possible pour tous les types de crochets.

5

Non, il n'y en a pas. De retour dans la journée (avant l'ère NT), vous avez peut-être déjà joué à des jeux avec un HHOOK que vous avez obtenu, car le HHOOK was a link in the chain of hooks retourné a été appelé. Même alors je ne suis pas sûr que c'était possible.

Aujourd'hui, Windows ne vous délègue pas l'appel du crochet suivant dans la chaîne (donc le paramètre obsolète à CallNextHookEx) et les HHOOKs ne vous permettent pas de tendre la main aux hooks que vous n'avez plus enregistrés.


Plus correctement, il n'y a pas bonne et soutenu façon de le faire.
Vous pouvez installer un rootkit, creuser profondément dans Windows internes et trouver la chaîne de crochet de cette façon; mais cela va évidemment à ridicule - et dangereux - longueurs.

Accrocher (via l'une des solutions d'accrochage API myriade là-bas, Detours semble populaire) SetWindowsHookEx et CallNextHookEx pouvez-vous obtenir la plupart du chemin pour les applications qui sont conformes aux conventions pré-NT. L'essentiel est de décrocher immédiatement les nouveaux hooks après les appels à SetWindowsHookEx, décrochez les hooks passés (qui ne sont pas les vôtres) à CallNextHookEx. Pour garantir une application "propre", vous devez également simuler un certain nombre d'événements pour forcer les hooks déjà appelés à être invoqués afin qu'ils puissent être décrochés. En outre, ce régime échouera dès que vous rencontrerez l'une des applications écrites au cours des 8 dernières années qui passent NULL à CallNextHookEx.

Ainsi, même si elle est techniquement possible (peut-être) à décrochez HHOOKs votre application n'a pas enregistré, vous êtes probablement mieux essayer d'accomplir quoi que ce soit que vous êtes après une autre façon, moins horriblement fragile.

1

En fait, je pense avoir découvert que oui, c'est possible. Accrocher CallNextHook vous donnera l'identifiant du crochet, que vous pouvez utiliser pour décrocher.

+0

Par curiosité professionnelle et désir d'obtenir une réponse «correcte»; pouvons-nous obtenir un code à cet effet dans cette réponse? –

+0

Juste utilisé une API appelée Deviare, vous pouvez google it. Il vous permet d'accrocher des fonctions dans 5 lignes, donc vous devez juste attacher CallNextHook, et si hook! = 0, appelez UnhookWindowsEx() dessus. –

+2

Vous n'avez pas été obligé de passer le hook à CallNextHookEx depuis Windows Me, donc ça va casser pour certaines applications. En outre, le hook doit être exécuté au moins une fois avant de pouvoir le décrocher afin de ne pas pouvoir dire "cette application n'est pas accrochée par [hook type here]". Peu importe, je mettrai à jour ma réponse pour la rendre plus "complète". –

Questions connexes