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

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.xdnf.cn/news/920917.html

相关文章:

  • 【LLM大模型技术专题】「入门到精通系列教程」基于ai-openai-spring-boot-starter集成开发实战指南
  • Git开发实战
  • Android 相对布局管理器(RelativeLayout)
  • 多模型协同:基于 SAM 分割 + YOLO 检测 + ResNet 分类的工业开关状态实时监控方案
  • ZephyrOS 嵌入式开发Black Pill V1.2之Debug调试器
  • CSS 预处理器与工具
  • Spring中循环依赖问题的解决机制总结
  • ROS2,工作空间中新建了一个python脚本,需要之后作为节点运行。告诉我步骤?
  • 【选配电脑】CPU核显工作机控制预算5000
  • vue · 插槽 | $slots:访问所有命名插槽内容 | 插槽的使用:子组件和父组件如何书写?
  • Bugku-CTF-Web安全最佳刷题路线
  • ubuntu中使用docker
  • HBuilderX安装(uni-app和小程序开发)
  • Qt Quick Layout功能及架构
  • 篇章十 数据结构——Java对象的比较
  • 高频 PCB 技术发展趋势与应用解析
  • WaytoAGI东京大会开启AI全球化新对话:技术无国界,合作促创新
  • 功能安全实战系列09-英飞凌TC3xx LBIST开发详解
  • 开源分享|适合初创商家的餐饮系统,基于thinkphp8+element-plus
  • RXCDR_CFG参数选择
  • Rest-Assured API 测试:基于 Java 和 TestNG 的接口自动化测试
  • 8.库制作与原理
  • JS的 DOM 尺寸与位置属性
  • Faiss向量数据库全面解析:从原理到实战
  • Bootstrap Blazor中实现富文本框Editor组件的内容导出为docx格式的Word文档
  • 模式选择器中 编辑一些操作 和文件菜单一些操作
  • 本地主机部署开源企业云盘Seafile并实现外部访问
  • 二进制与十进制转换指南:深入理解数字系统转换
  • 【赵渝强老师】使用obd快速体验OceanBase
  • 分享两个日常办公软件:uTools、PixPin