钩子(Hook)技术

钩子(Hook)其实就是windows下替换DOS下的“中断”功能的一种机制。

什么是钩子呢?说白了,就是我们在某个进程上挂上我们的钩子(我们自己的程序),那么在该进程执行的时候,他首先会引起我们的钩子程序的运行。

用户态API挂钩技术

windows下,系统主要依赖三个子系统:win32POSIXOS/2。每个子系统有一套比较完备的API库。一个进程可以通过这些API访问到OSWin32应用程序主要使用Kernel32user32Gui32Advapi.dll等几个DLL文件将请求发送到系统核心。 应用程序在调用到这些.DLL文件的导出函数时,需要把这些DLL文件加载到内存中,并且把他们在内存的地址写入自己的导入表(Import Address Table)中,当进程需要访问时,直接跳到IAT的地址。

由于应用程序把DLL加载到介于0x000100000x7FE00000之间的私有地址之间,所以只要我们能够访问到应用程序的私有地址,我们就可以随意改变应用程序的IAT的地址,这就是API钩子。

用户态的API挂钩分为IAT挂钩和内敛函数挂钩(Inline Function Hooking)。

核心态挂钩技术

用户态挂钩技术虽然很有用,但是很容易被检测出来。常用的核心态挂钩技术分为三类:

1.         挂钩系统服务描述表

Windows本身运行在核心态,对其他的子系统提供本地系统支持服务。本地系统支持服务的地址在一个叫做System Service Dispatch TableSSDT)的结构中列出,在另外一个表System Service Parameter TableSSPT)中列出每个服务的参数字节长度。

KeServiceDescriptorTable是系统导出的表,它有一个由SSDTNtoskrn.exe的指向系统核心服务的指针,也有指向SSPT的指针。

挂钩需要实现为一个驱动程序,通过核心内存中的SSDT函数指向实现挂钩。但是在XP以后,SSDT表被禁止修改了,目前只能通过MDL映射后再修改。

2.         挂钩中断描述表(Interrupt Description Table

中断描述表指定了中断后的操作,挂钩IDT会改变中断的处理结果,并且不会返回到原来的中断处理。
    IDT中每一项都有中断处理函数的地址,只要修改地址,就可以实现挂钩。

3.         挂钩IRP函数表

当一个驱动程序安装后,它会初始化一个函数指针表,该表的每一个指针都指向不同的IRP函数地址。由于驱动工作在底层,所以是挂钩理想的位置。

posted on 2009-04-17 11:19  Eric Tsao  阅读(1108)  评论(0编辑  收藏  举报

导航