大理寺少卿 发表于 2025-3-24 23:20:40

驱动开发与系统原理-初识SSDT与ShadowSSDT

在我们进内核的时候,SystemEnter会有几个值(SS、CS、EIP、ESP)的切换

MSR寄存器中存储了CS、EIP、ESP值, MSR寄存器如下

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211211170631.png)

我们先查询一下EIP

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211211171138.png)

此时EIP指向nt!KiFastCallEntry

栈中现状

eax=调用号
edx=三环堆栈
NtOpenProcess ret
OpenProcess ret
Push 参数4
Push 参数3
Push 参数2
Push 参数1
SSDT表结构
----------

SSDT表示系统服务表,我们ring3调用的很多函数都会调用这个SSDT表

   typedef struct _SERVICE_DESCIPTOR_TABLE
    {
    PULONG ServiceTableBase; // SSDT基址
    PVOID ServiceCounterTableBase;// SSDT中服务被调用次数计数器,一般由sysenter 更新
    ULONGLONG NumberOfService; // 索引总数
    PVOID ParamTableBase; // 系统服务参数表基址-系统服务参数表SSPT
    }SYSTEM_SERVICE_TABLE, *PSYSTEM_SERVICE_TABLE;
---

    x nt!kes*des*table* //查看
    KeServiceDescriptorTableShadow是ShadowSSDT表
    KeServiceDescriptorTable是SSDT表.
![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211211214732.png)

我们可以通过dd 地址去查看内容

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211211214931.png)

其中8407073c 为SSDT表起始地址,00000191 为函数个数

    dds 8407073cL191 //查看函数
![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211211215212.png)

ShadowSSDT表
------------

ring3的所有GUI会调用的到这个表格中.

如果我们想查看ShadowSSDT,需要调用GUI的进程空间中查看

1.在系统中运行 mspaint 画图工具
2.在windbg中中断.
3.输入命令.查看系统所有简要信息   
!process 0 0
4.找到mspaint的EPROCESS结构.切换到这个进程上下文
.process /p 944e2000
5.使用x命令查找ShadowsSSDT
x nt!*kes*des*table*   
![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211211215707.png)

6.查看shodowSSDT。shodowSSDT跟SSDT挨着.上面查看SSDT的时候 shodowSSDT没有加载所以没有挨着.
![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211211215945.png)


--

typedef struct _SERVICE_DESCRIPTOR_TABLE
{
   SYSTEM_SERVICE_TABLE ntoskrnl; // ntoskrnl.exe ( native api )
   SYSTEM_SERVICE_TABLE win32k;// win32k.sys (gdi/user support)
   SYSTEM_SERVICE_TABLE Table3;// not used
   SYSTEM_SERVICE_TABLE Table4;// not used
}
SYSTEM_DESCRIPTOR_TABLE,*PSYSTEM_DESCRIPTOR_TABLE
这张表是让系统来选择使用哪个SSDT的,3,4没有用,所以正常使用是第一个也就是SSDT,第二个是GUI常使用的ShadowSSDT
页: [1]
查看完整版本: 驱动开发与系统原理-初识SSDT与ShadowSSDT