钩子(Hook)技术
钩子(Hook)其实就是windows下替换DOS下的“中断”功能的一种机制。
什么是钩子呢?说白了,就是我们在某个进程上挂上我们的钩子(我们自己的程序),那么在该进程执行的时候,他首先会引起我们的钩子程序的运行。
用户态API挂钩技术
在windows下,系统主要依赖三个子系统:win32、POSIX、OS/2。每个子系统有一套比较完备的API库。一个进程可以通过这些API访问到OS。Win32应用程序主要使用Kernel32、user32、Gui32、Advapi.dll等几个DLL文件将请求发送到系统核心。 应用程序在调用到这些.DLL文件的导出函数时,需要把这些DLL文件加载到内存中,并且把他们在内存的地址写入自己的导入表(Import Address Table)中,当进程需要访问时,直接跳到IAT的地址。
由于应用程序把DLL加载到介于0x00010000和0x7FE00000之间的私有地址之间,所以只要我们能够访问到应用程序的私有地址,我们就可以随意改变应用程序的IAT的地址,这就是API钩子。
用户态的API挂钩分为IAT挂钩和内敛函数挂钩(Inline Function Hooking)。
核心态挂钩技术
用户态挂钩技术虽然很有用,但是很容易被检测出来。常用的核心态挂钩技术分为三类:
1. 挂钩系统服务描述表
Windows本身运行在核心态,对其他的子系统提供本地系统支持服务。本地系统支持服务的地址在一个叫做System Service Dispatch Table(SSDT)的结构中列出,在另外一个表System Service Parameter Table(SSPT)中列出每个服务的参数字节长度。
KeServiceDescriptorTable是系统导出的表,它有一个由SSDT中Ntoskrn.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) 编辑 收藏 举报