2022年常用的十三种hook类型 .pdf

上传人:C****o 文档编号:42656936 上传时间:2022-09-16 格式:PDF 页数:8 大小:75.72KB
返回 下载 相关 举报
2022年常用的十三种hook类型 .pdf_第1页
第1页 / 共8页
2022年常用的十三种hook类型 .pdf_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《2022年常用的十三种hook类型 .pdf》由会员分享,可在线阅读,更多相关《2022年常用的十三种hook类型 .pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、本文将试图以下面的顺序讲解HOOK 的大部分内容:1、WINDOWS 的消息机制2、HOOK介绍3、HOOK链4、HOOK钩子的作用范围5、HOOK类型6、回调函数7、HOOK钩子的安装与卸载8、HOOK实例演示+WINDOWS 的消息机制+Windows 系统是以消息处理为其控制机制,系统通过消息为窗口过程(windows procedure)传递输入。系统和应用两者都可以产生消息。对于每个输入事件,例如用户按下了键盘上的某个键、移动了鼠标、单击了一个控件上的滚动条,等等,系统都将产生一系列消息。此外,对于应用带给系统的变化,如字体资源的改变、应用本身窗口的改变,系统都将通过消息以响应这种变

2、化。应用通过产生消息指示应用的窗口完成特定的任务,或与其他应用的窗口进行通信。每个窗口都有一个处理Windows 系统发送消息的处理程序,称为窗口程序。它是隐含在窗口背后的一段程序脚本,其中包含对事件进行处理的代码。Windows 系统为每条消息指定了一个消息编号,例如当一个窗口变为活动窗口时,它事实上是收到一条来自Windows 系统的 WM_ACTIVATE 消息,该消息的编号为6,它对应于 VB窗口的 Activate事件。对于窗口来说,诸如Open、Activate、MouseDown、Resize 等事件,实际上对应的是窗口内部的消息处理程序,这些程序对于用户来讲是不可见的。类似地,

3、命令按钮也有消息处理程序,它的处理程序响应诸如WM_LBUTTONDOWN 和 WM_RBUTTONDOWN之类的消息,即激活命令按钮的MouseDown事件。WINDOWS 的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种回调函数(HOOK)的功能。这种挂钩函数(HOOK)类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链。系统产生的各种消息首先被送到各种挂接函数,挂接函数根据各自的功能对消息进行监视、修改和控制等,然后交还控制权或将消息传递给下一个挂接函数以致最终达到窗口函数。WINDOW 系统的这种反调函数挂接方法虽然会略加影响到系统的运行效率,但在

4、很多场合下是非常有用的,通过合理有效地利用键盘事件的挂钩函数监控机制可以达到预想不到的良好效果。+hook 介绍+Hook(钩子)是WINDOWS 提供的一种消息处理机制平台,是指在程序正常运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩子)实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 8 页 -就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。注意:安装钩子

5、函数将会影响系统的性能。监测“系统范围事件”的系统钩子特别明显。因为系统在处理所有的相关事件时都将调用您的钩子函数,这样您的系统将会明显的减慢。所以应谨慎使用,用完后立即卸载。还有,由于您可以预先截获其它进程的消息,所以一旦您的钩子函数出了问题的话必将影响其它的进程。记住:功能强大也意味着使用时要负责任。+HOOK 链+WINDOWS 提供了 14 种不同类型的HOOKS;不同的 HOOK 可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。WINDOWS 为这几种HOOKS 维护着各自的HOOK 链表。HOOK 链表是一串由应用程序定义的回调函数(CALLBACK Func

6、tion)队列,当某种类型的消息发生时,WINDOWS 向此种类型的HOOK 链的第一个函数(HOOK 链的顶部)发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管 HOOK 链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK 函数都会收到系统发送的消息)一些 Hook 子过程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook 子过程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先

7、获得控制权。+钩子的作用范围+一共有两种范围(类型)的钩子:局部的和远程的。一、局部钩子仅钩挂您自己进程的事件。二、远程的钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种:1、基于线程的:它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。2、系统范围的:将捕捉系统中所有进程将发生的事件消息。+HOOK 类型+Windows共有 14 种 HOOKS,每一种类型的Hook 可以使应用程序能够监视不同类型的系统消息处理机制。下面描述所有可以利用的Hook 类型的发生时机。(这些常数值均可以API 浏览器里查到)1、WH_CALLWNDPROC

8、和 WH_CALLWNDPROCRET Hooks WH_CALLWNDPROC和 WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。系名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 8 页 -统在消息 发送到接收窗口过程之前 调用 WH_CALLWNDPROC Hook子过程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子过程。WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook 子过程。CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这

9、个消息关联的消息参数。2、WH_CBT Hook 在以下事件 之前,系统都会调用WH_CBT Hook子过程,这些事件包括:1.激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2.完成系统指令;3.来自系统消息队列中的移动鼠标,键盘事件;4.设置输入焦点事件;5.同步系统消息队列事件。Hook子过程的返回值确定系统是否允许或者防止这些操作中的一个。3、WH_DEBUG Hook 在系统调用系统中与其它Hook 关联的 Hook 子过程 之前,系统会调用WH_DEBUG Hook 子过程。你可以使用这个Hook 来决定是否允许系统调用与其它Hook 关联的 Hook 子过程。4、WH

10、_FOREGROUNDIDLE Hook 当应用程序的前台线程处于空闲状态时,可以使用WH_FOREGROUNDIDLE Hook执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDLE Hook 子过程。5、WH_GETMESSAGE Hook 应用程序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回的消息。你可以使用WH_GETMESSAGE Hook去监视鼠标和键盘输入,以及其它发送到消息队列中的消息。6、WH_JOURNALPLAYBACK Hook WH_JOURNALPLA

11、YBACK Hook 使应用程序可以插入消息到系统消息队列。可以使用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连续的鼠标和键盘事件。只要WH_JOURNALPLAYBACK Hook 已经安装,正常的鼠标和键盘事件就是无效的。WH_JOURNALPLAYBACK Hook 是全局 Hook,它不能象线程特定Hook 一样使用。WH_JOURNALPLAYBACK Hook返回超时值,这个值告诉系统在处理来自回放Hook 当前消息之前需要等待多长时间(毫秒)。这就使Hook可以控制实时事件的回放。WH_JOURNALPLAYBACK是 system-wide l

12、ocal hooks,它们不会被注射到任何行程地址空间。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 8 页 -7、WH_JOURNALRECORD Hook WH_JOURNALRECORD Hook 用来监视和记录输入事件。典型的,可以使用这个Hook 记录连续的鼠标和键盘事件,然后通过使用WH_JOURNALPLAYBACK Hook来回放。WH_JOURNALRECORD Hook是全局 Hook,它不能象线程特定Hook 一样使用。WH_JOURNALRECORD是 system-wide local hooks,它们不会被注射到任何行程地址空间。8、WH_KEYBO

13、ARD Hook 在应用程序中,WH_KEYBOARD Hook用来监视WM_KEYDOWN and WM_KEYUP消息,这些消息通过 GetMessage or PeekMessage function返回。可以使用这个Hook 来监视输入到消息队列中的键盘消息。9、WH_KEYBOARD_LL Hook WH_KEYBOARD_LL Hook监视输入到线程消息队列中的键盘消息。10、WH_MOUSE Hook WH_MOUSE Hook监视从 GetMessage 或者 PeekMessage 函数返回的鼠标消息。使用这个Hook 监视输入到消息队列中的鼠标消息。11、WH_MOUSE_

14、LL Hook WH_MOUSE_LL Hook监视输入到线程消息队列中的鼠标消息。12、WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks 使我们可以监视菜单,滚动条,消息框,对话框消息并且发现用户使用ALT+TAB or ALT+ESC 组合键切换窗口。WH_MSGFILTER Hook 只能监视传递到菜单,滚动条,消息框的消息,以及传递到通过安装了Hook 子过程的应用程序建立的对话框的消息。WH_SYSMSGFILTER Hook 监视所有应用程序消息。WH_MSGFILTER 和 WH_S

15、YSMSGFILTER Hooks 使我们可以在模式循环期间过滤消息,这等价于在主消息循环中过滤消息。通过调用CallMsgFilter function可以直接的调用WH_MSGFILTER Hook。通过使用这个函数,应用程序能够在模式循环期间使用相同的代码去过滤消息,如同在主消息循环里一样。13、WH_SHELL Hook 外壳应用程序可以使用WH_SHELL Hook 去接收重要的通知。当外壳应用程序是激活的并且当顶层窗口建立或者销毁时,系统调用WH_SHELL Hook 子过程。WH_SHELL 共有钟情况:1.只要有个top-level、unowned 窗口被产生、起作用、或是被摧

16、毁;名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 8 页 -2.当 Taskbar 需要重画某个按钮;3.当系统需要显示关于Taskbar 的一个程序的最小化形式;4.当目前的键盘布局状态改变;5.当使用者按Ctrl+Esc去执行 Task Manager(或相同级别的程序)。按照惯例,外壳应用程序都不接收WH_SHELL 消息。所以,在应用程序能够接收WH_SHELL 消息之前,应用程序必须调用SystemParametersInfo function注册它自己。+回调函数(HOOK 处理子过程)+为了拦截和处理特定的消息,你可以使用SetWindowsHookEx 函数(下

17、面将具体说明这些函数的声明及各种参数)在该类型的HOOK 链中安装你自己的处理HOOK 的子过程(回调函数)。只要您安装的钩子的消息事件类型发生,WINDOWS 就将调用钩子函数。譬如您安装的钩子是WH_MOUSE类型,那么只要有一个鼠标事件发生时,该钩子函数就会被调用。不管您安装的是那一类型钩子,钩子函数的原型都时是一样的,语法如下:public function MyHook(ByVal nCode As Long,ByVal wParam As Long,ByVal lParam As Long)as long 处理代码end function 其中 MyHook可以随便命名,其它不能变

18、。该函数必须放在模块段。参数说明:nCode指定 HOOK 传入的信息类型。Hook 子过程使用这个参数来确定任务。这个参数的值依赖于Hook 类型,每一种Hook 都有自己的Hook 代码特征字符集。wParam:短整型参数。lParam:长整型参数。wParam,iParam 的取值随nCode不同而不同,它代表了某种类型的HOOK 的某个特定的动作。它们的典型值是包含了关于发送或者接收消息的信息。至于以上的几个参数及返回值的具体含义,各种类型的钩子都不相同,所以您必须查询WIN32 API 指南来得到不同类型钩子参数的详细定义以及它们返回值的意义。譬如:WH_CALLWNDPROC nC

19、ode 只能是 HC_ACTION,它代表有一个消息发送给了一个窗口wParam 如果非 0,代表正被发送的消息lParam 指向 CWPSTRUCT型结构体变量的指针return value:未使用,返回0 WH_MOUSE 名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 8 页 -nCode 为 HC_ACTION 或 HC_NOREMOVE wParam 包含鼠标的事件消息lParam 指向 MOUSEHOOKSTRUCT型结构体变量的指针return value:如果不处理返回0,否则返回非0 值+钩子的安装/卸载+现在我们知道了一些基本的理论,接下来开始讲解如何安装和卸

20、载一个钩子。安装钩子使用 SetWindowsHookEx 函数(API 函数),指定一个HOOK 类型、自己的HOOK 过程是全局还是局部 HOOK,同时给出HOOK 过程的进入点,就可以轻松的安装你自己的HOOK 过程。SetWindowsHookEx 总是将你的HOOK 函数放置在HOOK 链的 顶端。你可以使用CallNextHookEx函数将系统消息传递给HOOK 链中的下一个函数。注意 对于某些类型的HOOK,系统将向该类的所有HOOK 函数发送消息,这时,HOOK 函数中的CallNextHookEx语句将被忽略。全局(远程钩子)HOOK 函数可以拦截系统中所有线程的某个特定的消

21、息,为了安装一个全局HOOK过程,必须在应用程序外建立一个DLL,并将该 HOOK 函数封装到其中,应用程序在安装全局HOOK过程时必须先得到该DLL 模块的句柄。将DLL 名传递给LoadLibrary 函数,就会得到该DLL 模块的句柄;得到该句柄后,使用GetProcAddress函数可以得到HOOK 过程的地址。最后,使用SetWindowsHookEx 将 HOOK 过程的首址嵌入相应的HOOK 链中,SetWindowsHookEx 传递一个模块句柄,它为HOOK 过程的进入点,线程标识符置为0,指出:该HOOK 过程同系统中的所有线程关联。如果是安装局部HOOK 此时该 HOOK

22、 函数可以放置在DLL中,也可以放置在应用程序的模块段。(这个信息很重要!)建议只在调试时使用全局HOOK 函数。全局HOOK 函数将降低系统效率,并且会同其它使用该类HOOK 的应用程序产生冲突。SetWindowsHookEx 函数的 VB声明及参数解释:Public Declare Function SetWindowsHookEx Lib user32 Alias SetWindowsHookExA(ByVal idHook As Long,ByVal lpfn As Long,ByVal hmod As Long,ByVal dwThreadId As Long)As Long Se

23、tWindowHookEx 函数参数说明:idHook:代表是何种Hook(也就是上面讲的14 种 Hook)名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 8 页 -lpfn:代表处理Hook 的过程所在的Address,这是一个CallBack Fucnction(也就是上面讲的回调函数),当挂上某个Hook 时,我们便得定义一个Function来当作某个信息产生时,来处理它的 Function。因这个参数是一个 Function的 Address 所以我们固定将Hook Function放在.Bas中,并以AddressOf HookFunc传入hmod:代表.DLL 的

24、hInstance,如果是 Local Hook,该值可以是Null(VB中可传 0 进去),而如果是 Remote Hook,则可以使用GetModuleHandle(.dll名称)来传入。dwThreadId:代表执行这个Hook 的 ThreadId(线程 ID),如果不设定是那个Thread(线程)来做,则传0,而 VB的 Local Hook 一般可传App.ThreadId进去 ThreadID 是您安装该钩子函数后想监控的线程的ID 号。该参数可以决定该钩子是局部的还是系统范围的。如果该值为NULL,那么该钩子将被解释成系统范围内的,那它就可以监控所有的进程及它们的线程。如果您指

25、定了您自己进程中的某个线程ID 号,那该钩子是一个局部的钩子。如果该线程ID 是另一个进程中某个线程的ID,那该钩子是一个全局的远程钩子。这里有两个特殊情况:WH_JOURNALRECORD 和WH_JOURNALPLAYBACK 总是代表局部的系统范围的钩子,之所以说是局部,是因为它们没有必要放到一个DLL 中。WH_SYSMSGFILTER 总是一个系统范围内的远程钩子。其实它和WH_MSGFILTER钩子类似,如果把参数ThreadID 设成 0 的话,它们就完全一样了。SetWindowHookEx 函数回值:如果 SetWindowsHookEx()成功,它会传回一个值,代表目前的H

26、ook的 Handle,否则返回NULL。您必须保存该句柄,因为后面我们还要它来卸载钩子。CallNextHookEx函数的 VB声明及参数解释:Declare Function CallNextHookEx Lib user32 Alias CallNextHookEx(ByVal hHook As Long,ByVal ncode As Long,ByVal wParam As Long,lParam As Any)As Long hHook值是 SetWindowsHookEx()的传回值,nCode,wParam,lParam 则是回调函数中的三个参数。在钩子子程中调用得到控制权的钩子

27、函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个API 函数 CallNextHookEx来传递它,以执行钩子链表所指的下一个钩子子过程。这个函数成功时返回钩子链中下一个钩子过程的返回值,返回值的类型依赖于钩子的类型。卸载钩子要卸载一个钩子非常简单,只需要使用UnhookWindowsHookEx 函数来卸载创建的钩子。函数声明:Declare Function UnhookWindowsHookEx Lib user32 Alias UnhookWindowsHookEx(ByVal hHook As Long)As Long 名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 8 页 -参数说明:hHook:是 SetWindowsHookEx()的传回值,上面告诉过你要记下来嘛。_ 名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 8 页 -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁