欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

SSDT表与ShadowSSDT表

发布时间:2025/4/14 编程问答 33 豆豆
生活随笔 收集整理的这篇文章主要介绍了 SSDT表与ShadowSSDT表 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

实际上内核中存在两个系统服务描述符表,一个是KeServiceDescriptorTable(由ntoskrnl.exe导出);,一个是KeServieDescriptorTableShadow(没有导出)。

KeServieDescriptorTableShadow不但包含了ntoskrnel项,而且还包含了win32k项,而KeServiceDescriptorTable仅仅包含一个ntoskrnel项。

内核中有2套函数 ,zw,nt,nt才是真正的执行函数,zw只是一个过渡函数,(可用ida察看ntoskrnl.exe得知)

SSDT:主要处理 Kernel32.dll中的系统调用,如openProcess,ReadFile等,主要在ntoskrnl.exe中实现(微软有给出 ntoskrnl源代码)

ShadowSSDT:
1.主要处理,user32.dll,GDI32.dll中调用的函数,如postMessage,SendMessage,FindWindow,主要在win32k.sys中实现.(微软未给出win32k代码)

2.需要注意的是shadowSSDT并未导出,可用ida在win32k.sys中的导出表搜索,且结构与ssdt相似,但是不能通过windbg dd命令查看值

3.ShadowSSDT表只能在GUI(即有界面的程序进程)环境下才有值,故我们需要调用KeAttachProcess来切换到GUI线程里。

4.用windbg 命令 .process 861ff020  (861ff020  是通过 命令 !process 0 0得到的)切换到GUI线程上下文

    过程:1)(输入windbg命令 ) !process 0 0得到其中一个有 图形界面的程序

                                             (数据如下)

                                             PROCESS 861ff020  SessionId: 0  Cid: 0b58    Peb: 7ffde000  ParentCid: 05e4
                                             DirBase: 10080380  ObjectTable: e1dd2808  HandleCount:  73.
                                             Image: windbg.exe

    2)  (输入命令)

                                             lkd> .process 861ff020  

                                             Implicit process is now 861ff020

                                             (切换成功 )

    3) 切换成功后,使用dd KeServiceDescriptorTableShadow即可得到该表数据,否则无法得到,得到数据如下

                                    lkd> dd KeServiceDescriptorTableShadow
                                           80553f60  80502b8c 00000000 0000011c 80503000--〉SSDT
                                           80553f70  bf999b80 00000000 0000029b  bf99a890 --〉ShadowSSDT
                                           80553f80  00000000 00000000 00000000 00000000
                                           80553f90  00000000 00000000 00000000 00000000
                                           80553fa0  80502b8c 00000000 0000011c 80503000
                                           80553fb0  00000000 00000000 00000000 00000000
                                           80553fc0  00000000 00000000 00000000 00000000
                                           80553fd0  00000000 00000000 00000000 00000000

                                     其实KeServiceDescriptorTableShadow 包含4个系统服务表,但是我们只用前2个(SSDT,ShadowSSDT)

    4) 总结:

                                      1) ShadowSSDT在KeServiceDescriptorTableShadow[1]中,而KeServiceDescriptorTableShadow[0]为ssdt

                                      2)如果要查看win32k服务,必须要切换到GUI线程上下文

5.如何得到ShadowSSDT地址:在insight source中可查询到wrk中有KeAddSystemServiceTable函数,里面有对KeServiceDescriptorTableShadow 的调用
思路:利用搜索特征码的方式搜索KeAddSystemServiceTable,取出KeServiceDescriptorTableShadow 

 

总结

以上是生活随笔为你收集整理的SSDT表与ShadowSSDT表的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。