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]的主要内容,如果未能解决你的问题,请参考以下文章

3.KPCR

27.Windows线程切换之线程查找(KiFindReadyThread)

双进程守护?内核对象?单实例....?抱歉会进程挂起...抱歉我还有HOOK....

分别使用结构体和数组实现约瑟夫环(围圈报数问题之二)

C语言的结构体和C++结构体的区别

linux 内核0.11阅读困惑