[Windows內核分析]KPCR結構體介紹 (CPU控制區 Processor Control Region)


Windows內核分析索引目錄:https://www.cnblogs.com/onetrainee/p/11675224.html

 

逆向分析操作系統內核代碼至少需要具備兩項技能:

  1. 段頁匯編代碼非常懂。
  2. 至少掌握三個結構體:EPROCESS、ETHRAEAD、KPCR(注意:EPROCESS、ETHREAD是在R0,在R3的是PEB與TEB。

 

一、KPCR結構體介紹

  1. 當線程進入0環時,FS:[0]指向KPCR(3環時 FS:[0] --> TEB,如果想了解這個信息,可以看這篇博客 利用C++實現模塊隱藏(R3層斷鏈) )
  2. 每個CPU都有一個KPCR結構體(一個內核一個)
  3. KPCR中存儲了CPU本身要用的一些重要數據:GDT、IDT以及線程相關的一些信息。

 

 

二、KPCR結構體成員詳解

  使用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的拓展

    1)_NT_TIB( + 0x000 NtTib ) 結構體介紹
            kd > dt _NT_TIB
            ntdll!_NT_TIB
            + 0x000 ExceptionList    : Ptr32 _EXCEPTION_REGISTRATION_RECORD // 在R0環的異常處理函數鏈表(R3環存儲的是R3環的異常處理函數鏈表)
            + 0x004 StackBase : Ptr32 Void  // 棧基址
            + 0x008 StackLimit : Ptr32 Void  // 棧大小顯示
            + 0x00c SubSystemTib : Ptr32 Void
            + 0x010 FiberData : Ptr32 Void
            + 0x010 Version : Uint4B
            + 0x014 ArbitraryUserPointer : Ptr32 Void
            + 0x018 Self : Ptr32 _NT_TIB  // this指針指向結構體自己

 

    2)_KPRCB 結構體介紹 (   位於 + 0x120 PrcbData : _KPRCB,同時  + 0x020 Prcb : Ptr32 _KPRCB 又指向)

     該結構體上千字節,這里僅節選部分有用的。    

    kd > dt _KPRCB
            ntdll!_KPRCB
            + 0x000 MinorVersion     : Uint2B
            + 0x002 MajorVersion : Uint2B
            + 0x004 CurrentThread : Ptr32 _KTHREAD    // 當前CPU正在跑的線程
            + 0x008 NextThread : Ptr32 _KTHREAD    // 一會切換的切換的是誰
            + 0x00c IdleThread : Ptr32 _KTHREAD    // 如果沒有程序運行,跑的空閑線程是誰
            + 0x010 LegacyNumber : UChar
            + 0x011 NestingLevel : UChar
            + 0x012 BuildType : Uint2B
            + 0x014 CpuType : Char


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM