Loading... ##### 背景 SSDT全称为System Service Descriptor Table,即系统服务描述符表。SSDT表的作用就是把ring3的WIN32API函数和ring0的内核API函数联系起来。对于ring3下的一些API,最终会对应于ntdll.dll一个Ntxxx函数,例如CreateFile,最终调用到ntdll.dll里的NtCreateFile这个函数。 NtCreateFile最终将系统服务号放入EAX,然后CALL系统的服务分发函数KiSystemService,进入到内核当中。从ring3到ring0,最终在ring0当中通过传入的EAX得到对应的同名系统服务的内核地址,这样就完成了一次系统服务的调用。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,注入地址索引的基地址、服务函数个数等。 本质上,其实SSDT就是一个用来保存Windows系统服务地址的数组而已。 32位系统和64位上,获取SSDT表的方式并不相同,获取SSDT表中的函数地址也不相同。 ##### 实现原理 64位系统上ntdll.dll使用`mov r10,rcx; mov eax,xxx`传入索引值,因此也可以通过遍历64位的ntdll.dll查看每一个函数对应的服务号。从而找到服务函数名和服务编号的关系。 如下图所示,使用IDA查看win7 x64的64位ntdll.dll的函数: ![image.png](http://47.117.131.13/usr/uploads/2021/10/1667571407.png) 通过SSDT表可以看出二者确是相互对应(这是因为,系统就是通过ntdll.dll来逆推出SSDT表的每一项对应的函数名的)。 ![image.png](http://47.117.131.13/usr/uploads/2021/10/3779998579.png) 由于64位的内核文件并未导出KeServiceDescriptorTable的信息,所以64位系统的SSDT表的起始地址无法直接获得。 待写....... https://www.cnblogs.com/wf751620780/p/10460863.html https://www.writebug.com/git/codes?owner=Demon-Gan-123&repo=SSDT-Function-64bit https://buaq.net/go-29222.html 最后修改:2021 年 10 月 28 日 02 : 54 PM © 允许规范转载