5

如果一个名为 SetWindowsHookEx 的应用程序(例如我的,或在外部进程中),我可以解开挂钩吗?请记住,不是我把钩子放在首位,所以我没有任何变量或指向原始钩子的指针。

4

3 回答 3

5

不,没有。

回到过去(NT 之前的时代),您可能已经使用您获得的 HHOOK 玩了一些游戏,因为返回的HHOOK 是要调用的钩子链中的一个链接。即使那样,我也不确定这是否可能。

今天,Windows 不会将链中下一个钩子的调用委托给您(因此不推荐使用CallNextHookEx的参数),并且 HHOOK 不会让您接触到您不再注册的钩子。


更准确地说,没有好的和受支持的方法可以做到这一点。
您可以安装一个 rootkit,深入研究 Windows 内部结构并通过这种方式找到钩子链;但这显然是荒谬和危险的。

挂钩(通过那里的无数 API 挂钩解决方案之一,Detours似乎很受欢迎)SetWindowsHookExCallNextHookEx可以为您提供符合 pre-NT 约定的应用程序的大部分方式。要点是在调用 SetWindowsHookEx 后立即解开新的钩子,解开任何传递的钩子(不是你自己的)到 CallNextHookEx。为了保证一个“干净”的应用程序,您还必须模拟一些事件来强制调用任何已调用的钩子,以便它们可以被取消钩子。此外,一旦您遇到在过去 8 年以上编写的任何将 NULL 传递给 CallNextHookEx 的应用程序,此机制就会失败。

因此,即使从技术上来说(可能)解开您的应用程序未注册的 HHOOK,您最好还是尝试以一种不同的、不那么可怕的脆弱方式来完成您正在做的任何事情。

于 2009-06-16T09:55:00.677 回答
1

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

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

于 2009-06-16T09:51:00.840 回答
1

实际上,我想我发现是的,这是可能的。Hooking CallNextHook 会给你钩子的钩子 id,你可以用它来解钩。

于 2009-06-16T12:38:36.117 回答