hook函数教程(一)什么是钩子
原文地址:http://blog.csdn.net/g200407331/article/details/50982025
一、什么是钩子
二、比较专业的对钩子的技术性理解
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。可见,利用钩子可以实现许多特殊而有用的功能。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。 zdwork.cn
Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。
大多数人或者网上文章认为全局钩子都要依赖于一个DLL才能正常工作的,常常会看到很多人在论坛上长期争论一个话题:“全局钩子一定要在DLL里面吗?”。实际上这里有一个概念的问题,究竟上面提到的全局钩子是指什么。通过对上面各种钩子的作用域的理解就会发现这个问题的答案。 本文来自智动软件zdwork.cn
上面一共提到了15种钩子,他们的作用域请看下表:
Hook |
Scope |
WH_CALLWNDPROC |
Thread or global |
WH_CALLWNDPROCRET |
Thread or global |
WH_CBT |
Thread or global |
WH_DEBUG |
Thread or global |
WH_FOREGROUNDIDLE |
Thread or global |
WH_GETMESSAGE |
Thread or global |
WH_JOURNALPLAYBACK |
Global only |
WH_JOURNALRECORD |
Global only |
WH_KEYBOARD |
Thread or global |
WH_KEYBOARD_LL |
Global only |
WH_MOUSE |
Thread or global |
WH_MOUSE_LL |
Global only |
WH_MSGFILTER |
Thread or global |
WH_SHELL |
Thread or global |
WH_SYSMSGFILTER |
Global only |
表一:钩子作用域
WH_JOURNALPLAYBACK,WH_JOURNALRECORD,WH_KEYBOARD_LL,WH_MOUSE_LL、WH_SYSMSGFILTER这5种钩子本身的作用域就是全局的,不管钩子是直接写在应用程序的代码里还是放在DLL中,他们都能够钩住系统的消息。剩下的10种钩子,他们的作用域既可以是线程的又可以是全局的,当将相应的钩子直接写在应用程序的代码中时,他们只能捕获当前线程上下文的消息。那么他们如何实现捕获全局消息的功能呢?当把钩子写入到一个单独的DLL中再引用后,系统自动将该DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程,从而达到捕获全局消息的目的。相对来说,前面5种钩子本身就是全局的,是不需要注入的。 智动软件
因此,对于前面问题的答案就是:要实现捕获全局消息功能的钩子,是否要写在单独的DLL里面,取决于钩子的类型以及相应的作用域。
三、Hook Chain(钩子链表)
系统支持很多不同种类的钩子,每种类型提供对消息处理机制里的某一不同方面的访问。例如,应用程序可以使用WH_MOUSE Hook监视鼠标消息的传递。
系统为每类钩子维护着一个独立的钩子链表。钩子链表是一个指针的列表,其中的指针指向特定的、应用程序定义的回调函数,该函数被叫做钩子子程(hook procedure)。当与某种特定类型的钩子相关联(钩住)的消息发生时,系统将消息一个接一个地传递给钩子链中的每一个钩子子程(hook procedure),钩子子程能够采取的动作取决于涉及的钩子的类型。某些类型的钩子子程仅仅能监视消息;另外一些就能够修改消息或者终止消息在钩子链表中的前进,这样就阻止了消息到达下一个钩子子程或者目标窗体。
这里有几个概念上的翻译,主要有:
Hook Chain : 钩子链表
hook procedures : 钩子子程(即得到消息后进行处理的程序段)
如果对于同一事件既安装了线程勾子又安装了全局勾子,那么系统会自动先调用线程勾子,然后调用全局勾子。
最近学习hook,看了几个教程:
1)http://blog.sina.com.cn/s/articlelist_1585708262_3_1.html
2)http://www.lellansin.com/windows-api-%E6%95%99%E7%A8%8B%EF%BC%88%E4%B8%83%EF%BC%89-hook-%E9%92%A9%E5%AD%90%E7%9B%91%E5%90%AC%EF%BC%88%E7%BC%96%E5%86%99%E4%B8%AD%EF%BC%89.html
3)http://blog.csdn.NET/camly/article/details/1752798
hook函数教程(一)什么是钩子相关推荐
- HOOK函数的基本含义,游戏中如何进行反外挂?
钩子函数是如何访问其他进程中的事件的? 钩子hook其实是一种编程思想: 体现了博弈和对抗: 作弊者: 反作弊者: 为什么访问游戏内存会被检测到, 因为是被外挂调用的,导致外层变量和预期不止一次,从而 ...
- linux钩子函数和回调函数,Linux Kernel 学习笔记10:hook函数
(本章基于: Linux -4.4.0-37) linux 内核中有一套hook函数机制,可在不同hook点位置监控网络数据包,并执行丢弃.修改等操作.网络防火墙就是通过此机制实现的. 注册注销hoo ...
- hive内置函数_Hive Query生命周期 —— 钩子(Hook)函数篇
无论你通过哪种方式连接Hive(如Hive Cli.HiveServer2),一个HQL语句都要经过Driver的解析和执行,主要涉及HQL解析.编译.优化器处理.执行器执行四个方面. 以Hive目前 ...
- mysql 钩子函数_SetWindowsHookEx原理(如何使用钩子,使用钩子hook其他进程的函数)...
基本概念 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理 ...
- 【pytest】pytest的Hook函数详解
文章目录 Hook函数的定义 pytest的Hook函数,修改pytest-html报告 装饰器pytest.hookimpl(hookwrapper=True) Hook函数排序/调用示例 Hook ...
- linux 内核 hook函数介绍
在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数.现在来看看linux是如何实现hook函数的. 先介绍一个结构体: struct nf_hook_ops,这个结构体是实现钩子函数 ...
- linux内核中的hook函数详解,linux内核中的hook函数详解
在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数.现在来看看linux是如何实现hook函数的. 先介绍一个结构体: struct nf_hook_ops,这个结构体是实现钩子函数 ...
- xposed hook java_[原创]Android Hook 系列教程(一) Xposed Hook 原理分析
章节内容 一. Android Hook 系列教程(一) Xposed Hook 原理分析 二. Android Hook 系列教程(二) 自己写APK实现Hook Java层函数 三. Androi ...
- pytest测试框架4-插件与hook函数
一.简介 pytest的自带功能很强大,通过添加插件可以扩展功能,pytest的代码结构适合定制和扩展插件, 可以借助hook函数来实现. 把fixture函数或者hook函数添加到conftest文 ...
最新文章
- ubuntu17.04下mysql5.7.18源码安装
- 【每周CV论文推荐】 初学深度学习图像分割必须要读的文章
- 晒一下MAC下终端颜色配置
- go interface{}类型转换
- 2019阿里巴巴技术面试题集锦(含答案)
- VUE自学日志03-模板语法
- Sharding-Jdbc实现读写分离、分库分表,妙!
- 山海镜花vivo服务器微信号,山海镜花初始号怎么刷
- python - 日期处理模块
- SSO —— 单点登录CAS与OAuth2
- ❤️ 爆肝三万字《数据仓库体系》轻松拿下字节offer ❤️【建议收藏】
- Windows笔记本网卡驱动坏了/wifi图标消失
- 如何查找计算机主机地址,ip地址查询 怎么查询电脑IP地址?
- ctf.show misc入门 21~40
- 关于Ubuntu双击打不开文件夹的解决方案
- 通过漫画学习MySQL索引及优化
- java中暴力是啥方法_[蓝桥杯][历届试题]回文数字 中规中矩的暴力方法(Java代码)...
- JAVA资深架构师成长路线
- C++中的字符串的定义方式
- 如何创建自己的云盘-私有云盘
热门文章
- SAGI GAMES 创始人曾嵘:瞄准休闲游戏,将“创意”转化为“商业”
- 2022-2028全球与中国聚对苯二甲酸丁二酯化合物市场现状及未来发展趋势
- == euqals hashcode
- iar one or more breakpoints be set
- JavaScript jq 三位分节法 input输入数字时每3位使用逗号隔开
- 来源(Provenance)介绍
- 苹果macos打开允许未知来源
- win10进入系统后只有鼠标箭头,桌面全黑(文件系统错误-2018374635)
- 王传福以350亿元登顶中国首富
- ubuntu进入系统黑屏问题