zoukankan      html  css  js  c++  java
  • Hook基本知识

    一、什么是HOOK(钩子) 

            Windows系统,建立在事件驱动机制上,就是整个系统都是通过消息传递实现的。hook(钩子)是一种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往目标窗口的消息并进行处理。
            钩子的种类很多,每种钩子可以截获相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。钩子可以分为线程钩子和系统钩子,线程钩子可以监视指定线程的事件消息,系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL) 中。
           所以说,hook(钩子)就是一个Windows消息的拦截机制,可以拦截单个进程的消息(线程钩子),也可以拦截所有进程的消息(系统钩子),也可以对拦截的消息进行自定义的处理。

    二、HOOK分类:



    1、 Ring3 层的 Hook 基本上可以分为两种大的类型:

    第一类即是 Windows 消息的 Hook,第二类则是 Windows API 的 Hook。


    消息 Hook 是通过 SetWindowsHookEx 可以实现将自己的钩子插入到钩子链的最前端,

    而对于发送给被 Hook 的窗口(也有可能是所有的窗口,即全局 Hook)的消息都会被我们的钩子处理函数所捕获到,

    也就是我们可以优先于窗体先捕获到这些消息

    (1)进程内消息 Hook:可以简单的将 Hook 处理函数直接写在这个进程内,即是自己 Hook 自己。

    (2)全局消息HOOK:

    需要将 Hook 处理函数写在一个 DLL 中,这样才可以让你的处理函数被所有的进程所加载(进程自动加载包含 Hook 消息处理函数的 DLL)。


    2、Ring0 层的 Hook


    (1)SSDT hook,一句话——Windows把需要调用的内核API地址全都保存在一个表中(System Service Dispatch Table),要想hook一个内核API,比较简单的办法就是把该内核API在表(SSDT)中保存的地址修改为自己撰写的函数地址。

    (2)HOOK INT 2E 方法:IDT HOOK

    IDT是中断描述表,可以替换其中的中断处理程序。

    这种方法对于跟踪、分析系统调用来说用的比较多。原理是通过替换 IDT
    表中的 INT 2E 中断,使之指向我们自己的中断服务处理例程来实现的。掌握
    此方法需要你对保护模式有一定的基础。

    (3) HOOK PE 方法:EAT HOOK
    这种方法对于拦截、分析其他内核驱动的函数调用来说用的比较多。原理
    是根据替换 PE 格式导出表中的相应函数来实现的。

    EAT是可执行文件的导出表,记录DLL中可供其他程序使用的函数,可执行文件装载时会使用相应DLL的EAT表来初始化IAT表,通过替换EAT表中的函数地址,就可以使依赖于本DLL的程序得到一个假的地址。



    (4)IAT HOOK (ring3 用)

    IAT是可执行文件的导入表,记录可执行文件使用的其它DLL中的函数,通过替换IAT表中的函数地址,可以hook相应DLL中的函数调用。



    (5)Inline Hook方法 (ring 0和ring3 都可以用)

    Inline hook的工作流程:
    1)验证内核API的版本(特征码匹配)。
    2)撰写自己的函数,要完成以上三项任务。
    2)获取自己函数的地址,覆盖内核API内存,供跳转。

    Inline Hook的缺点:
    1) 不够通用。各个windows版本中,内核API的开始一段不尽相同,要想通吃,就要多写几个版

    本或者做一个特征码搜索(因为有的内核API在各个版本中非常相似,只是在“特征码”之前或之

    后加一点东西)。
    2) 已被一些检测工具列入检测范围,如果直接从内核API第一个字节开始覆盖,那么很容易被检

    测,如果把覆盖范围往后推,并加以变形,也许能抵挡一气。具体情况,我才疏学浅,尚未试验



    (6)SYSENTRY hook
    为了性能的考虑,xp后的系统都改用sysentry命令来进入ring0,去调用SSDT中的服务,不再是通过IDT中的 int 2E。这也使得我们hook也变得相对容易了。
    首先获得sysentry的地址,然后改之,不用再考虑IDT了



    (7)IRP hook
    IRP是 I/O request packets,驱动程序中有一系列分发例程来处理请求,这些例程保存在驱动设备对象的数据结构中的一个表中,也很容易替换。

    三、HOOK(钩子)的工作原理

           当创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果安装的是一个线程钩子,进程中的钩子函数将被调用。如果是一个系统钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中。

          当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。
           几点需要说明的地方: 
      (1) 如果对于同一事件(如鼠标消息)既安装了线程钩子又安装了系统钩子,那么系统会自动先调用线程钩子,然后调用系统钩子。 
      (2) 对同一事件消息可安装多个钩子处理过程,这些钩子处理过程形成了钩子链。当前钩子处理结束后应把钩子信息传递给下一个钩子函数。而且最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。 
      (3) 钩子特别是系统钩子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装钩子,在使用完毕后要及时卸载。

  • 相关阅读:
    ASP.NET中JS简单调用webservices的方法
    WINDOWS SERVER 2003使用IIS服务配置WEB站点(转)
    Tomcat安装配置(转)
    javascript 调用.net后台的数据 和方法
    win7下,sql2005安装,提示 iis功能和com+目录要求 的解决
    Vista或windows7远程桌面控制服务器较慢 反应迟钝
    Asp.net Ajax的使用
    记录远程登陆用户的IP
    Ext.menu.Menu 属性及基础应用
    关于VS2005 无法使用切换到设计视图的解决方法
  • 原文地址:https://www.cnblogs.com/code1992/p/11395613.html
Copyright © 2011-2022 走看看