ssdt函数索引号_SSDT索引号的获取

本文介绍了系统服务描述符表(SSDT)和Shadow SSDT在Windows内核中的作用,以及如何通过Zw*函数获取Nt*函数在SSDT中的索引号。通过分析函数的第一行指令,可以找到对应Nt函数的ID,例如ZwOpenProcess的索引号为0x7A。
摘要由CSDN通过智能技术生成

系统服务描述符表,System Service Dispatch Table,SSDT

根据我个人理解就是为上层软件提供应用程序编程接口的集合;简单的理解就是api(application programminginterface)。

windows在内核层提供了两张表,分别为ssdt(system service descriptor table,系统服务描述表)和shadow ssdt 。用户层的api实现,实际是层简单的包装,最终都是转到内核调用相应的api,然后执行完成后返回到用户层的。而为了方便起见,所有用户层的api调用都会转到ssdt或者shadow ssdt这张表中,这样就使不同的api调用不需要在内核编写不同的调用规则,只需要转到对应ssdt表中的位置就行了。关于这点可以在后面慢慢理解。

typedef struct ServiceDescriptorEntry {

unsigned int *ServiceTableBase;

unsigned int *ServiceCounterTableBase; //仅适用于checked build版本

unsigned int NumberOfServices;

unsigned char *ParamTableBase;

} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;

KeServiceDescriptorTable是由内核导出的表。该表拥有一个指针(其实仅有ntoskrnel一项,没有包含win32k),指向SSDT中包含由Ntoskrnl.exe实现的核心系统服务的相应部分,它是内核的主要组成部分。

typedef struct _SystemServiceDescriptorTable

{

PVOID ServiceTableBase;

PULONG ServiceCounterTableBase;

ULONG NumberOfService;

ULONG ParamTableBase;

}SystemServiceDescriptorTable,*PSystemServiceDescriptorTable;

其中SSDT包含了所有内核导出函数的地址。每个地址长度为4个字节。所以要获得某个函数在SSDT中的偏移量,可以用:KeServiceDescriptorTable->ServiceTableBase + 函数ID* 4获取。

那么怎么获取函数ID呢?

其实很简单,ntoskrnl.exe导出的Zw*函数和Nt*函数,大家肯定都注意到了很多函数都是同名的,只是前缀不同。其实是这样的,Nt*函数是私有函数,其地址列于SSDT中。Zw*函数是由内核为使用设备驱动程序和其他内核组件而导出的函数,目的就在于同过Zw*函数去调用内核的Nt函数。(SSDT中的每一项和每个Zw*函数之间不存在一对一的对应关系)

内核中的所有Zw*函数都以操作码mov eax, ULONG起始,其中ULONG是系统调用在SSDT中的索引号。

说的具体点,就是每个Zw*号函数的第一行中的 ULONG值 就是其所对应的Nt*函数在SSDT中的索引号。

举个例子,如果我现在想获取 NtOpenProcess的ID号,那么就可以在Windbg中运行 u ZwOpenProcess

u ZwOpenProcess

nt!ZwOpenProcess:

805016c4 b87a000000      mov     eax,7Ah

805016c9 8d542404        lea     edx,[esp+4]

805016cd 9c              pushfd

805016ce 6a08            push    8

805016d0 e88c0d0400      call    nt!KiSystemService (80542461)

805016d5 c21000          ret     10h

获取到的0x7A就是NtOpenProcess在SSDT中的ID号了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值