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

win32相关(消息Hook)

消息Hook


要想实现消息Hook需要使用到三个相关的Api

  1. SetWindowsHookEx // 设置钩子
  2. CallNextHookEx // 将钩子信息传递到当前钩子链中的下一个子程序
  3. UnhookWindowsHookEx // 卸载钩子

我们编写的消息钩子需要将设置钩子的函数写到dll里面,当钩住一个线程后,产生消息时,如果系统发现包含的钩子dll不在当前进程中,系统就会将这个钩子dll强行加载进去,这也算是一种注入的手段

HHOOK SetWindowsHookExW([in] int       idHook,		// 要Hook的消类型[in] HOOKPROC  lpfn,			// 对应要Hook的消息类型的回调函数[in] HINSTANCE hmod,			// 当前dll的实例句柄[in] DWORD     dwThreadId		// 要Hook的线程id(如果为0则表示挂钩所有线程消息)
);

主要功能dll部分

// hookdll.h#pragma one#include<iostream>
#include<Windows.h>extern "C" _declspec(dllexport) BOOL __stdcall unInstallHook();extern "C" _declspec(dllexport) BOOL __stdcall InstallHook();===============================================================
// hookdll.cpp#include "hookdll.h"HINSTANCE g_hDllInstance = NULL;
HHOOK g_hKeyBoarHook = NULL;// 键盘钩子
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) {if (code == HC_ACTION) {BYTE KeyState[256]  = { 0 };// GetKeyboardState 用于获取所有虚拟键的当前状态(按下或释放)if (GetKeyboardState(KeyState)) {LONG keyInfo = lParam;// 获取键值UINT keyCode = (keyInfo >> 16) & 0x00ff;WCHAR wkeyCode = 0;// 转换为Ascii字符ToAscii((UINT)wParam,keyCode,KeyState,(LPWORD)&wkeyCode,NULL); CHAR strInfo[24] = { 0 };sprintf_s(strInfo,_countof(strInfo),"[消息Hook][按键:%c]",wkeyCode);OutputDebugStringA(strInfo);return 0;}}// 把钩子传递给下一个钩子return CallNextHookEx(g_hKeyBoarHook, code, wParam, lParam);}// 卸载钩子
BOOL unInstallHook() {return UnhookWindowsHookEx(g_hKeyBoarHook);
}BOOL InstallHook() {g_hKeyBoarHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc, g_hDllInstance,NULL);if (g_hKeyBoarHook) {return TRUE;}return FALSE;
}BOOL DllMain(HINSTANCE hInstance,DWORD dwCallReason,LPVOID lpResverd) {// 当前模块的实例句柄switch (dwCallReason) {case DLL_PROCESS_ATTACH:g_hDllInstance = hInstance;break;}return TRUE;
}

调用程序编写

#include<windows.h>
#include<iostream>// 定义函数指针
typedef BOOL(*installHook)();
typedef BOOL(*unInstallHook)();int main() {HMODULE hModule = LoadLibraryW(L"消息Hook.dll");installHook myInstallHook = (installHook)GetProcAddress(hModule, "InstallHook");unInstallHook myUnInstallHook = (unInstallHook)GetProcAddress(hModule, "unInstallHook");if (myInstallHook()) {printf("Hook成功!");}system("pause");myUnInstallHook();return 0;
}

实现效果

在这里插入图片描述

http://www.lryc.cn/news/2403922.html

相关文章:

  • vue3单独封装表单校验函数
  • mysql 页的理解和实际分析
  • 分享一道力扣
  • 青少年编程与数学 01-011 系统软件简介 06 Android操作系统
  • 构建 MCP 服务器:第 2 部分 — 使用资源模板扩展资源
  • 【算法设计与分析】实验——汽车加油问题, 删数问题(算法实现:代码,测试用例,结果分析,算法思路分析,总结)
  • Ubuntu2404 下搭建 Zephyr 开发环境
  • 现代C++特性(一):基本数据类型扩展
  • 【C++进阶篇】C++11新特性(下篇)
  • 全生命周期的智慧城市管理
  • echarts柱状图实现动态展示时报错
  • Redis故障转移
  • STM32学习笔记:定时器(TIM)原理与应用(详解篇)
  • JAVA获取ES连接并查询所有数据
  • 408第一季 - 数据结构 - 线性表
  • 第23讲、Odoo18 邮件系统整体架构
  • 【QT面试题】(三)
  • DeepSeek09-open-webui使用
  • HarmonyOS:Counter计数器组件
  • 数据类型 -- 字符
  • WordZero:让Markdown与Word文档自由转换的Golang利器
  • sqlsugar WhereIF条件的大于等于和等于查出来的坑
  • Pandas 技术解析:从数据结构到应用场景的深度探索
  • 数据库系统概论(十七)超详细讲解数据库规范化与五大范式(从函数依赖到多值依赖,再到五大范式,附带例题,表格,知识图谱对比带你一步步掌握)
  • [c#]判定当前软件是否用管理员权限打开
  • 并发编程实战(生产者消费者模型)
  • 分布式微服务系统架构第144集:FastAPI全栈开发教育系统
  • el-tabs 切换时数据不更新的问题
  • git小乌龟不显示图标状态解决方案
  • 获取 OpenAI API Key