首页
社区
课程
招聘
Hookport逆向分析
发表于: 2014-11-4 10:51 4471

Hookport逆向分析

2014-11-4 10:51
4471
原文发表于
http://hi.baidu.com/sk_soulkeeper/item/f3203470e93ad3166ec37c90

Acknowledgment
  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直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 249
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好贴QAQ
2014-11-4 11:23
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看帖子楼主分析得好像是新版,结果因为看了太多achillis的分析,新版的亮点和好处一点都没分析出来,还是achillis工作的重复。
2014-11-4 17:00
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
KMAN说说亮点吧
2014-11-4 17:48
0
雪    币: 6
活跃值: (1104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
上来就是E文啊,呵呵,
文章写得还好吧
2014-11-4 18:10
0
游客
登录 | 注册 方可回帖
返回
//