当前位置: 首页 > news >正文

Windows hook介绍与代码演示

Windows Hook 是一种机制,允许应用程序监视系统或处理特定事件。它可以拦截和更改消息,甚至可以插入到其他应用程序的消息处理机制中。Windows 提供了多种挂钩类型,例如键盘挂钩、鼠标挂钩、消息挂钩等。

hook代码实现

下面是一个使用 Windows 键盘挂钩(WH_KEYBOARD_LL)的简单 C++ 例子,记录所有键盘按键:

#include <windows.h>
#include <iostream>
#include <fstream>// 全局钩子句柄
HHOOK hHook = NULL;// 钩子回调函数
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {if (nCode >= 0) {if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {KBDLLHOOKSTRUCT *pKbDllHookStruct = (KBDLLHOOKSTRUCT *)lParam;DWORD vkCode = pKbDllHookStruct->vkCode;// 打印按键代码到控制台std::cout << "Key Pressed: " << vkCode << std::endl;// 将按键代码写入文件std::ofstream logfile("keylog.txt", std::ios_base::app);if (logfile.is_open()) {logfile << "Key Pressed: " << vkCode << std::endl;logfile.close();}}}return CallNextHookEx(hHook, nCode, wParam, lParam);
}// DLL 主函数
int main() {// 设置全局钩子hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);if (hHook == NULL) {std::cerr << "Failed to install hook!" << std::endl;return 1;}// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}// 卸载钩子UnhookWindowsHookEx(hHook);return 0;
}

代码说明

  1. KeyboardProc 函数:这是钩子的回调函数,当有键盘事件发生时会被调用。它将按键的虚拟键代码打印到控制台,并记录到 keylog.txt 文件中。
  2. SetWindowsHookEx:设置钩子,这里使用的是全局低级键盘钩子(WH_KEYBOARD_LL)。
  3. 消息循环GetMessage 循环保持应用程序运行并处理消息。
  4. UnhookWindowsHookEx:卸载钩子,清理资源。

运行结果如下:

在这里插入图片描述

请注意,键盘钩子可以用于记录用户的按键,在某些情况下可能会被误用为键盘记录器(keylogger)。务必遵循相关法律法规,并避免在未经授权的情况下使用此类技术。

hook应用

钩子机制是一个强大的工具,可以用于许多有趣的应用。下面是一些例子:

  1. 键盘记录器(Keylogger):虽然这可能被滥用,但在合法和道德的情况下,键盘记录器可以用于监控用户的按键活动,例如在教育环境中用于跟踪学生的打字速度和错误率。

  2. 热键管理器:通过键盘挂钩,可以实现自定义的全局热键,用于快速执行特定的操作或启动应用程序。

  3. 窗口管理器:使用窗口挂钩,可以监视和控制窗口的创建、销毁、移动、大小调整等操作,实现自定义的窗口管理功能。

  4. 输入法增强:通过消息挂钩,可以拦截和处理输入法相关的消息,实现自定义的输入法功能,如自动补全、快捷输入等。

  5. 游戏辅助工具:钩子可以用于编写游戏辅助工具,如自动按键、自动射击、自动施法等,但请注意,这可能会违反游戏的使用条款,导致账号封禁。

  6. 系统监控工具:使用钩子可以监视系统的各种活动,如文件操作、网络通信、进程创建等,用于编写系统监控工具或安全防护软件。

  7. 屏幕捕捉工具:通过窗口挂钩和绘图钩子,可以实现屏幕捕捉功能,用于录制屏幕视频或截图。

  8. 自动化任务:通过钩子可以监听和响应系统事件,实现自动化任务,如在特定条件下自动执行某些操作或发送通知。

需要注意的是,钩子机制具有潜在的安全风险,可能会被恶意程序利用,因此在开发钩子应用程序时,务必谨慎处理,并遵循相关的法律法规和道德准则。

相关文章:

  • Flutter 中的 ColoredBox 小部件:全面指南
  • python前端通过API接口调用与后端进行数据交互前端如何调用api接口获取电商平台商品实时评论信息数据
  • Python项目生成requirements.txt文件
  • Windows搭建Nginx代理本地盘的文件(共享路径或本地路径)
  • ROS2学习——节点话题通信(2)
  • 【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化
  • Python代码:十七、生成列表
  • 2005-2022年各省全体居民人均可支配收入数据(无缺失)
  • C++核心编程——4.7 多态
  • HttpClient cookie爬虫记录
  • 46. 全排列 - 力扣(LeetCode)
  • SpringJDBC
  • ubuntu24.04LVM扩容问题
  • 【强化学习04】Q学习时序差分法
  • 操作系统 - 输入/输出(I/O)管理
  • DataBase in Android
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Elasticsearch 参考指南(升级前重新索引)
  • JavaScript中的对象个人分享
  • java中具有继承关系的类及其对象初始化顺序
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Rancher如何对接Ceph-RBD块存储
  • Spring Cloud中负载均衡器概览
  • spring security oauth2 password授权模式
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Web标准制定过程
  • 初识 webpack
  • 服务器之间,相同帐号,实现免密钥登录
  • 规范化安全开发 KOA 手脚架
  • 前端存储 - localStorage
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 阿里云重庆大学大数据训练营落地分享
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​浅谈 Linux 中的 core dump 分析方法
  • $ git push -u origin master 推送到远程库出错
  • ${ }的特别功能
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (175)FPGA门控时钟技术
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (python)数据结构---字典
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (十六)串口UART
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (原)本想说脏话,奈何已放下
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)jdk与jre的区别
  • *p++,*(p++),*++p,(*p)++区别?
  • ./configure,make,make install的作用
  • .describe() python_Python-Win32com-Excel