hook9大类

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

hook9⼤类
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函数表来实现的。

相关文档
最新文档