Hook技术简介

PostgreSQL的学习心得和知识总结(八十六)|深入理解PostgreSQL数据库HOOK技术及开源hooks文档介绍 HOOK技术 阅读详情
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。这和前面我博客的窗口子类化都异曲同工,但是Hook可强大多了,我是这两天才开始看的,所以略知皮毛。

/* 钩子的原理 */

我听完孙鑫老师C++教程里的解释,觉得还是把Hook讲得比较形象,加上我自己的一些理解就觉得Hook原理不是很难。windows一直都是有自己处理各种消息的函数,Hook其实就能够做到程序员自己处理自己感兴趣的事情。这样说,假设Windows的消息就是马路上的车辆,一般情况下是Windows自己派人在检查,然后呢,Hook是拥有这个能力能在Windows自己安排的检查站之前也进行抽查,Hook根据程序员的需求可以变化,比如我就感兴趣100万以上的车(可能是走私的(*^__^*)),Hook就能在检查的时候专门找100万以上的车,至于其他不上档次的车Hook就放行,交还给Windows自己的检查站。同样Hook可以“为所欲为”,可以擅自设立一个检查站,也可以两个,三个···换成程序来说,钩子函数的工作原理是:当我们创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果我们安装的是一个局部钩子(下面有解释,暂时理解为你程序本身中的),我们进程中的钩子函数将被调用。

/* 钩子链表和函数 */

每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。钩子子程是一个应用程序定义的回调函数(CALLBACKFunction),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。
钩子子程必须按照以下的语法:

LRESULT CALLBACK HookProc
(
  int nCode, //指定是否需要处理该消息 
WPARAM wParam, 
LPARAM lParam  //包含该消息的附加消息 ,
);
这个回调函数的名字可以随你取,但形式可一定要满足以上要求,其实钩子的回调函数和Windows的差不多一个德行。看看钩子函数的返回值,若是返回非0值,表示我们已经自己处理了该消息,则消息就不被传递到目标窗口过程。
看看LRESULT CallNextHookEx
( HHOOK hhk;
int nCode;
WPARAM wParam;

LPARAM lParam;)这个函数把钩子信息传递给下一个钩子函数,也就是可以理解成把车辆放行到下一个检查站,这个可以根据自己的需要进行调用。若是我们只设定了一个钩子函数,那么我们假设把钩子消息用CallNextHookEx传给下个钩子函数,因为不存在所以就传递回了目标窗口函数。


/* 钩子的安装和释放 */

调用SetWindowHookEx函数,该函数的原型如下:
HHOOK SetWindowsHookEx( int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId );返回值是一个hook的句柄。
idHook是我们感兴趣的消息类型,比如我们对鼠标消息感兴趣就是WH_MOUSE,再者比如键盘消息WH_KEYBOARD,我们可以通过查找Win32 API使用手册来找到自己感兴趣的消息。
第二个参数是钩子函数的地址,这里就有两种情况:其实钩子有两种,一种是局部钩子,这种钩子只能关注自己所在的进程的事件,另一种钩子叫做远程钩子,这里又有两种:1.基于线程的它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。2.系统范围的 将捕捉系统中所有进程将发生的事件消息。 看上去局部钩子的功能没有远程钩子的给力,但是凡事都是要付出代价的,远程钩子会影响系统的性能,特别是监视系统范围的钩子,因为要监视系统范围的消息,明显就会影响系统的速度。
第三个参数和第四个参数相关,所以一起解释。
如果第四个参数是NULL,则说明是全局钩子,那么就是钩子子程与所有的线程关联,此时第三个参数是程序实例句柄;
如果第三个参数是NULL,则说明钩子是局部钩子,说明子程代码位于当前进程,这时候第四个参数就是当前进程的ID,可以用GetCurrentThreadID()填充,或者可以保存实例来填充,再做介绍···
再看看钩子函数的卸载,用UnHookWindowsHookEx(HHOOK hhk);参数就是SetWindowsHookEx返回的句柄。


下面是是一个小程序,大概的功能就是实现在所在进程内的鼠标消息和键盘消息的截获,一旦点击了“LockMouse”那么就在目标窗口截获了所以鼠标的消息,这里实现的是屏蔽鼠标消息,只能通过按回车键恢复鼠标功能。若是点击了“LockKeyBoard”按钮,那么只能在编辑框输入0或者1,但是在没有点击的情况下是正常的编辑框。这点可是比窗口子类化更加简单。
  1. #include "Windows.h"  
  2. #include "tchar.h"  
  3. #include "resource.h"  
  4.   
  5.   
  6. HINSTANCE g_hInstance ;  
  7. static HHOOK hHook = NULL;  
  8.   
  9.   
  10. INT_PTR CALLBACK ProcWinMain(HWND hWnd, UINT Msg, WPARAM wParam ,LPARAM lParam);  
  11. LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam,LPARAM lParam);       
  12. LRESULT CALLBACK BoardProc(int nCode, WPARAM wParam,LPARAM lParam);       
  13.   
  14.   
  15. int WINAPI WinMain(     HINSTANCE hInstance,  
  16.                    HINSTANCE hPrevInstance,  
  17.                    LPSTR lpCmdLine,  
  18.                    int nCmdShow  
  19.                    )  
  20. {  
  21.     static TCHAR DlgName[] = _T("InnerHook");  
  22.     g_hInstance = hInstance ;  
  23.     DialogBoxParam(hInstance,DlgName,NULL,( DLGPROC)ProcWinMain,NULL);  
  24.     return 0;  
  25. }  
  26.   
  27.   
  28. INT_PTR CALLBACK ProcWinMain(   HWND hWnd,   
  29.                              UINT Msg,   
  30.                              WPARAM wParam,   
  31.                              LPARAM lParam   
  32.                              )  
  33. {  
  34.     static TCHAR unLockStr[] = _T("Unlocking");  
  35.     static TCHAR LockStr[] = _T("Locking");  
  36.     static BOOL isLock = FALSE;  
  37.     static BOOL isLock2 = FALSE;  
  38.     static HHOOK hHook2 = NULL;  
  39.     switch(Msg)  
  40.     {  
  41.     case WM_INITDIALOG:  
  42.         {  
  43.             SetFocus(GetDlgItem(hWnd,IDC_EDITTEXT));  
  44.         }  
  45.         break;  
  46.   
  47.   
  48.     case WM_CLOSE:  
  49.         EndDialog(hWnd,NULL);  
  50.         break;  
  51.     case WM_COMMAND:  
  52.         {  
  53.             switch(LOWORD(wParam))  
  54.             {  
  55.                 case ID_BTNHOOKBOARD :  
  56.                 {  
  57.                     if(isLock == FALSE)  
  58.                     {  
  59.                         hHook = SetWindowsHookEx(WH_KEYBOARD,BoardProc,NULL,GetCurrentThreadId());  
  60.                         SetDlgItemText(hWnd,ID_BTNHOOKBOARD,LockStr);  
  61.                         isLock = TRUE;  
  62.                     }  
  63.                     else  
  64.                     {  
  65.                         SetDlgItemText(hWnd,ID_BTNHOOKBOARD,unLockStr);  
  66.                         isLock = FALSE;   
  67.                         UnhookWindowsHookEx(hHook);  
  68.                     }  
  69.                 }  
  70.                 break;  
  71.                 case ID_BTNHOOKMOUSE :  
  72.                 {  
  73.                     if(isLock2 == FALSE)  
  74.                     {  
  75.                         hHook2 = SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());  
  76.                         SetDlgItemText(hWnd,ID_BTNHOOKMOUSE,LockStr);  
  77.                         isLock2 = TRUE;  
  78.                     }  
  79.                     else  
  80.                     {  
  81.                         SetDlgItemText(hWnd,ID_BTNHOOKMOUSE,unLockStr);  
  82.                         isLock2 = FALSE;      
  83.                         UnhookWindowsHookEx(hHook2);  
  84.                     }  
  85.                 }  
  86.                 break;  
  87.             }  
  88.         }  
  89.         break;  
  90.     default:  
  91.         return FALSE;   
  92.     }  
  93.     return TRUE;  
  94. }  
  95.   
  96.   
  97. LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam,LPARAM lParam)  
  98. {  
  99.     return 1;           //返回非0值,表示处理了该消息  
  100. }  
  101.   
  102.   
  103. LRESULT CALLBACK BoardProc(int nCode, WPARAM wParam,LPARAM lParam)  
  104. {  
  105.     if (wParam == VK_RETURN || wParam == '1' || wParam == '0')  
  106.     {  
  107.         return CallNextHookEx(hHook,nCode,wParam,lParam);   //表示不处理该消息,交还给Windows自己处理  
  108.     }  
  109.     else  
  110.         return 1;       //表示已经处理了该消息  
  111. }  

参考资料 

http://www.microsoft.com/china/community/program/originalarticles/techdoc/hook.mspx

《Windows+sdk系列文章》

ESP32-C3入门教程 WiFi篇①——WiFi Scan 扫描附近AP无线热点 | 堵塞等待扫描结果,回调事件通知扫描结果 文章目录一、快速运行二、运行效果三、程序流畅四、关键函数4.1 扫描所有有效的AP4.2 获取上次扫描中找到的AP列表4.3 获取上次扫描中找到的AP数 一、快速运行 示例项目中,选择WiFi—>scan menuconfig配置ESP32C3-Specific—>Rec 0 芯片选择ESP32-C3(Built-in USB JTAG) 快速运行ESP-IDF Build, Flash and Monitor(左下角) 二、运行效果 三、程序流畅 esp_netif_init,初始 阅读详情

相关推荐

【实战分享】低成本K型热电偶测温方案:单运放放大与STM32 ADC采集优化

本文详细介绍了低成本K型热电偶测温方案,通过单运放放大与STM32 ADC采集优化,解决了信号微弱、负电压处理和冷端补偿等核心挑战。方案采用LMV358运放和T型网络降低噪声,结合STM32的ADC校准和软件滤波,实现±0.5℃精度,物料成本控制在15元以内,适用于工业测温场景。

weixin_30839881的博客 168

Win32k(4) 视窗钩子

第五部分 视窗钩子 一、ROS下的流程   Win2000版本有人分析过了http://bbs.pediy.com/showthread.php?t=135702   消息钩子是一种官方支持钩子回调,可以拦截某一个窗口或者全局的消息。消息本应直接发到对应窗口的wndproc,现在要先发送到我们设定的消息回调,由我们的hook函数进行参数的收取、截获、过滤~

Returns' Station 1306

如何理解Fourier Neural Operator (FNO)

2022年Nvidia发表在arXiv上的的FourcastNet作为几乎是最早的一篇气象大模型的工作(之前Google Research的MetNet主要还是对于降水的预报)。除了Transformer的backbone之外,使用到了2021年发表在ICLR上的Fourier Neural Operator。为了更好的理解模型的理论基础,可以详细学习一下以及他的前期工作GNOFNO作者对这两篇文章的解析blog。

momo的博客 1万+

Hook技术

linux上基于C和C++的hook尝试

jinking01的专栏 4418

华为硬件逻辑岗笔试题(一)

积少成多,集腋成裘,坚持!!! 目录 1. 进制转换 2. 状态机和编码方式 3. 存储器的分类 4. Verilog语法中的操作符 5. 对组合逻辑的认识 6. 对时序逻辑的认识 7. 竞争冒险的认识 8. 基本时序逻辑电路 9. 建立时间和保持时间 10. 同步时序电路 11. 组合逻辑和时序逻辑判断 13. 基本总线的理解 14.加法器 15.FPGA开发工具 1. 进制转换 1、十进制46.25对应的二进制表达式为( )。 A 101110.11...

qq_42235129的博客 1万+

Springboot计算机毕业设计校园树洞微信小程序【附源码】开题+论文+mysql+程序+部署

因此,开发一款专门针对校园用户的树洞微信小程序,为学生提供一个安全、私密、便捷的倾诉和交流平台,具有重要的现实意义和应用价值。通过本研究的实施,我们预期能够开发出一款功能全面、操作便捷的校园树洞微信小程序,为校园师生提供一个安全、私密、便捷的倾诉和交流平台。此外,通过不断优化和改进小程序的功能和服务,我们预期能够提升用户体验和满意度,推动校园树洞小程序的持续发展,并为校园生活的和谐与健康发展做出积极贡献。同时,通过不断优化小程序的功能和服务,提升用户体验和满意度,推动校园树洞小程序的广泛应用和持续发展。

光冯毕设程序 1666

黑客爱用的HOOK技术大揭秘!

什么是HOOK技术? 病毒木马为何惨遭杀软拦截? 商业软件为何频遭免费破解? 系统漏洞为何能被补丁修复? 这一切的背后到底是人性的扭曲,还是道德的沦丧,尽请收看今天的专题文章:《什么是HOOK技术?》 上面是开个玩笑,言归正传,今天来聊的话题就是安全领域一个非常重要的技术:HOOK技术。 HOOK,英文意思是“钩子” 在计算机编程中,HOOK是一种「劫持」程序原有执行流程,添加额外处理逻辑的一种技术。 按照这个定义,其实我们Python中的装饰器和Java中的注解,这种面向切面编程的手法在某种程度上来说,

MachineGunJoe666 3569

多电平双向DC/DC直流变换器的工作原理(以三电平为例子)

多电平双向DCDC变换器的工作原理一、所用论文和参考文献1.1 主要是中文的文献二、工作原理和重要概念2.1 飞跨电容的作用2.2 三电平的工作原理1.3 多电平的优点二,一些注意点2.1 电感电流的变化2.2 多飞跨电容 多余三个电平的时候的解释(截图居多) 一、所用论文和参考文献 1.1 主要是中文的文献 用于超级电容储能系统的三电平双向直流变换器及其控制 (期刊) 多电平直流变换器及其控制...

qq_32419593的博客 2万+

黑客爱用的 HOOK 技术大揭秘

病毒木马为何惨遭杀软拦截?商业软件为何频遭免费破解?系统漏洞为何能被补丁修复?这一切的背后到底是人性的扭曲,还是道德的沦丧,敬请收看今天的专题文章:《什么是 HOOK 技术?

A_991128a的博客 2434

【YOLOv8实战】从零构建番茄成熟度智能检测GUI系统【附完整工程】

本文详细介绍了从零构建基于YOLOv8的番茄成熟度智能检测GUI系统的完整实战流程。内容涵盖环境搭建、数据集准备、模型训练调优,并重点讲解如何使用PyQt5开发图形界面,最终将项目打包为可执行文件,实现AI模型从训练到桌面应用落地的完整工程闭环。

xxx12的博客 821

【Python机器学习实战】 | 基于PCA主成分分析技术读入空气质量监测数据进行数据预处理并计算空气质量综合评测结果

主成分分析(Principal Component Analysis, PCA)是一种常用的机器学习和数据分析技术,用于降低数据维度、识别数据中的模式、发现变量之间的关系等。

一伦明悦的博客 1263

Hook技术(1):Hook技术简介

什么是hook技术? hook技术又被称为钩子技术。 在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。 简单来说,hook是一种截取信息、更改程序执行流向、添加新功能的技术。 通俗来说,就是一条高速公路,我们去追击一个罪犯(要截获的消息或事件),然后在他要经过的地方提前埋下埋伏,等到罪犯到来时,实...

weixin_43742894的博客 3319

YOLO11改进 | 注意力机制 | 添加SimAM注意力机制【全网独家+附完整代码】

yolo11,yolo11改进,yolo11创新,yolo11添加注意力机制

kay_545 1230

Hook 技术简介

#include "Windows.h" #include "tchar.h" #include "resource.h" HINSTANCE g_hInstance ; static HHOOK hHook = NULL; INT_PTR CALLBACK ProcWinMain(HWND hWnd, UINT Msg, WPARAM wParam ,LPARAM lParam); LR

achiever4ever的专栏 819

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

pytorch的自动求导和hook技术简介

在Pytorch的计算图中,由用户手动创建的tensor称为叶子节点,默认不计算梯度,即requires_grad=False。由函数(Function)计算得到的tensor是非叶子节点,requires_grad由参与计算的tensor决定。在整个计算图中,只要有一个节点的requires_grad=True,则所有依赖该节点的节点的requires_grad均为True。 tensor.gr...

Stoneplay 1565

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SSDT Hook实现内核级的进程保护

目录 SSDT Hook效果图SSDT简介SSDT结构SSDT HOOK原理Hook前准备如何获得SSDT中函数的地址呢SSDT Hook流程SSDT Hook实现进程保护Ring3与Ring0的通信如何安装启动停止卸载服务参考文献源码附件版权 SSDT Hook效果图 加载驱动并成功Hook  NtTerminateProcess函数: 当对 指定的进程进行保护后,尝

求索 656

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: (转)java datetime date 类型
下一篇: DLL注入和API拦截
zm_21
博客等级 码龄14年 147粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值