1.SSDT是什么?
SSDT全程是System Services Discriptor Table 翻译过来就是系统服务描述符表,那么系统服务描述符是什么呢?根据官方的解释ssdt表就是把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。
那么我们可以理解为SSDT就是一个很庞大的数组,它被用来保存windows系统服务地址。
比如我们在R3层调用了CreateFile这个API ,那么进程进入内核态的时候该函数会通过ntdll.dll这个动态链接库对应内核中的NtCreateFile函数,这个R0层API最终会将一个索引号放入一个EAX寄存器中,然后通过SSDT查询对应的系统服务分发函数KiSystemService得到相应的同名系统服务内核API的地址,这样就完成了一次R3层API和R0内核API函数的联系。
根据https://www.write-bug.com/article/2200.html该博客所说
32 位系统和 64 位上,获取 SSDT 表的方式并不相同,获取 SSDT 表中的函数地址也不相同。现在,我就分别对其进行极讲解介绍,并形成文档。本文主要讲解的是 64 位系统下,编程实现获取 SSDT 表的地址,以及获取 SSDT 表函数对应的内核地址。
2.将磁盘中ntdll.dll文件映射到内存
使用内存映射文件技术将磁盘上的 ntdll.dll 文件映射到内核内存空间