Windows内核解析之KPCR结构体和FS:[0]
Posted bcbobo21cn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows内核解析之KPCR结构体和FS:[0]相关的知识,希望对你有一定的参考价值。
根据资料,
当线程进入0环时,FS:[0]指向KPCR;
3环时FS:[0] 指向TEB;
来了解一下什么是KPCR和FS:[0];
KPCR
每个CPU都有一个KPCR结构体,一个核一个;
KPCR中存储了CPU本身要用的一些重要数据:GDT、IDT以及线程相关的一些信息;
使用windbg的 kd _KPCR 命令来查看该结构体成员;
kd > dt _KPCR
ntdll!_KPCR
+ 0x000 NtTib : _NT_TIB // 保存CPU常用的信息(比如异常处理函数链表、栈大小空间限制)
+ 0x01c SelfPcr : Ptr32 _KPCR // 指向自身,类似C++的this指针一样,方便编程。
+ 0x020 Prcb : Ptr32 _KPRCB // 指向 + 0x120 PrcbData : _KPRCB 结构体,该结构体为_KPCR的拓展,这么做(而不是使用偏移)是为了当其地址改变时也能正确找到。
+ 0x024 Irql : UChar
+ 0x028 IRR : Uint4B
+ 0x02c IrrActive : Uint4B
+ 0x030 IDR : Uint4B
+ 0x034 KdVersionBlock : Ptr32 Void
+ 0x038 IDT : Ptr32 _KIDTENTRY //IDT表 一个CPU一套
+ 0x03c GDT : Ptr32 _KGDTENTRY // GDT表 一个CPU一套
+ 0x040 TSS : Ptr32 _KTSS // TSS表 一个CPU一套
+ 0x044 MajorVersion : Uint2B
+ 0x046 MinorVersion : Uint2B
+ 0x048 SetMember : Uint4B
+ 0x04c StallScaleFactor : Uint4B
+ 0x050 SpareUnused : UChar
+ 0x051 Number : UChar // 当前CPU的编号
+ 0x052 Spare0 : UChar
+ 0x053 SecondLevelCacheAssociativity : UChar
+ 0x054 VdmAlert : Uint4B
+ 0x058 KernelReserved : [14] Uint4B
+ 0x090 SecondLevelCacheSize : Uint4B
+ 0x094 HalReserved : [16] Uint4B
+ 0x0d4 InterruptMode : Uint4B
+ 0x0d8 Spare1 : UChar
+ 0x0dc KernelReserved2 : [17] Uint4B
+ 0x120 PrcbData : _KPRCB // 该结构体很大,是对于_KPCR的拓展
FS:[0]
FS寄存器是什么寄存器?我记不清80386是否有这个寄存器;
查一下;
803386的段寄存器有:CS、SS、DS、ES、FS、GS;
80386比8086/80286增加了两个段寄存器FS、GS;
FS是80386新加的段寄存器;
根据资料,
FS寄存器指向当前活动线程的TEB结构(线程结构),
偏移 说明
000 指向SEH链指针
004 线程堆栈顶部
008 线程堆栈底部
00C SubSystemTib
010 FiberData
014 ArbitraryUserPointer
018 FS段寄存器在内存中的镜像地址
020 进程PID
024 线程ID
02C 指向线程局部存储指针
030 PEB结构地址(进程结构)
034 上个错误号
以上是关于Windows内核解析之KPCR结构体和FS:[0]的主要内容,如果未能解决你的问题,请参考以下文章
27.Windows线程切换之线程查找(KiFindReadyThread)