可能禁用一个使用SetWindowsHookEx运行时间的钩子?

如果一个叫做SetWindowsHookEx的应用程序(例如我的,或者在一个外部的进程中)可以让我解开钩子? 请记住,不是我把钩子放在第一位,所以我没有任何一种variables或指向原始钩子的指针。

不,没有。

回到当初 (NT时代之前),您可能已经拿出了一个HHOOK玩游戏,因为返回的HHOOK是被调用的钩子链中的一个链接 。 即使那样我也不确定这是可能的。

今天,Windows不会委托链中的下一个钩子的调用(因此CallNextHookEx的弃用参数),HHOOK不会让你伸出钩子,你没有注册了。


更恰当地说,没有一个好的支持方式来做到这一点。
你可以安装一个rootkit,深入Windows内部,找到这个钩子链; 但是这显然会变得荒谬和危险。

钩子(通过无数的API钩子解决方案之一, Detours似乎很受欢迎) SetWindowsHookEx和CallNextHookEx可以让你大部分的方式符合NT之前的惯例的应用程序。 要点是在调用SetWindowsHookEx之后立即解除新挂钩,解除挂钩(不是你自己的)到CallNextHookEx。 为了保证一个“干净”的应用程序,你还必须模拟一些事件来强制任何已经调用的钩子被调用,以便它们可以被解除钩住。 此外,只要遇到在过去8年中写入的将CallNextHookEx传递给NULL的任何应用程序,就会失败。

所以,即使技术上可能(或许)解开HHOOK,你的应用程序没有注册,你可能更好的做法是以不同的,不太可怕的方式完成它。

我不认为你可以。 您需要使用SetWindowsHookEx()注册的钩子的句柄,以便您可以使用UnhookWindowsHookEx()

Hmms顺便说一句,如果你以某种方式可以创建自己的钩子之前,任何其他钩子注册(即在应用程序启动),你可以在该钩子选择不调用CallNextHookEx() ,从而防止后来的钩子被调用。 可能值得一试。 我怀疑这可能不适用于所有类型的钩子。

其实我觉得我发现是的,这是可能的。 挂钩CallNextHook会给你钩子的钩子ID,你可以使用它来解除挂钩。