X64系统下的KeServiceDescriptionTable

    最近在搞64位系统驱动,虽然在64位系统上不能在进行SSDT等Hook了。但是需要用到KeServiceDescriptorTable中的东西。用Windbg发现64下KeServiceDescriptionTable结构虽然是相似的,但是要获取index中的函数地址却不一样。u一样,完全不是什么函数地址。是一些很怪的数,刚开始有些怀疑是不是搞错了,于是转到32位下面按照查看服务的方式看了一边没有问题。在转到64位系统下,继续看看,有很多都是类似的数据,我想这个应该是没有错的。在dq几次之后,发现真正的地址是在这些奇怪的数据之后。看看网上有什么说明没有。下面是摘自http://www.langouster.com/HTML/92.html

  

在64位系统,内核函数开头地址的低四位一般是0,形如:xxxxxxxx`xxxxxxx0,这一特征在SSDT表中有很强大的引用,SSDT表在64位系统于32位系统有较大的差别。以下是在64位系统下的KeServiceDescriptorTable:

kd> dp KeServiceDescriptorTable
fffff800`0117bb80  fffff800`01076e00 00000000`00000000
fffff800`0117bb90  00000000`00000128 00000000`00000000

表的第二项于第四项都为0,这两项在32位系统下分别对应ServiceCounterTableBase与ParamTableBase。SSDT表还是同32位系统每4字节表示一项,由于函数的起始地址最低四位都是0,所以微软将SSDT中的低四位用来记录这个函数有多少个参数。并且由于表的每一项都为四个字节,保存的就不可能是绝对地址,而是相对KeServiceDescriptorTable表的地址。所以地址计算方法如下:

FuncAddr=([KeServiceDescriptortable+index*4]+KeServiceDescriptortable)&0xFFFFFFF0

 

 

 

用虾窝中的公式,尝试了一下,果然找到了正确的地址。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值