在我们进内核的时候,SystemEnter会有几个值(SS、CS、EIP、ESP)的切换
MSR寄存器中存储了CS、EIP、ESP值, MSR寄存器如下

我们先查询一下EIP

此时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表.

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

其中8407073c 为SSDT表起始地址,00000191 为函数个数
dds 8407073c L191 //查看函数

ShadowSSDT表
ring3的所有GUI会调用的到这个表格中.
如果我们想查看ShadowSSDT,需要调用GUI的进程空间中查看
1.在系统中运行 mspaint 画图工具
2.在windbg中中断.
3.输入命令.查看系统所有简要信息
!process 0 0
4.找到mspaint的EPROCESS结构.切换到这个进程上下文
.process /p 944e2000
5.使用x命令查找ShadowsSSDT
x nt!kesdestable

6.查看shodowSSDT。shodowSSDT跟SSDT挨着.上面查看SSDT的时候 shodowSSDT没有加载所以没有挨着.

表
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 |