C++ windows 平台的 Hook

 

From:https://www.jianshu.com/p/1cbde2276752

Windows Hook(钩子)函数详解:https://wenku.baidu.com/view/fd9088aaf46527d3250ce059.html

 

环境:vs 2019,添加Windows.h头文件。

核心函数:SetWindowsHookEx(),UnhookWindowsHookEx(),CallNextHookEx()
你可能在其他api文档看到SetWindowsHookExA、SetWindowsHookExW这两个函数,他们是编码上的区别,A指ASCII,W指wide-char也就是unicode编码,但系统已经帮我们用宏处理好,只需调用 SetWindowsHookEx 就行了,自动选择对应编码那个函数。

Hook:建议先百度自行稍微了解

HINSTANCE、HMODULE、HANDLE、HWND是一样的东西,都是各种 typedef 绕来绕去,区别只在于人类使用时附加的语义,实际上都是一串数字。下面就混着用了。
下面仅以最基本的控制台应用示例。

 

非常简单的一个例子,运行后鼠标移动即可看到效果:

LRESULT CALLBACK mymouse(int nCode, WPARAM wParam, LPARAM lParam)
{cout<<"yes"<<endl;return CallNextHookEx(NULL, nCode, wParam, lParam);
}int main()
{HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mymouse, 0, 0);MSG msg;while (GetMessage(&msg, NULL, NULL, NULL)){}UnhookWindowsHookEx(mouseHook);return 0;
}

 

1.mymouse函数:
LRESULT:long result,实际就是个宏,当long(长整数)就行。
CALLBACK:也是宏,实际上是__stdcall,函数修饰关键字,详细自行可百度。
WPARAM、LPARAM:还是宏,当整数就行。不同的值有不同含义,具体看msdn。

为什么这样定义?
因为SetWindowsHookEx()的第二个参数就是接受这样的一个函数指针。简单了解使用函数指针
该函数返回0时,消息继续往下传递;返回1时消息不再往下传递。

为什么是return CallNextHookEx()而不是直接return 0或1?
SetWindowsHookEx()把这个钩子放在Hook链头,不调用这个方法其他链节点的Hook不执行。另外该函数的第一个参数没用,直接null就行。

2.HHOOK类型:
代表加进去的钩子,后面解除钩子的函数UnhookWindowsHookEx(),参数就是这个的对象。

3.MSG、while:
为了不让程序结束,用一个while卡住它。

为什么不用while(true)?
看第5点

4.SetWindowsHookEx函数:
原型:

HHOOK WINAPI SetWindowsHookEx(_In_ int       idHook,_In_ HOOKPROC  lpfn,_In_ HINSTANCE hMod,_In_ DWORD     dwThreadId
);

看到陌生的不用头大,都是关键字和宏罢了,直接讲4个参数。
idHook:一个int值,不同的值对应不同的钩子(鼠标or键盘之类的)。vs中打出WH_后,看自动补全显示的名字,你就能了解了,不用死记硬背。WH就是window hook的意思。
lpfn:函数指针,类型就是mymouse函数那个类型。每当钩子获取到消息,就会调用该函数指针。
hMod:用于帮助找到真正的地址,下面会讲。
dwThreadId:DWORD也是一个宏,当整数就行。这里指你要把钩子挂到哪个线程中,所有进程的所有线程都可以选择,只不过其他进程的线程不一定挂的上,需要其他手段,不作细说。填0就是尝试把所有线程都给挂上,成了所谓的全局钩子(只是尝试,拒绝挂钩子的线程还是挂不上)。

当挂钩子失败时,该函数返回null。另外msdn讲解参数这段一定要看:
lpfn [in]
Type: HOOKPROC

A pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a DLL. Otherwise, lpfn can point to a hook procedure in the code associated with the current process.
如果dwThreadId指定的线程并不是由当前进程创建的,那么子程(就是那个函数,如示例的mymouse)一定要写在dll里(动态链接库)。
原因:由于lpfn是指针和逻辑地址的机制,当前进程的函数地址不适用于其他进程。系统一般需要借助dll模块以确定函数入口地址(low-level除外,只有此时可以不写dll)。

hMod [in]
Type: HINSTANCE

A handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.
当 dwThreadId指定的线程是当前进程创建的线程 子程的代码是在当前进程(非dll)写的,那么这个hMod必须填0(也就是null)。
值得一提,在dll中时,这个参数要填为该dll的句柄,可以有两种方法获取来填:
(1)把入口DllMain的参数hModule(HMODULE和HINSTANCE一样的)保存下来,填进去(推荐)
(2)通过函数GetModuleHandle(L"dll name")来获取(加L代表为unicode编码,不用加dll后缀)(不推荐)

绝大多数情况下会写成动态链接库(建议)。上面示例能算上特例,不写在dll中就要:首先是钩子类型不是WH_MOUSE而是WH_MOUSE_LL(LL代表low-level,另一种回调机制,写在dll中则两种都可以),不然没反应,其次第三个参数hMod写成0。

5.GetMessage函数:从线程消息队列获取消息,没有消息将进入等待态直至有消息被插入队列
(1)系统获取消息-----系统分发消息---(Hook链)-----消息抵达线程消息队列。(这下搞懂第一点说的消息是否继续传递和CallNextHookEx了吧)
(2)我们示例的控制台程序创建时默认是没有消息队列的,但调用相关函数时就自动创建消息队列,如GetMessage函数
(3)子程是由系统通过回调机制,把执行SetWindowsHookEx函数的线程叫回来去执行的,也就是示例中的mymouse函数是由主线程去执行的。因此,如果写成while(true),那么线程将无限运行,系统没有机制能够中断它的执行来把它叫过来执行子程。但是,调用GetMessage函数后,线程有了消息队列,而且我们没有往里面插入消息,线程就进入等待态,此时系统便能够控制该线程,让它去执行子程。也就是说,我们需要把这个线程弄成等待态去让系统获取控制权,所以你还可以使用while(true){ Sleep(100); }达到相同目的。
(4)由于上述原因,对于挂Hook的线程来说,这样一个循环查询消息队列是有必要的。
(5)如果系统发现hook的子程长期得不到执行(你的线程正在繁忙),那么系统会自动删除掉这个hook。这里就要注意了,不要安排耗时任务在该线程上。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

欧盟首个数据保护条例GDPR生效,你可能需要这份中文版的全文(丁晓东译) |下...

来源&#xff1a;人大法学院未来法治研究院 翻译&#xff1a;丁晓东&#xff0c;中国人民大学法学院副教授&#xff0c;中国人民大学法学院未来法治研究院副院长。中山大学电子与通信工程专业学士&#xff0c;北京大学、耶鲁大学法学博士、中国人民大学法学博士后。经过欧盟议…

AdoHelper使用MySQL存储过程示例

AdoHelper是MS DAAB中的一个抽象数据访问类&#xff0c;由它派生出的SqlHelper使用很广泛&#xff0c;PDF.NET数据开发框架内部按照AdoHelper的接口做了一个自己的实现&#xff0c;下面简单说明一下怎么用它使用存储过程。 PDF.NET的两个功能&#xff1a;SQL-MAP和OQL在我们的项…

安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程

哔哩哔哩&#xff1a;https://www.bilibili.com/video/BV1UE411A7rW?p1 Android 逆向工程师系统培训‹第九期›&#xff08; 课程目录 &#xff09;&#xff1a;https://ke.yijincc.com/course-21.htm 安卓逆向工程师&#xff1a;https://ke.yijincc.com/profession/1.htm 打…

马云最新演讲:未来10年,人类将面临AI、IoT和区块链等三大技术巨大挑战!

来源&#xff1a;互联网风云网5月26日午间消息&#xff0c;在第二十届中国科协年会开幕式上&#xff0c;阿里巴巴集团董事局主席马云出席并发表题为《因为相信&#xff0c;所以看见》的演讲。马云认为&#xff0c;未来10-20年以内&#xff0c;将有三大技术让人类面临挑战&#…

C++ STL简介(转)

一、STL简介 STL&#xff08;Standard Template Library&#xff0c;标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C中&#xff0c;但在被引入C之前该技术就已经存…

互联网大脑加速进化,2018年类脑智能巨系统在中国突然爆发

作者&#xff1a;刘锋 计算机博士&#xff0c;互联网进化论作者前言&#xff1a;2018年新年伊始&#xff0c;在短短的6个月里&#xff0c;包括腾讯超级大脑、浪潮企业大脑、360安全大脑、阿里ET大脑、华为城市神经网络、上海城市大脑、滴滴交通大脑、AIbee行业大脑不断涌现。在…

业务架构·应用架构·数据架构实战~架构实践全景图

1.战略、BA、DA、AA、TA五者的关系 BA&#xff08;Business Architecture&#xff09;&#xff1a;业务架构 DA&#xff08;Data Architecture&#xff09;&#xff1a;数据架构 AA&#xff08;Application Architecture&#xff09;&#xff1a;应用架构 TA&#xff08;Te…

安卓逆向_2 --- Androidkiller,apktool、dex2jar、jd-gui、jadx反编译工具 的 安装、设置及使用教程

From&#xff1a;https://www.52pojie.cn/thread-726176-1-1.html 爱盘 - 在线 PJ 工具包&#xff1a;https://down.52pojie.cn/ 哔哩哔哩 &#xff1a;https://www.bilibili.com/video/BV1UE411A7rW?p6 Android反编译工具的使用-Android Killer - 反编译美柚&#xff1a;h…

业务架构·应用架构·数据架构实战~TOGAF理论全景解读

1、解读TOGAF 9.2的BA、DA、AA、TA内容模型 企业架构&#xff08;Enterprise Architecture&#xff09;包含如下四种架构 BA&#xff08;Business Architecture&#xff09;&#xff1a;业务架构 DA&#xff08;Data Architecture&#xff09;&#xff1a;数据架构 AA&…

京东首次公布L4无人重卡细节!大型无人机和全机器人餐厅也要来了

安妮 发自 凹非寺量子位 出品 | 公众号 QbitAI摘要&#xff1a;京东CUBE大会上&#xff0c;京东一口气公布了一系列项目新进展。不仅推出L4级无人驾驶重型卡车、续航1000公里的无人飞机、机器人做主厨的JOY’S智慧餐厅3个全新项目&#xff0c;还总结了京东在智能零售、家居和智…

Android 系统架构图

Android 操作系统架构开篇&#xff1a; http://gityuan.com/android/ https://cloud.tencent.com/developer/article/1429122 Android架构图&#xff08;五层框架&#xff09;&#xff1a;https://www.cnblogs.com/pengdonglin137/p/3858254.html 官方系统架…

ASP.NET MVC 最佳开发实践(1)

本文提供了一些代码设计准则&#xff0c;目标是帮助ASP.NET MVC 开发人员创建可靠的应用程序&#xff0c;当然&#xff0c;你可根据实际应用程序选择合适的标准。本文由EntLib.com 小组翻译&#xff0c;欢迎分享和交流ASP.NET MVC 项目开发设计思路。 Model建议 - Model Recomm…

大咖 | 斯坦福教授骆利群:为何人脑比计算机慢1000万倍,却如此高效?

大数据文摘出品作者&#xff1a;骆利群编译&#xff1a;王一丁、Shan Liu、小鱼AI源于人类大脑的结构&#xff0c;并尝试达到与大脑相当的能力。那么二者的差异究竟在哪里&#xff1f;斯坦福大学神经生物学教授骆利群&#xff08;Liqun Luo&#xff09;认为&#xff0c;大脑性能…

业务架构·应用架构·数据架构实战~战略驱动的业务架构设计

1、什么是业务架构&#xff08;BA&#xff09; 业务架构是企业治理结构、商业能力与价值的正式蓝图。 业务架构明确定义企业的治理结构、业务能力、业务流程、业务数据。其中&#xff0c;业务能力定义企业做什么&#xff0c;业务流程定义企业怎么做。 业务能力定义企业做什么…

Python 操控手机 APP

From&#xff1a;https://www.cnblogs.com/7758520lzy/p/11994776.html Python 控制雷电模拟器&#xff1a;https://blog.csdn.net/zerglurker/article/details/102931511 python 控制手机 python控制雷电模拟器 经常看到用 Python 操作手机 APP 的项目&#xff0c;例如抖音…

Log4Net 全方位跟踪程序运行

前端日子自己写了一个简单的日志跟踪程序&#xff0c;现在目前正在做的一个项目中使用以便于跟踪程序异常和运行状况&#xff0c;但是被否认了&#xff01;可能是没有权威性&#xff0c;于是自己总结了一下Log4net日志跟踪系统&#xff0c;这里分享大家学习一下。当然写这个文章…

面对5G,华为、中兴及三大运营商怎么布局?

来源&#xff1a;亿欧摘要&#xff1a;面对即将到来的新机遇——5G&#xff0c;各大相关通信厂商纷纷大力布局&#xff0c;尤其以华为和中兴为主的通信设备商和三大运营商移动、联通和电信。面对5G&#xff0c;看其如何布局&#xff1f;什么是5G&#xff1f;5G是第五代移动通信…

业务架构·应用架构·数据架构实战~业务驱动的应用架构设计

1、什么是应用架构 应用架构是一组应用系统及其交互关系的描述&#xff0c;其中的每个应用系统都是一个“逻辑功能组”&#xff0c;用于支撑业务功能、管理数据资产。 支撑业务架构中&#xff0c;具体业务功能、业务流程的要求。 支撑数据架构中&#xff0c;具体数据资产的操…

Android 之 四大组件、六大布局、五大存储

Android 之四大组件、六大布局、五大存储&#xff1a;https://blog.csdn.net/shenggaofei/article/details/52450668 Android 四大组件、五大存储、六大布局&#xff1a;https://blog.csdn.net/xiankog/article/details/81702119 Android四大基本组件介绍与生命周期&#xff…

vb光环褪去java、c/c++/c#成编程主流

evansdata公司最近的一份调查显示&#xff0c; 运用微软的visualbasic软件停止开发的技术人员人数有明显的下降。 但微软方面则不认同这一说法。 广告&#xff1a;d_textevansdata公司位于美国圣克鲁斯&#xff0c; 他们在北美对超过430位开发人员停止了调查&#xff0c; 从而对…