挂钩子

科普中国-科学百科 2018-04-20 作者:麦永浩

  挂钩子不仅是Windows消息处理机制的一个平台,也是消息处理中的一个环节。钩子机制允许应用程序截获处理window消息或特定事件,并监控消息在系统中的传递。钩子技术即指“给特定的函数挂上钩子,让函数在执行前先执行被挂的钩子”,从而达到拦截事件和函数调用的目的。挂钩子的本质是一个程序段,因此在网络技术不断发展之后,该技术广泛用于软件研发、视频截取、网络攻击与网络安全,通过与不同的函数结合还可达到不同的目的。

  挂钩技术工作原理

  1)HOOK可以监视和截获系统或进程中的各种事件消息;(2)截获消息后,将本由原API函数处理的消息交给自定义的函数(自定义的函数,即钩子函数)处理,并做出处理动作。如即时翻译软件做出的对截获的文字进行翻译的动作;(3)HOOK技术有一个基本原则:被HOOK的API的原有功能不受到任何影响。即指在HOOK API之后,若钩子解除,系统仍能正常运作,正常功能不受到影响。举个简单的例子,比如一些基于HOOK技术的安全软件,在监视系统运行时,若发现有非法进程,会立即为用户弹出提示窗口,提示用户“阻止”或“放行”。选择“阻止”,就是将消息交给钩子函数处理;或用户认为属于“误报”,选择“放行”,就是不影响进程正常流程,让其正常运行。这正是遵守了这一原则。(4)由于增加了系统对每个消息的处理量,因此HOOK会使系统变慢。这也正是很多基于HOOK技术的安全软件在安装运行之后会影响系统速度的原因。1

  HOOK的分类及其主要作用

  按事件分类及其作用:

  (1)键盘钩子和低级键盘钩子可以监视各种键盘消息。

  (2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。

  (3)外壳钩子可以监视各种Shell事件消息。如启动和关闭应用程序。

  (4)日志钩子可以记录从系消息队列中取出的各种事件消息。

  (5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。

  按使用范围分类:

  主要有线程钩子和系统钩子。线程钩子监视指定线程的事件消息;系统钩子监视系统的所有线程的事件消息。

  特殊类别——日志钩子:

  日志钩子是一种很特别的钩子,它只是在系统信息(如键盘信息和鼠标信息等)进出队列时才起作用。系统中只存在一个这样的日志钩子,所以无论我们要提取鼠标信息还是键盘信息都只需加载一次日志钩子,因此利用日志钩子提取系统信息的方法,与以往的方法比较起来就显得简单、快捷。日志钩子函数在系统中优先级最大,一般情况下日志钩子是在系统之前就处理了它所需要处理的信息,因此对于日志钩子来说,系统无法将它所需的信息屏蔽,让日志钩子无法提取。日志钩子函数可以提取出别的钩子函数无法提取的信息。2

  HOOK技术与函数结合修改函数地址

  HOOK处理特地消息的本领,使它能够将自身的代码“融入”被hook住的程序的进程中,成为目标进程的一个部分,在windows2000以后的系统中,普通用户程序的进程空间都是独立的,程序的运行彼此间都不受干扰。这就使我们希望通过一个程序改变其他程序的某些行为的想法不能直接实现,但是hook的出现给我们开拓了解决此类问题的道路。在windows系统下编程,应该会接触到API函数的使用,常用的API函数大概有2000个左右。随着控件,STL等高效编程技术的出现,API的使用概率在普通的用户程序上就变得越来越小了。当诸如控件这些现成的手段不能实现的功能时,我们还需要借助API。最初有些人对某些API函数的功能不太满意,就产生了如何修改这些API,使之更好的服务于程序的想法,这样API HOOK就自然而然的出现了。我们可以通过API HOOK,改变一个系统API的原有功能。基本的方法就是通过HOOK“接触”到需要修改的API函数入口点,改变它的地址指向新的自定义的函数。APIHOOK并不属于MSDN上介绍的13类hook中的任何一种。所以说,API HOOK并不是什么特别不同的hook,它也需要通过基本的hook提高自己的权限,跨越不同进程间访问的限制,达到修改API函数地址的目的。对于自身进程空间下使用到的API函数地址的修改,是不需要用到API HOOK技术就可以实现的

  基于HOOK技术的网络流媒体截获机制

  目前,市场上流行多种网络即时通信软件,例如QQ、MSN和BOLSIP等等。这些即时通信软件在运行时,除了交互信令信息外,还会传递大量流媒体数据。VOIP数据如果针对这些软件交互的流媒体数据,在传递路径中进行实时截获,并使用机密信息的嵌入等复用操作,再及时发送出去这样就可以实现端到端的隐蔽通信因此,如何截获这些即时通信软件的流媒体数据是我们研究的重点在windows环境下,采用HOOK技术来截获网络数据的基本策略如下:

  DLL注入方法分析由于windows系统的进程间无法共享内存地址,必须通过动态链接库[DLL]注入,将包含我们自定义的函数的DLL加载到目标进程的地址空间DLL注入最主要的方法有3种:改注册表、使用windows HOOK、使用远程进程。本文使用第3种方法windows的大多数函数只允许对当前进程进行操作这是很好的一个特性,因为它能够防止一个进程破坏另一个进程的正常运行,但是,有些函数却允许一个进程对另一个进程进行操作这些函数大部分最初是为调试程序和其他工具设计的,不过任何函数都可以调用这些函数,windows提供了一个称为Create Remote Thread的函数,使我们能够非常容易地在另一个进程中创建线程在完成了在另一个进程中创建进程的操作后,我们可以通过使用Road library函数,将需要注入到后一个进程的DLL加载到进程空间中,这种方法具有很大的灵活性,HOOK API方法分析API挂接并不是一个新技术,挂接API的一般方式有两种一种是修改API本身代码另一种是修改IAT。IAT即当链接程序进行输入符号转换时,它会将一个叫做“输入节”的模块放入到可执行映像中这个输入节包含了该模块所需的DLL名以及该模块会用到的每个DLL中的符号列表当模块调用一个输入函数时,线程实际上要从模块的输入节中捕获需要的输入函数的地址,然后转移到该地址要挂接一个特定的API,只需要改变模块的输入节中的地址即可,基于上述分析,针对目前即时通信软件的特点,设计了一种通用的即时通信软件的流媒体截获基本框架,如图1所示。3

  

  本词条内容贡献者为:

  麦永浩 - 教授 - 湖北警官学院电子数据取证重点实验室

责任编辑:科普云

上一篇:固定证据

下一篇:零漂改正

科普中国APP 科普中国微信 科普中国微博
科普中国-科学百科
是中国科协为深入推进科普信息化建设而塑造的全新品牌,旨在以科普内容建设为重点,充分依托现有的传播渠道和平台,使科普信息化建设与传统科普深度融合,以公众关注度作为项目精准评估的标准,提升国家科普公共服务水平。

猜你喜欢