KeServiceDescriptorTable 与 KeServiceDescriptorTableShadow

 早先“盗用”过公开的Re SSDT的源代码,对SSDT多少还是了解些,也Hook 过SSDT,但一直对另外一个SSDT——Shadow SSDT不甚了解,只知道它跟GUI调用有莫大的关系,具体怎么联系起来的,说不清楚。
  最近研究起了Hook ShadowSSDT这个东西,经过查找资料、阅读Win2k的源码,以及WinDbg闹腾了半天,才终于明白了KeServiceDescriptorTable 和 KeServiceDescriptorTableShadow到底是什么样的关系。
众所周知,KeServiceDescriptorTable在ntoskrnl.exe中被导出了,在我们的代码中只需要extern一下就可以方便的对其进行引用。网上流行的代码,把KeServiceDescriptorTable的类型定义为指向类似下面结构的指针(这是我从Win2k源码中摘出来的):
typedef struct _KSERVICE_TABLE_DESCRIPTOR {
    PULONG_PTR Base;
    PULONG Count;
    ULONG Limit;
    PUCHAR Number;
} KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
  遗憾的是,这些代码让我有一个误判断,认为SSDT就是一个KSERVICE_TABLE_DESCRIPTOR结构,而KeServiceDescriptorTable就是指向这个KSERVICE_TABLE_DESCRIPTOR的指针。这种理解让我对ShadowSSDT相当的迷糊。真正今天,才算是明白了这个ShadowSSDT到底是个什么东西。
实际上,KeServiceDescriptorTable描述成下面的结构更便于描述和理解:
typedef struct _KSERVICE_TABLE_DESCRIPTOR_TABLE {
   KSERVICE_TABLE_DESCRIPTOR NativeApiTable;
   KSERVICE_TABLE_DESCRIPTOR Win32kApiTable;
   KSERVICE_TABLE_DESCRIPTOR NotusedTable;
   KSERVICE_TABLE_DESCRIPTOR NotusedTable;
} KSERVICE_TABLE_DESCRIPTOR_TABLE, * KSERVICE_TABLE_DESCRIPTOR_TABLE;
  其中所谓的ShadowSSDT,就是由KSERVICE_TABLE_DESCRIPTOR_TABLE结构的第二个表:Win32kApiTable(注意这个名字是我起的,仅便于理解)来描述的。但是KeServiceDescriptorTable的这个成员是没有被使用的,全值为0。这就到KeServiceDescriptorTableShadow上场了。
  KeServiceDescriptorTableShadow其实就是KeServiceDescriptorTable的复制品,唯一的区别就是它的Win32kApiTable是有效的。当Win32k.sys初始化之前,KeServiceDescriptorTableShadow与KeServiceDescriptorTable完全一致,Win32kApiTable同样为0,没有任何的意义。Win32k.sys初始化时,会调用KeAddSystemService将GUI相关的系统调用添加进KeServiceDescriptorTableShadow中的Win32kApiTable中,直到这时,KeServiceDescriptorTableShadow才和KeServiceDescriptorTable有了区别。
  也就是说,Win32k的GUI系统调用表,保存在KeServiceDescriptorTableShadow的第二个成员:Win32kApiTable中,也就是KeServiceDescriptorTableShadow的0x10偏移处。这么简单点东西,让我花了一整个下午的时间来闹腾,真是笨到家了。
最后附上Windows 2000源代码中KeServiceDescriptorTableShadow 和 KeServiceDescriptorTable的声明:
#define NUMBER_SERVICE_TABLES 4
extern KSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable[NUMBER_SERVICE_TABLES];
extern KSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTableShadow[NUMBER_SERVICE_TABLES];
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值