ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

如何嗅探系统里的每一条热键?Hotkey Detective全局钩子检测原理完整解析

如何嗅探系统里的每一条热键?Hotkey Detective全局钩子检测原理完整解析 如何嗅探系统里的每一条热键Hotkey Detective全局钩子检测原理完整解析【免费下载链接】hotkey-detectiveA small program for investigating stolen key combinations under Windows 7 and later.项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detectiveHotkey Detective是一款小巧的 Windows热键检测工具热键嗅探器用于揪出到底是哪个进程占用了你注册的全局热键。它通过Windows 全局钩子 DLL 注入 内存映射文件的组合拳在你按下被偷走的热键时直接显示出凶手进程的完整路径无需反复猜测、无需重启系统。本文将完整解析它的WM_HOTKEY 捕获与进程反查原理并附上上手与自建指南。一、什么是全局热键它又是被谁偷走的在 Windows 中应用程序可以用RegisterHotKeyAPI 向系统注册一个组合键如CtrlShiftF12。注册成功后即使用户正在别的程序里打字按下该组合键时系统也会向注册者发送一条WM_HOTKEY消息——这就是全局热键。问题在于系统没有任何 API 可以列出谁注册了哪些全局热键。当你发现某个组合键按了没反应时唯一的线索就是这条WM_HOTKEY消息到底发给了哪个窗口、哪个进程 这就是 Hotkey Detective 要回答的问题。二、为什么不用暴力枚举传统工具的致命缺陷你可能搜到过用Hotkey Explorer之类的工具来解决热键被谁占用它们的思路是遍历所有可能的按键组合并逐一触发看谁有反应。在 Windows 7 上还能勉强工作但 Windows 8 及以后系统取消了抑制按键的能力暴力触发意味着所有按键组合都会真实地发给系统和其他程序——轻则误触菜单重则触发危险快捷键。Hotkey Detective 的做法完全不同它不主动尝试任何组合键而是被动监听——等你自己按下那条被偷的热键它立刻告诉你接收者是谁。无副作用、零误触。三、检测原理四步曲从共享内存到揪出进程整个方案可以拆成四个环环相扣的步骤对应源码里的 Core.cpp、HkdHook.cpp 和 MainWindow.cpp。步骤 1内存映射文件——跨进程公共白板主程序启动时创建一个命名内存映射文件Local\HkdSharedData见 Core.cpp结构定义在 HkdHook.h里面只放两样东西共享字段作用injectCounter原子计数器记录 DLL 被加载进了多少个进程hkdWindowHandle侦探主窗口的句柄供被注入进程回报消息同时创建一个命名事件Local\HkdTerminateEvent作为日后全体退出的发令枪。步骤 2全局钩子——DLL 自动注入所有进程的关键主程序调用 DLL 里的setupHook见 HkdHook.cpp依次设置两种全局钩子WH_GETMESSAGE监控从消息队列取出的每条消息WH_CALLWNDPROC监控送入窗口过程前的每条消息这里有一个精妙的 Win32 机制全局钩子的钩子过程必须放在一个 DLL 里系统会自动把这个 DLL 加载进所有进程——这正是 Hotkey Detective 实现无侵入式注入的方式无需手动CreateRemoteThread。DLL 被加载进某个进程时DllMain会做三件聪明事见 HkdHook.cppexplorer.exe直接拒绝加载返回 false系统壳进程讨厌被注入自己进程里加载但什么都不初始化其余进程则映射共享内存、递增injectCounter并起一个终结线程无限等待那个命名事件——事件一旦触发就FreeLibraryAndExitThread自裁这是程序退出时各进程卸载 DLL 的机制。步骤 3钩子过程盯住WM_HOTKEY钩子过程本身极轻见 hookGetMessage 与 hookWndProc每条消息只检查一件事——消息 ID 是不是WM_HOTKEY。命中后把目标窗口句柄和原始按键数据打包成一条WM_NULL消息通过PostMessageW直接投递给共享内存里存的主窗口句柄然后立刻放行CallNextHookEx绝不干扰受害者程序。步骤 4由窗口句柄反查凶手进程主窗口的消息循环收到WM_NULL后见 MainWindow.cpp用GetWindowThreadProcessId由窗口句柄拿到进程 ID用OpenProcessQueryFullProcessImageName反查出进程完整路径见 Core.cpp把WM_HOTKEY的lParam按位域解析成人类可读的组合键字符串见 KeySequence.cpp连同进程路径一起插入列表视图HotkeyTable.cpp。✅ 至此界面上就出现了一行Ctrl Shift F12→C:\xxx\nasty-app.exe真凶一目了然。四、为什么需要双钩子WM_HOTKEY既可能走GetMessage路径、也可能走SendMessage直发窗口过程的路径只挂一个钩子会漏报。所以 Core::setHooks 同时挂起WH_GETMESSAGE和WH_CALLWNDPROC两条监听线确保任何投递方式的WM_HOTKEY都逃不掉。另外主程序自身也在消息循环里拦截WM_KEYDOWN/WM_KEYUP见 main.cpp如果你在侦探窗口里按的组合键没有被任何人注册它会标注为[Unassigned]展示出来——等于帮你顺带确认这条组合键是空闲的。五、快速上手3 步揪出占用热键的进程从 Releases 页面下载 ZIP 包进入x64目录x86 系统进x86目录以管理员身份运行HotkeyDetective.exe程序会用CheckTokenMembership检查权限并给出警告见 WindowsUtils.cpp 与 main.cpp按下被占用的全局热键表格中立即出现对应的进程路径。 小贴士x64 系统若没查到结果再试一次 x86 版本——32 位进程的热键只有同位宽钩子能看到。六、常见问题排雷指南症状原因与对策表格没有结果① 确认以管理员运行② x64 系统下 x86/x64 两个版本都试一遍③ 确认该热键是真正全局注册的——浏览器里仅前台生效的CtrlT这类本地快捷键系统根本不知道自然查不到用完后删不掉程序文件注入的 DLL 仍驻留在各进程中无法卸载官方已知问题重启系统即可彻底清除退出时进度条卡一会退出对话框会轮询injectCounter归零CloseDialog.hpp表示各进程的 DLL 正在自行卸载属正常现象七、从零构建两条 CMake 命令项目采用 C17 CMake 构建主程序与钩子 DLL 分别由 CMakeLists.txt 和 dll/CMakeLists.txt 定义获取源码git clone https://gitcode.com/gh_mirrors/ho/hotkey-detective配置与编译cmake -B build→cmake --build build需 Windows 平台 MSVC 工具链产出HotkeyDetective.exe与hotkey_hook.dll两个交付物八、核心模块路径速查 模块路径职责程序入口与消息循环src/main.cpp权限检查、按键拦截核心调度共享内存 钩子src/Core.cpp / include/Core.h建映射文件、装卸钩子钩子 DLL监听 自卸载dll/HkdHook.cpp / dll/HkdHook.hWM_HOTKEY捕获、进程注入逻辑主窗口结果反查src/MainWindow.cpp接收回报、反查进程路径结果表格src/HotkeyTable.cppListView 展示热键与进程键组合解析src/KeySequence.cpp修饰键追踪、WM_HOTKEY位域解码权限检查工具src/WindowsUtils.cpp管理员检测退出进度对话框include/CloseDialog.hpp等待 DLL 全部卸载一句话总结Hotkey Detective 用全局钩子自动注入 DLL当眼线、用内存映射文件当对讲机把 Windows 藏起来的WM_HOTKEY收发货现场完整还原——这也是理解 Windows 消息机制与钩子技术的一个绝佳小型范例。【免费下载链接】hotkey-detectiveA small program for investigating stolen key combinations under Windows 7 and later.项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进