原文发表于
http://hi.baidu.com/sk_soulkeeper/item/f3203470e93ad3166ec37c90Acknowledgment
Thanks to achillis for his excellent paper that inspired me greatly.here is the link
http://bbs.pediy.com/showthread.php?t=99460 ,it is extremely helpful on my comprehension of hookport and windows kernel. As some parts were cited from his paper, he is the real author in some degree.
SoulKeeper
一 概述
Hookport并没有使用通常的方式——直接修改SSDT和SSDTShadow进行挂钩。由于两个表中的函数最终是由系统未导出的函数KiFastCallEntry调用的。所以Hookport在适当的位置挂载了KiFastCallEntry函数,达到了过滤的目的。HookPort总共Hook了145个SSDT或ShaddowSSDT函数。
HookPort准备了两个表,SSDTHookFilter和FilterRule。前者保存了SSDT和Shadow SSDT中的Hook函数地址以及开关,同时建立一张过滤函数表(详见附录一 过滤函数表)这张表存放需要代理的例程函数的索引号,过滤函数使用的是在此表中的索引,不是函数在SSDT中的位置为索引的,后者保存了过滤函数的地址和规则,是按照93h个函数作为索引的。代理函数最终会调用过滤函数检查参数或执行结果。
代理函数指针结构体的定义如下
struct struct_SSDTHookFilter
{
DWORD ProxySSDTServiceAddress[2001]; //
DWORD ProxyShadowSSDTServiceAddress[2001];
DWORD SwitchTableForSSDT[2001];
DWORD SwitchTableForSSDTShaddow[2001];
};
过滤规则表
struct struct_FilterRule
{
int Size;
struct_FilterRule *Next; //规则链
int IsFilterFunFilledReady;
DWORD *pSSDTFilterSwitch;
DWORD *pShaddowSSDTFilterSwitch;
char pName[16];
int ModuleBase;
int ModuleSize;
int FilterFunc[147]; //本规则对应的过滤函数
};
SSDTHookFilter结构之所以占据近6K的连续内存空间,是因为KiFastCallEntry是一个频繁被系统调用的函数,所以钩子的效率十分重要,使用连续的空间可以节省出大量寻址时间,是一种空间换时间的做法。
当程序因为系统调用而进入KiFastCallEntry函数时,会经过两次跳转进入到一个代理开关函数中,这个函数会返回一个函数地址,这个地址可能是SSDT中原函数的地址,也可能是SSDTHookFilter表中Hook函数的地址。到底返回哪个要根据FilterRule中的规则来判断。这样就达到了SSDT HOOK的目的。
Hookport只提供了最为基本的过滤操作和桩函数,本身并没有实现策略部分。策略部分由其他驱动模块(如XXXrosdrv.sys)实现,并通过设备扩展进行沟通。
设备扩展结构的定义
struct struct_HookPortExtension
{
_DWORD State;
_DWORD HookPort_FilterRule_Init;
_DWORD HookPort_SetFilterSwitchFunction;
_DWORD HookPort_SetFilterRule;
_DWORD HookPort_SetFilterRuleName;
_DWORD Value3F0;
};
设备扩展包含了添加规则的接口,其他驱动需要增加规则时只需要获取Hookport的驱动扩展访问里面的HookPort_FilterRule_Init初始化一条规则,HookPort_SetFilterSwitchFunction 设置规则过滤函数。
HookPort_FilterRule_Init 初始化规则,新建规则会加到规则链中
HookPort_SetFilterSwitchFunction 设置规则过滤函数
HookPort_SetFilterRuleFlag 设置规则开关
HookPort_SetFilterRuleName设置规则名字
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课