加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 服务器 > 系统 > 正文

[Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Control

发布时间:2021-01-10 13:44:49 所属栏目:系统 来源:网络整理
导读:Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html ? 逆向分析操作系统内核代码至少需要具备两项技能: 段页汇编代码非常懂。 至少掌握三个结构体:EPROCESS、ETHRAEAD、KPCR( 注意:EPROCESS、ETHREAD是在R0,在R3的是PEB与TEB

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

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读