HOOK技术主要分为两大类,一是内核层HOOK,一是用户层HOOK. 用户层HOOK也就是在ring3环境下hook kenerl32.dll、
User3.dll、Gui32.dll、Advapi.dll等导出的函数。而内核层HOOK就是HOOK只有ring0级别环境下才能操作写入改变的内核
对象,例如SSDT系统服务描述符表等。综合而言,主要有以下9种HOOK技术。

(1)消息钩子
消息钩子是最常见的钩子之一,例如常见的键盘鼠标钩子,很多木马就是通过消息钩子获取密码的。消息钩子是由Win32子
系统提供,用户通过它注册全局钩子。当系统获取某些事件,比如用户按键,键盘driver将扫描码等传入win32k的KeyEvent
处理函数,处理函数判断有无相应hook,有则通过回调函数处理。此时,系统取得Hook对象信息,若目标进程没有装载对应
的Dll,则装载之。

(2)IAT HOOK
IAT HOOK[4]是最常见和普遍的HOOK之一。IAT表示导入地址表(Import Address Table),导入函数就是被程序调用但其执行
代码又不在程序中的函数,当PE 文件被装入内存的时候,Windows 装载器才将DLL 装入,并将调用导入函数的指令和函数
实际所处的地址联系起来(动态连接),这种操作就需要导入表完成。其中导入地址表就指示函数实际地址。程序每个调用的 
API 函数地址都保存在 IAT 表中,而每个调用 API 函数的 CALL 指令所使用的地址都是相应函数登记在 IAT 表的地址。
IATHOOK原理是在将 IAT 表中的地址换成用户自己的 函数地址,这样每个 API 调用都是先调用用户自己的 函数。在这个
函数中我们可以完成函数名称的记录、参数的记录、调用原来的过程,并在返回时记录结果。

(3)EAT HOOK
EAT HOOK的原理是根据替换 PE 格式导出表中的相应函数来实现的。EAT表示导出地址表(Export Address Table),EAT存在
于PE文件中的edata节,保存了可执行文件(如DLL 文件)的导出的可供其他模块来调用的函数和公共变量,包括函数名称
和地址等。通过替换Windows 系统某些重要DLL中的输出函数地址,即可实现目标函数的挂接。EAT记录DLL中可供其他程序
使用的函数,可执行文件装载时会使用相应DLL的EAT表来初始化IAT表。
EAT HOOK原理是通过替换EAT表中的函数地址,使依赖于本DLL的程序得到一个假的地址。

(4)SSDT HOOK
SSDT是最常见的内核层 HOOK。SSDT的全称是系统服务描述符表(System Services Descriptor Table)。SSDT是关联ring3的
Win32 API和ring0的内核API的重要数据结构,它存储着Windows把需要调用的所有内核API地址。
SSDT HOOK原理是将内核层 API地址修改为指向其位于Ring0层的驱动入口,这样每次系统执行到这个函数时,都会通过SSDT表将原始调用引向修改后的模块中。

(5)IDT HOOK
IDT HOOK是Win2000操作系统上常用的一种HOOK。IDT是中断描述表,可以替换其中的中断处理程序。这种方法对于跟踪、分析系统调用来说用的比较多。
IDT HOOK的原理是通过替换 IDT表中的 INT 2E 中断,使之指向新的中断服务处理例程来实现的。它首先保存出特定的中断
向量中断服务程序(ISR), 然后直接修改该中断向量的ISR为自定义的函数,每当这个中断向量对应的中断产生时,就会调用
自定义的函数。由于我们自定义的函数里面执行完我们的功能后再跳转到原ISR处执行。

(6)SYSENTRY HOOK
SYSENTRY是Windows XP之后的操作系统进入ring0的函数。Win2000中通过 int2e系统调用机制,涉及到的
Interrupt/Exception Handler的调用都是通过 call/trap/task这一类的gate来实现的,这种方式会进行栈切换,并且系统
栈的地址等信息由TSS提供,可能会引起多次内存访问 (来获取这些切换信息),系统开销较大。SYSENTER通过汇编指令实现快速系统调用机制。
SYSENTER HOOK的原理是首先Ntdll 加载相应的请求服务号到EAX 寄存器中,同时EDX 寄存器存贮当前的栈指针ESP,然后
Ntdll发出SYSENTER 指令,该指令转移控制权到寄存器IA32_SYSENTER_EIP 存贮的地址中[21],通过修改这个地址,可实现
相应的挂接。

(7)Inline HOOK
inline hook是直接在以前的函数体内修改指令,用一个跳转或者其他指令来实现挂钩的目的。 
而普通的hook只是修改函数的调用地址,而不是在原来的函数体里面做修改。
Inline hook原理是解析函数开头的几条指令,把他们Copy到数组保存起来,然后用一个调用我们的函数的几条指令来替换
,如果要执行原函数,则在我们函数处理完毕,再执行我们保存起来的开头几条指令,然后调回我们取指令之后的地址执行
。它需要在程序中嵌入汇编代码(Inline Assembly)以操作堆栈和执行内核API对应的部分汇编指令。

(7)OBJECT HOOK
OBJECT HOOK是相对于IAT HOOK之类的 API HOOK而言,API HOOK是挂钩应用层函数,而OBJECT HOOK是挂钩内核层函数。其原理与API HOOK类似。

(9)IRP HOOK
IRP是 I/O request packets,在Windows中几乎所有的I/O都是通过包(packet)驱动的,每个单独的I/O由一个工作命令描
述,此命令将会告诉驱动程序需要一些什么操作,并通过I/O子系统跟踪处理过程。这些工作命令就表现为一个个被称为IRP
的数据结构。
IRP HOOK原理是拦截管理器发向文件或网络系统等驱动程序的IRP。一般通过创建一个上层过滤器设备对象并将之加入系统
设备所在的设备堆栈中。也有部分IRP HOOK通过拦截传递IRP请求包的函数IofCallDriver或MajorFunction函数表来实现的。

hook 9大类的更多相关文章

  1. Android布局6大类

    1:在我们Android开发中,常见的布局的方式有6大类 线性布局LinearLayout 相对布局RelativeLayout 表格布局TableLayout 单帧布局FrameLayout 绝对布 ...

  2. dll的加载方式主要分为两大类,显式和隐式链接

    之前简单写过如何创建lib和dll文件及简单的使用(http://blog.csdn.net/betabin/article/details/7239200).现在先再深入点写写dll的加载方式. d ...

  3. 今天工作中遇到的根据用户id取得产品大类和相关小类的问题

    今天做了一个项目,需求是客户登陆后,可以从会员中心发布详细信息(包括联系信息和公司信息),插入到数据库后在将来生成一个公司页面模板,一般的产品大类+小类 用repeater嵌套就可以了,但是这个涉及到 ...

  4. 【Java知识点专项练习】之 数据类型两大类

    Java的数据类型分为两大类:基本类型和引用类型: 基本类型只能保存一些常量数据,引用类型除了可以保存数据,还能提供操作这些数据的功能: 为了操作基本类型的数据,java也对它们进行了封装, 得到八个 ...

  5. 关于fmri数据分析的两大类,四种方法

    关于fmri数据分析的两大类,四种方法: 数据驱动: tca:其实这种方法,主要是提取时间维的特征.如果用它来进行数据的分析,则必须要利用其他的数据方法,比如结合ICA. ica:作为pca的一般化实 ...

  6. 技术流:6大类37种方式教你在国内推广App

    转自:http://www.gamelook.com.cn/2015/01/201906 如何有效的推广自己App,是每个发行商都要考虑的问题,当然每个产品都有适合自己的推广方式.本文就集结了包括应用 ...

  7. Access Violation分成两大类:运行期和设计期(很全的解释)

    用Delphi开发程序时,我们可以把遇到的Access Violation分成两大类:运行期和设计期. 一.设计期的Access Violation 1.硬件原因  在启动或关闭Delphi IDE以 ...

  8. 一线大厂Java面试必问的2大类Tomcat调优

    一.前言 最近整理了 Tomcat 调优这块,基本上面试必问,于是就花了点时间去搜集一下 Tomcat 调优都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录,下面就来介绍 ...

  9. CSS的选择器分为两大类

    CSS的选择器分为两大类:基本选择题和扩展选择器. 基本选择器: 标签选择器:针对一类标签 ID选择器:针对某一个特定的标签使用 类选择器:针对你想要的所有标签使用 通用选择器(通配符):针对所有的标 ...

随机推荐

  1. K-means算法的实现

    K-MEANS算法是一种经典的聚类算法,在模式识别得到了广泛的应用.算法中有两个关键问题需要考虑:一是如何评价对象的相似性,通常用距离来度量,距离越近越相似:另外一个是如何评价聚类的效果,通常采用误差 ...

  2. cdnbest节点安装后连不上cdn主控原因排查

    1. 查看节点程序是否启动 ps -aux |grep kangle 2. 登陆cdn节点用telnet命令查下和主控的通信,命令:telnet 主控ip 3320 3. 如果节点程序都有启动,可查看 ...

  3. 站点防火墙频率api php案例

    <?php $apiHost = "http://35.201.139.124/api2/site/index.php"; $router = "token&quo ...

  4. ajax+js数据模板+后台

    .net 后台,ajax+js模板引擎的数据填充,制作无刷新分页 js模板用laytpl 待续...

  5. style标签下的CSS代码的显示与实时编辑

    style标签也是标签 首先设置body style的样式 body style{ display:block; padding:0.6em 0.8em; border:1px dashed #ccc ...

  6. Shell教程 之数组

    1.定义数组 数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 与大部分编程语言类似,数组元素的下标由0开始. Shell ...

  7. linux同步机制

    很早之前就接触过同步这个概念了,但是一直都很模糊,没有深入地学习了解过,近期有时间了,就花时间研习了一下<linux内核标准教程>和<深入linux设备驱动程序内核机制>这两本 ...

  8. Wannafly挑战赛13 B:Jxc军训(逆元)

    题目描述 在文某路学车中学高一新生军训中,Jxc正站在太阳下站着军姿,对于这样的酷热的阳光,Jxc 表示非常不爽. Jxc将天空看做一个n*n的矩阵,此时天上有m朵云,这些云会随机分布在m个不同的位置 ...

  9. pa sslvpn使用手册

    1.浏览器输入https://x.x.x.x 根据电脑操作系统及位数选择下载 2.安装 直接“下一步”,到  输入IP地址x.x.x.x 点击连接会有证书错误提示 此时点击显示证书→本地计算机→安装到 ...

  10. sqlserver2017 +SSMS+ VS2017+SSDT 安装要点及相关组件下载地址

    1.sqlserver2017安装PolyBase需要安装jdk7 ,注意必须是7  jdk10是不行的. 下载地址:http://dl-t1.wmzhe.com/30/30117/jdk_7u_1. ...