网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

【NT】一行代码获取SSDT服务索引号


注:本文是以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层)

                                              1403967728363859.png

从图示可以看到,这个函数将105H放到了寄存器EAX,也就是服务索引号.

我们再来看一下R0层的ZwQuerySystemInformation函数又干了神马,如图所示:

1403967728111045.png

依然是将105H放到了 EAX寄存器,不过后面又调用了系统服务分发函数KiSystemService完成对服务函数NtQuerySystemInformation的调用.

我们观察上面的两个ZwQuerySystemInformation函数的第一句话,发现都是  MOV EAX,105H这个操作,而在汇编中操作符对会对应一个操作码(二进制的数据),从上面的代码中我们可以看到 MOV EAX,105H对应操作码是 B8 0501 0000

不难发现105H在其中,105H对应着操作码中的 05010000(32bit),我们用一张内存图表示这个数据:

1403967729714779.png

函数ZwQuerySystemInformation的函数指针指向的是B8的位置,而如果我们将这个指针后移一个字节,然后转换为一个32位的ULONG类型,那么这个指针就指向00000105H这个数值了。

所以我们可以定义一个宏

#defineSSDT_INDEX(ServiceFunction) (*(PULONG)((PUCHAR)ServiceFunction + 1))

我们可以直接使用SSDT_INDEX(ZwQuerySystemInformation) 就能轻松的获取到ZwQuerySystemInformation服务索引了.

 


  • 标签:
  • SSDT服务号获取
  • NT服务号
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.