首页
社区
课程
招聘
[分享]X86系统调用_下(Ring0)
发表于: 2020-6-3 21:32 5557

[分享]X86系统调用_下(Ring0)

2020-6-3 21:32
5557

紧接上文, sysenter 指令最终导致进入内核模块的 KiFastSystemCall

在分析这个函数之前需要补充一些知识

1.) FS寄存器的值存的是什么?在R3 FS寄存器的值是0x3B, 在R0 FS寄存器的值是0x30

这里我们对 0x30 选择子进行拆分如下:

得到的是 Base: ffdff000, 那么这个数据段指向的是什么呢?我们用 WinDbg 的 !pcr 指令查看:

通过上面我们可以知道,其是一个 KPCR 结构体, 继续用 WinDbg 查看, 如下, 由此我们可以知道 FS 指向的是一个名为 KPCR 的结构体(注意在 R3 指向的 TEB结构体)

2). 陷阱帧(_KTRAP_FRAME),用于保存 R3 的寄存器参数结构体,如下:

3). 系统服务表和SSDT、SSDTShadow

系统服务表(System service table),结构如下, 是用来记录指定模块对外导出的函数相关信息, 包括(Ntoskrl.exe、Win32k.Sys)

SSDT表(非UI线程所使用的表)

在 WinXp 上是导出的全局变量 KeServiceDescriptorTable(记录了SSDT表的起始地址), 在此表中只包含了记录 Ntoskrl.exe 内核模块导出的函数相关信息的系统服务表,如下:

SSDTShadow表(UI线程所使用的表)

在 WinXp 上是导出的全局变量 KeServiceDescriptorTableShadow  记录了SSDTShadow表的起始地址), 在此表中包含了 Ntoskrl.exe、Win32k.Sys导出的函数相关信息的系统服务表,如下:

根据线程的不一样, 使用的表也是不一样的, 线程中的 KPCR.PrcbData.CurrentThread.ServiceTable 所指向的地址也不一样, (0x80553fa0 或 0x80553f60)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-6-3 21:34 被灵幻空间编辑 ,原因: 排版问题
上传的附件:
收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
666
2020-6-4 18:01
0
游客
登录 | 注册 方可回帖
返回