注:本文是以32位的windows7为实例.
今天在研究SSDT的过程中看到了一个大神写的教程,其中还附了一些代码,代码主要讲解的是SSDT hook过程,我在他的代码中没有看到任何有关服务函数的索引号,我发现他的SSDT服务号仅仅使用了一个宏定义来完成的,于是就小小的研究了一下,遂写下此文以记之.
在说明这行代码之前先在温习一下SSDT服务索引号是如何获取到的:
在上移篇文章中,我已经简单的介绍了SSDT服务号在WinDbg下简单的获取方法,
http://www.youranshare.com/blog/sid/58.html
我们知道在R3应用层进入R0层的时候,会将需要的系统服务函数的索引放到寄存器EAX中去,然后系统服务分发函数根据这个索引值找到对应的服务函数,于是就完成了函数的调用。
以函数ZwQuerySystemInformation为例,我们使用Windbg使用u命令看一下这个函数从R3进入R0都干了什么。(注意这里是ntdll还在R3层)
从图示可以看到,这个函数将105H放到了寄存器EAX,也就是服务索引号.
我们再来看一下R0层的ZwQuerySystemInformation函数又干了神马,如图所示:
依然是将105H放到了 EAX寄存器,不过后面又调用了系统服务分发函数KiSystemService完成对服务函数NtQuerySystemInformation的调用.
我们观察上面的两个ZwQuerySystemInformation函数的第一句话,发现都是 MOV EAX,105H这个操作,而在汇编中操作符对会对应一个操作码(二进制的数据),从上面的代码中我们可以看到 MOV EAX,105H对应操作码是 B8 0501 0000
不难发现105H在其中,105H对应着操作码中的 05010000(32bit),我们用一张内存图表示这个数据:
函数ZwQuerySystemInformation的函数指针指向的是B8的位置,而如果我们将这个指针后移一个字节,然后转换为一个32位的ULONG类型,那么这个指针就指向00000105H这个数值了。
所以我们可以定义一个宏
#defineSSDT_INDEX(ServiceFunction) (*(PULONG)((PUCHAR)ServiceFunction + 1))
我们可以直接使用SSDT_INDEX(ZwQuerySystemInformation) 就能轻松的获取到ZwQuerySystemInformation服务索引了.