hook浅析

来源:互联网 发布:银行数据录入员 编辑:程序博客网 时间:2024/05/21 09:52

1.hook由来

     通常情况下,应用程序只能处理来自进程内部的消息或是从其他程序发送过来的消息。如果要处理进程外

的消息,需要拦截消息,此时采用的就是钩子技术。


2.hook分类

 

3.几种常见的钩子类型

    a)API钩子:方式有以下三种:修改程序的IAT表;修改api入口的机器码;创建远线程。

        修改api入口的机器码已知的编程技术为detours,这是微软提供的一个库。可从以下地址下载源码:

http://research.microsoft.com/en-us/projects/detours/   此方式官网称只支持专业版操作系统。

        创建远线程:CreatRemoteThread。

    b)SSDT:System Servics Descriptor Table:系统服务描述符表。把Ring3的win32 API和Ring0的内核Api

联系起来。具体详情可以参考此推荐博文:http://www.cnblogs.com/BoyXiao/archive/2011/09/03/2164574.html

 

4.钩子格式

    a)钩子处理函数必须是一个回调函数,而且不能定义为类成员函数,必须定义为普通的C函数。

    b)钩子分为全局钩子和进程钩子;全局钩子监视所有进程,全局钩子需使用DLL,这样可以被所有进程加载。

进程钩子监视特定进程。

 

5.具体实现

    5.1 注册表注入dll

        注册表注入的方式是最简单的方式,但是还是存在一些局限性;主要用到注册表:

        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows

内容主要如下:


        此处使用了两个地方,AppInit_DLLs,此键值可能会包含一个DLL的文件名或一组DLL的文件名(通过空格

或逗号分隔)。由于空格是分隔文件名的,所以文件名中不能存在空格。键值的第一个文件可以包含路径,其他

不能包含路径。可以把你的钩子dll放入此键值中,为了能够让系统使用这个注册表项,我们必须创建一个名为

LoadAppInit_DLLs,类型为DWORD,值为1。

        原理:User32.dll被映射到一个新的进程时,会受到DLL_PROCESS_ATTACH通知。当User32.dll对它

进行处理时,会获取上述注册表键值,并调用LoadLibrary来载入指定的每个dll。会调用dll的DLLMain函数

进行初始化。

        总结:此种注入方式是最方便的一种,但是存在某些限制,根据原理说明我们知道如果进程没有调用

User32.dll,此种方式无效。即此种方式适用于GUI的应用程序,CUI的程序不适用。


    5.2 使用windows挂钩来注入DLL

        5.2.1 钩子的安装和卸载

            SetWindowsHookEx:把此钩子放在钩子链表的开始位置。

            UnhookWindowsHookEx:卸载此钩子。