可以禁用使用SetWindowsHookEx运行时创建的挂钩吗?

Jor*_*nco 3 c++ windows hook

如果一个名为SetWindowsHookEx的应用程序(我的,或者在外部进程中),我是否可以取消钩子?请记住,不是我把钩子放在第一位,所以我没有任何变量或指向原始钩子的指针.

Kev*_*ose 5

不,没有.

回到当天(在NT之前的时代),你可能已经开始玩一些你获得的HHOOK游戏,因为返回的HHOOK是要被调用的钩子链中的一个链接.即便如此,我也不确定这是可能的.

今天,Windows不会将链中下一个钩子的调用委托给你(因此对CallNextHookEx不推荐使用参数),而HHOOKs不会让你伸手去找你没有注册的钩子.


更准确地说,没有好的和受支持的方式来做到这一点.
您可以安装一个rootkit,深入了解Windows内部并找到钩子链; 但这显然是荒谬的 - 而且是危险的 - 长度.

挂钩(通过其中一个无数的API挂钩解决方案,Detours似乎很受欢迎)SetWindowsHookExCallNextHookEx可以为您提供符合NT前约定的应用程序.要点是在调用SetWindowsHookEx后立即取消挂钩新钩子,将任何传递的钩子(不是你自己的钩子)解开到CallNextHookEx.为了保证"干净"的应用程序,您还必须模拟许多事件以强制调用任何已调用的钩子,以便它们可以被取消挂钩.此外,一旦遇到过去8年以来写入的任何将NULL传递给CallNextHookEx的应用程序,此方案将失败.

因此,即使技术上可能(也许)解开HHOOK,你的应用程序没有注册,你可能最好不要尝试以一种不同的,不那么可怕的脆弱方式完成任何事情.


ral*_*nja 1

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

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