【问题标题】:What happens to a global hook when an executable process that hosts it crashes?当托管它的可执行进程崩溃时,全局钩子会发生什么?
【发布时间】:2016-11-02 01:02:06
【问题描述】:

说,如果我在我的可执行进程中设置了global hook procedure

//Set global hook
hHook = ::SetWindowsHookEx(WH_KEYBOARD_LL, HookWndProc_WH_KEYBOARD_LL,
          ::GetModuleHandle(NULL), NULL);

这个进程崩溃了。

这个全局钩子会发生什么?

【问题讨论】:

  • 钩子被移除了。
  • 是什么让您认为这将是一个 global 挂钩程序?全局挂钩必须驻留在dll 中,GetModuleHandle(NULL) 返回一个exe 句柄。
  • @dxiv:将0x0(不知道为什么OP 使用NULL)将dwThreadId 传递给SetWindowsHookEx 使其成为全局挂钩。低级键盘钩子不需要在 DLL 中实现(请参阅LowLevelKeyboardProc“在安装它的线程的上下文中调用此钩子。”)。与将 DLL 注入目标进程的其他全局挂钩不同,此挂钩是通过消息发送实现的。
  • @dxiv:why low-level hooks aren't injected 的解释很好。
  • @IInspectable 您对 LL 挂钩是正确的,感谢您的更正。 FWIW 甚至 SetWindowsHookEx 的 MSDN 页面在这一点上都是错误的:hMod [in] - Type: HINSTANCE - A handle to the *DLL* containing the hook procedure pointed to by the lpfn parameter.

标签: c++ windows winapi hook


【解决方案1】:

当线程退出时 - 系统删除由该线程创建的钩子(在 win32k.FreeThreadsWindowHooks 中) - 所以如果线程退出,没有 UnhookWindowsHookEx 它将被自动删除。进程崩溃 -> 它线程退出 -> 钩子被移除。所以没有什么可以担心系统级别的。最坏的变种 - 当带有 HookWndProc_WH_KEYBOARD_LL 的线程挂起或没有在循环中调用 GetMessage/PeekMessage 时,但没有死。在这种情况下,每个按键按下事件都会延迟几秒钟

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2015-02-26
相关资源
最近更新 更多