如果一个应用程序(我的,或者在一个外部进程中,例如)叫做 SetWindowsHookEx,我可以解开钩子(Hook)吗?请记住,首先创建钩子(Hook)的不是我,所以我没有任何类型的变量或指向原始钩子(Hook)的指针。

最佳答案

不,没有。

回到当天(NT 之前的时代),您可能会使用获得的 HHOOK 玩一些游戏,因为返回的 HHOOK was a link in the chain of hooks 将被调用。即便如此,我也不确定这是否可能。

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

更准确地说,没有 好的和受支持的 方法来做到这一点。
你可以安装一个 rootkit,深入挖掘 Windows 内部结构,然后通过这种方式找到钩子(Hook)链;但这显然是荒谬的——而且是危险的——长度。

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

因此,即使在技术上(也许)可以解除应用未注册的 HHOOK,但您最好尝试以不同的、不那么可怕的方式完成您所追求的任何事情。

关于c++ - 可以禁用使用 SetWindowsHookEx 运行时创建的 Hook 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1000472/

10-14 08:45