最近在搞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
用虾窝中的公式,尝试了一下,果然找到了正确的地址。