ssdt与shadowssdt区别

ssdt与shadowssdt区别ring3 nbsp nbsp nbsp nbsp nbsp nbsp NtOpenProces nbsp nbsp nbsp ssdt 层 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 实现 OpenProcess gt ntdll ZwOpenProces gt ntos ZwOpenProces gt ntos NtOpenProces 内核中有 2 套函数 zw nt nt 才是真正的执行函数 zw 只是一个过渡函数 可用 ida 察看 ntoskrn

(ring3)            (NtOpenProcess)      ssdt层                  实现
OpenProcess->ntdll!ZwOpenProcess->ntos!ZwOpenProcess->ntos!NtOpenProcess
(内核中有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得到其中一个有 图形界面的程序

                                             (数据如下)

                                         2)  (输入命令)

                                             lkd> .process 861ff020  

                                             (切换成功 )

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

                                    lkd> dd KeServiceDescriptorTableShadow
                                           80553f60  80502b8c 00000000 0000011c –〉SSDT
                                           80553f70  bf999b80 00000000 0000029b  bf99a890 –〉ShadowSSDT
                                           80553f80  00000000 00000000 00000000 00000000
                                           80553f90  00000000 00000000 00000000 00000000
                                           80553fa0  80502b8c 00000000 0000011c
                                           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表的结构可用windbg察看:

ssdt与shadowssdt区别

(ring3)            (NtOpenProcess)      ssdt层                  实现

OpenProcess->ntdll!ZwOpenProcess->ntos!ZwOpenProcess->ntos!NtOpenProcess
(内核中有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得到其中一个有 图形界面的程序

                                             (数据如下)

                                         2)  (输入命令)

                                             lkd> .process 861ff020  

                                             (切换成功 )

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

                                    lkd> dd KeServiceDescriptorTableShadow
                                           80553f60  80502b8c 00000000 0000011c –〉SSDT
                                           80553f70  bf999b80 00000000 0000029b  bf99a890 –〉ShadowSSDT
                                           80553f80  00000000 00000000 00000000 00000000
                                           80553f90  00000000 00000000 00000000 00000000
                                           80553fa0  80502b8c 00000000 0000011c
                                           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表的结构可用windbg察看:

ssdt与shadowssdt区别



















版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214881.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午3:13
下一篇 2026年3月18日 下午3:14


相关推荐

  • 手把手教你一键部署OpenClaw(Clawdbot),2分钟搞定!

    手把手教你一键部署OpenClaw(Clawdbot),2分钟搞定!

    2026年3月13日
    1
  • pip国内源设置方法

    pip国内源设置方法pip 是一个现代的 通用的 Python 包管理工具 提供了对 Python 包的查找 下载 安装 卸载的功能 关于 pip 默认安装路径有问题的可以看这篇文章 https blog csdn net weixin article details pip 国内源设置方法很多朋友反映在装完 pip 后 使用 pip 安装 python 包特别慢 这主要是应为国

    2026年3月18日
    2
  • LVS 负载均衡集群 – 直接路由模式(LVS-DR)

    LVS 负载均衡集群 – 直接路由模式(LVS-DR)文章目录一、LVS-DR数据包流向分析二、LVS-DR模式的特点三、LVS-DR中的ARP问题四、部署LVS-DR负载均衡集群一、LVS-DR数据包流向分析为方便进行原理分析,将Client与集群机器放在同一网络中,数据包流经的路线为1-2-3-4。Client向目标VIP发出请求,Director(负载均衡器)接收此时源MAC地址为Client的MAC地址目标MAC地址为调度器Director的MAC地址Directo

    2022年7月24日
    13
  • u盘0x8000FFFF_灾难性故障怎么卸载

    u盘0x8000FFFF_灾难性故障怎么卸载U盘出现两个分盘,原先是用了老毛桃的工具重置了U盘,目前成了两个分区。想要修改分区的时候,出现了磁盘已被保护。第一步,按照贴中的第二个方法用修改完注册表关机重启https://product.pconline.com.cn/itbk/software/dnyw/1707/9686607.html第二步,去磁盘管理中把剩余的磁盘都删除掉,这时候u盘的所有的空间都没有了,点击新建文件会出现0x80…

    2026年3月9日
    7
  • 2021-08-11 WPF控件专题 ListView控件详解

    2021-08-11 WPF控件专题 ListView控件详解1 ListView 控件介绍 ListboxCombo 条目控件 WinformListV 用于显示数据项的列表 DataGrid ListBox 组织数据的结构和样式显示数据 View GridView ListView 控件的以列形式显示数据项的 视图模式 GridView 属性 ColumnsColum

    2026年3月18日
    2
  • 计算三角形面积_三角形怎么算平方

    计算三角形面积_三角形怎么算平方参考:已知三点坐标,求三角形面积1:已知直角坐标系3点p(a,b),m(c,d),n(e,f)求三角形pmn面积两倍三角形面积是整型代码模板:llsolve(lla,llb,llc,

    2022年8月5日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号