钩子函数(HOOK)完整的教程

2023-11-03

基本概念 
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控

制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
理论
WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。
工作原理
当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果您安装的是一个局部钩子,您进程中的钩子函数将被调用。如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。
  钩子一共有14种,以下是它们被调用的时机:
  WH_CALLWNDPROC 当调用SendMessage时
  WH_CALLWNDPROCRET 当SendMessage的调用返回时
  WH_GETMESSAGE 当调用GetMessage 或 PeekMessage时
  WH_KEYBOARD 当调用GetMessage 或 PeekMessage 来从消息队列中查询WM_KEYUP 或 WM_KEYDOWN 消息时
  WH_MOUSE 当调用GetMessage 或 PeekMessage 来从消息队列中查询鼠标事件消息时
  WH_HARDWARE 当调用GetMessage 或 PeekMessage 来从消息队列种查询非鼠标、键盘消息时
  WH_MSGFILTER 当对话框、菜单或滚动条要处理一个消息时。该钩子是局部的。它时为那些有自己的消息处理过程的控件对象设计的。
  WH_SYSMSGFILTER 和WH_MSGFILTER一样,只不过是系统范围的
  WH_JOURNALRECORD 当WINDOWS从硬件队列中获得消息时
  WH_JOURNALPLAYBACK 当一个事件从系统的硬件输入队列中被请求时
  WH_SHELL 当关于WINDOWS外壳事件发生时,譬如任务条需要重画它的按钮.
  WH_CBT 当基于计算机的训练(CBT)事件发生时
  WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的应用程序很少使用
  WH_DEBUG 用来给钩子函数除错
  现在我们知道了一些基本的理论,现在开始讲解如何安装/卸载一个钩子。
  要安装一个钩子,您可以调用SetWindowHookEx函数。该函数的原型如下:
  SetWindowsHookEx proto HookType:DWORD, pHookProc:DWORD, hInstance:DWORD, ThreadID:DWORD
  HookType 是我们上面列出的值之一,譬如: WH_MOUSE, WH_KEYBOARD
  pHookProc 是钩子函数的地址。如果使用的是远程的钩子,就必须放在一个DLL中,否则放在本身代码中
  hInstance 钩子函
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

钩子函数(HOOK)完整的教程 的相关文章

  • 在 64 位 Windows 上运行 32 位可执行文件时出现问题

    如果允许的话 我会添加 500 个我自己的代表作为赏金 我在用着wkhtml转pdf http wkhtmltopdf org 将 HTML 网页转换为 PDF 这在我的 32 位开发服务器上完美运行 不幸的是 我无法运送我的机器 p 但是
  • Qt GUI 应用程序中的控制台输出?

    我有一个在 Windows 上运行的 Qt GUI 应用程序 它允许传递命令行选项 在某些情况下我想向控制台输出一条消息 然后退出 例如 int main int argc char argv QApplication a argc arg
  • 批处理脚本 - IF EXIST 复制到 %localappdata% 错误

    我似乎被批处理脚本困住了 需要一些帮助 基本上我需要检查文件是否存在于文件夹中 localappdata 如果确实如此 则覆盖该文件 如果没有放置在不同的位置 那么目前它的内容如下 IF EXIST localappdata foldern
  • 忽略 Mercurial hook 中的某些 Mercurial 命令

    我有一个像这样的善变钩子 hooks pretxncommit myhook python path to file myhook 代码如下所示 def myhook ui repo kwargs do some stuff 但在我的例子中
  • 如何为 Windows toast 注册协议?

    如何注册 Windows toast 协议 样本中来自https blogs msdn microsoft com tiles and toasts 2015 07 02 adaptive and interactive toast not
  • 使用 Windows 套接字的 WriteFile 返回无效参数错误

    我已经在 Windows 套接字上苦苦挣扎了两天 无法像在 Linux 中那样只使用写入套接字 我想编写自己的 shellcode 并且正在研究如何将 stdout stdin 重定向到套接字句柄 这就是我的演奏的来源 如果有必要 我使用
  • Notepad++ - 使函数“可点击”?

    我只是想这可能有用 但我找不到办法 在 Notepad 中 有没有一种方法可以使函数名称 可单击 即使它们成为链接 这样如果您单击它们 它会自动将您带到其定义 最好是跨整个代码库 目前还没有插件提供可直接单击的函数名称 但您可以尝试使用 S
  • MSysGit 与 Windows 版 Git

    我无法确定MSysGit 和 Windows 版 Git 之间的区别 http msysgit github com 它们有何不同 为什么我会选择其中之一而不是另一个 它们不是同一个东西吗 On http msysgit github co
  • 如何从进程开始捕获所有应用程序/窗口消息? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我试图弄清楚如何捕获进程 窗口的所有窗口消息 从它在 c 中启动时开始 该过程不是我自己的 所以我需要使用某种钩子 我的目标是开始实时
  • 使用 Windows 网络共享目录时 Hg 存储库损坏

    我希望我能在这里得到一些帮助 因为 SO UX 比 Mercurial 邮件列表更好 多年来我一直在家里愉快地使用 Mercurial 我还将它与 Bitbucket Cloud 一起用于一些更严肃 但仍然是爱好 的项目 去年 我将我的团队
  • 为什么我的 DLL 无法注册?

    我正在 VS2005 中构建一个项目 但我的几个 DLL 无法注册 我在 Visual Studio 中收到的错误消息是 项目 错误 PRJ0019 工具从 注册 ActiveX 控件 返回错误代码 这很模糊 当我通过命令行手动注册DLL时
  • 多语言 Android 应用程序:在电子邮件和密码字段中显示英文键盘

    我们正在开发一款多语言 Android 应用程序 针对英语和阿拉伯语 面临的问题是在登录和注册屏幕中 我们希望仅以英文文本输入用户名和密码字段 从而显示英文键盘 无论设备区域设置语言如何 已尝试在 edittext 中设置 inputtyp
  • Vagrant 错误:无法挂载 VirtualBox 共享文件夹(Guest Additions、vboxsf)

    问题 我在 Windows 10 上安装了 Vagrant 这样我就可以在虚拟机中创建个人本地开发环境 我读到的有关 Vagrant 的所有内容都表明我什至可以启动多个系统并通过 NAT 端口转发测试它们之间的通信 但首先 我只想在对其余部
  • 适用于 Windows 的 php-fpm?

    PHP FPM 的主页http php fpm org http php fpm org 声明它是 PHP 5 3 3 以来 PHP 的一部分 现在 我想知道 当我从 php net 下载最新的 PHP 二进制文件时 其中没有 php fp
  • 具有类型推断功能的 Lisp 静态类型方言,适用于 Windows?

    是否有静态类型的 Lisp 方言可以执行类型推断并与 Windows 兼容 我找到了 CMUCL 但它似乎没有 Windows 兼容版本 看一下SBCL http www sbcl org它源自 CMUCL 它通过类型声明对静态类型提供良好
  • 查找所有 DHCP 和 DNS 服务器

    我有一位客户要求我找到他所有的 Dhcp 和 DNS 服务器以及一些附加信息 例如 DC 服务器和操作系统 所以我决定尝试提高我的 powershell 技能 但我对此还很陌生 所以我写了这个脚本 但我想仍然缺少一些东西 因为它不起作用 编
  • 按名称显示进程的命令行

    我在cmd中使用以下命令来获取进程命令行 它提供了所有流程的详细信息 WMIC OUTPUT C ProcessList txt PROCESS get Caption Commandline Processid 我想在记事本中按名称获取特
  • 解密/读取/修改“.automaticDestinations-ms”和/或“.customDestinations-ms”

    有谁知道如何读取 Microsoft 为 JumpList 创建的文件 我想从 JumpList 中清除所有历史记录 最常访问的 最近关闭的 而不清除任务 我尝试使用 win7api 中的 APPID 并清除例如 google chrome
  • 使用第三方库记录来自 PHP 应用程序的所有 cURL 请求

    好吧 我的 PHP Yii2 应用程序遇到了困难 我需要记录来自应用程序的每个传入和传出请求 传入的请求可以轻松地记录在 PHP 本身中 在引导阶段添加一些处理程序 这很容易 但真正的问题是我正在使用许多第三方库 即 Amazon MWS
  • Windows 10:任务栏中的图标大小错误

    从 Windows 10 开始 任务栏中的图标大小似乎为 24x24px 如果 Windows 选择图标文件中的 24px 版本进行显示 那么这不会有问题 但它选择了 32px 版本并将其缩小 这会导致丑陋的伪像 尤其是当你的图标中有直线时

随机推荐

  • 嘉立创的PCB外形规则解读

    终极标准 某D系列软件外形层及非金属化孔及槽的标准及规范 对于大部分用某D设计的工程师都是乱用KEEPOUT层及机械层 导致PCB工厂CAM工程师傻傻的分不清 造成漏开或多开非金属化孔及非金属化槽的现象时有发生 特此确定以下标准 如果标准相
  • OAM协议详解

    原文地址 https blog csdn net xinyuan510214 article details 79218004
  • CLIP论文解读

    文章目录 问题 方法 自然语言监督 数据集 有效预训练方法 模型选择 实验 Zero Shot Transfer 结论 论文 Learning Transferable Visual Models From Natural Language
  • 遗传算法(一) 遗传算法的基本原理

    遗传算法 一 遗传算法的基本原理 1 概述 遗传算法 Genetic Algorithm GA 起源于对生物系统所进行的计算机模拟研究 它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法 借鉴了达尔文的进化论和孟德尔的遗传学说 其本
  • 【Docker】如何运行容器?

    文章目录 容器操作 容器相关命令 创建并运行一个容器 docker命令解析 nacos启动成功 访问 进入容器 修改配置文件 总结 接上集 CentOS 7安装Docker https blog csdn net qq 39017153 a
  • unity中通过www加载外部音频

    IEnumerator DownloadVoice string url WWW w new WWW url yield return w 将声音资源赋值为外部加载的声音即可 myclip w audioClip 加载ogg格式的音频 au
  • 视频分类(Classification)和摘要(Captioning)总结

    想象力比知识更重要 爱因斯坦 论文 Deep Learning for Video Classification and Captioning 视频分类是指将大量的视频数据按照一定的标准和规则进行分类和归类 以便于用户快速找到自己感兴趣的视
  • 【MySQL】不就是子查询

    前言 今天我们来学习多表查询的下一个模块 子查询 子查询包括了标量子查询 列子查询 行子查询 表子查询 话不多说我们开始学习 目录 前言 目录 一 子查询 1 子查询的概念 2 子查询语法格式 2 1 根据子查询结果不同可以分为 2 2 根
  • 51单片机开发系列一-51单片机开发环境搭建以及入门汇编代码

    51单片机开发系列一 51单片机开发环境搭建以及入门汇编代码 象棋小子 1048272975 1 51单片机概述 51单片机是对所有兼容Intel 8031指令系统的单片机的统称 目前教科书基本都是以早期的MCS 51为原型 讲解微机的原理
  • Java上传Excel文件并解析入库,数据生成Excel文档(知识点满满)

    原因 我们经常会遇到甲方给数据是excel格式的数据 当然Navicat是支持导入excel的但是遇到客户想要自己上传Excel入库数据就要手动进行写代码了 一 解析Excel入库 param request param response
  • YOLOV7训练自己的数据集以及训练结果分析(手把手教你)

    YOLOV7训练自己的数据集以及训练结果分析 手把手教你 YOLOV7训练自己的数据集整个过程主要包括 环境安装 制作数据集 参数修改 模型测试 模型推理 一 环境安装 conda create n yolov7 python 3 8 co
  • python---的各种算法

    今天来聊聊python中的算法 比如AES DES RSA 1 MD5加密 md5是一个大的hash算法 它不存在解密的逻辑 市面上所为的解密是通过撞库来实现的 我们可以简单的理解为生活中的防伪码 1 不加salt 简单理解为密钥 from
  • 【语义分割】综述——一文搞定语义分割

    本文记录了博主阅读的关于语义分割 Semantic Segmentation 的综述类文章的笔记 更新于2019 02 19 语义分割 综述 一文搞定语义分割 参考文献网址 An overview of semantic image seg
  • 如何是matlab中的折线图变得更加的光滑?

    原来的代码如下 y2 Convergence2 m figure Name y2 Position 200 200 500 500 plot y2 title E2 xlabel Iteration ylabel Objective Fun
  • 网上学自动化测试靠谱吗 自己亲自试听一下去感受下就知道了

    众所周知 目前我国软件测试每年都要新增大量岗位 但学校还没有开展软件测试相关的课程 而企业培养的人才远远不足需求 因此自学和培训就成为目前主流的从事软件测试的两个最有效的途径 但相对自学来说 参与培训能够在较短时间内学到软件测试的相关知识
  • Claude2 AI实战:重新认识我们自己

    交流源于内心本真的需要 通过交流来降低信息的不对称 今天的交流对象是一个集大成者的老学者 当然是由 Claude2 扮演 相信会有不一样的收获 角色设定 你是一名集大成者的年迈学者 在哲学 社会学 历史 心理学等方面都有很高的造诣 现在我们
  • 【华为OD机试真题 Python】加扰字符串

    前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun09
  • 到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】

    更多信息请关注公众号 一口Linux 一 到底什么是Cortex ARMv8 arm架构 ARM指令集 soc 有粉丝问我到底什么是ARM 搞不清楚Cortex arm内核 arm架构 ARM指令集 soc这些概念都是什么关系 下面一口君给
  • xxljob 定时任务执行 报:job handler not found

    用xxljob做一个定时任务调度 执行以后出现执行失败 提示的找不到执行器 一般情况下是因为管理中心的JobHandler名称与代码中定义的不匹配 或者与pom文件引入的xxljob 版本不匹配 先检查一下这两个地方 在定时任务代码的入口文
  • 钩子函数(HOOK)完整的教程

    基本概念 钩子 Hook 是Windows消息处理机制的一个平台 应用程序可以在上面设置子程以监视指定窗口的某种消息 而且所监视的窗口可以是其他进程所创建的 当消息到达后 在目标窗口处理函数之前处理它 钩子机制允许应用程序截获处理windo