[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

原文地址:https://www.cnblogs.com/onetrainee/p/11675225.html

时间: 2024-11-08 11:57:34

[Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Control Region)的相关文章

《Windows内核分析》专题-索引目录

该篇博客整理了<Windows内核分析>专题的各篇博文,方便查找. 一.保护模式 二.进程与线程 [Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Control Region) 原文地址:https://www.cnblogs.com/onetrainee/p/11675224.html

FFmpeg源码简单分析:结构体成员管理系统-AVOption

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

FFmpeg源代码分析:结构体成员管理系统-AVOption

本文继续上篇文章<FFmpeg源代码分析:结构体成员管理系统-AVClass>中的内容,记录FFmpeg中和AVOption相关的源代码.AVOption用于在FFmpeg中描述结构体中的成员变量.一个AVOption可以包含名称,简短的帮助信息,取值等等. 上篇文章简单回顾 上篇文章中概括了AVClass,AVOption和目标结构体之间的关系.以AVFormatContext为例,可以表示为下图. 有关上篇文章的内容,这里不再重复.总体来说,上篇文章主要概括了AVClass,AVOptio

Windows内核分析——NtCreateDebugObject函数分析

第一篇分析Windows内核的文章,主要是加强学习记忆.以后会多写这种笔记,正如猪猪侠所说,所学的知识只有实践并且能够讲出来才能真正实现掌握. 程序来自ReactOS或WRK1.2 资料参考自<Windows内核情景分析>和<Windows 内核设计思想>以及网上文章和视频 NTSTATUS NtCreateDebugObject ( OUT PHANDLE DebugObjectHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_AT

(转)关于linux中内核编程中结构体的赋值操作(结构体指定初始化)

网址:http://blog.chinaunix.net/uid-24807808-id-3219820.html 在看linux源码的时候,经常会看到类似于下面的结构体赋值的代码: struct device my_dev = { .bus = &my_bus_type, .parent = &my_bus, .release = my_dev_release, }; 整体上看,貌似与我们平时遇到的结构题赋值差不多,可是在变量前面加了一个点,好像我们就不知道是什么意思了.  上面的这种赋

FFmpeg源代码分析:结构体成员管理系统-AVClass

打算写两篇文章记录FFmpeg中和AVOption有关的源代码.AVOption用于在FFmpeg中描述结构体中的成员变量.它最主要的作用可以概括为两个字:"赋值".一个AVOption结构体包含了变量名称,简短的帮助,取值等等信息. 所有和AVOption有关的数据都存储在AVClass结构体中.如果一个结构体(例如AVFormatContext或者AVCodecContext)想要支持AVOption的话,它的第一个成员变量必须是一个指向AVClass结构体的指针.该AVClass

golang(07)结构体介绍

golang支持面向对象的设计,一般支持面向对象的语言都会有class的设计,但是golang没有class关键字,只有struct结构体.通过结构体达到类的效果,这叫做大成若缺,其用不弊. struct简介 在使用struct之前,先介绍golang的一个特性,golang允许用户将类型A定义为另一种类型B,并为类型B添加方法. 1234 type Integer int func (a Integer) Less (b Integer) bool{ return a < b} 我们将int定

Windows驱动开发-_DRIVER_OBJECT结构体

每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管理程序所创建的,内核对一个驱动只加载一个实例,是由内核中的I/O管理器负责加载的,驱动程序需要在DriverEntry中初始化该驱动对象. _DRIVER_OBJECT结构体源码 typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; //每个驱动程序有一个或多个设备对象,每个设备对象都有一个指针指向下一个设备对象,最后一个设备对象指向空.此处是

Nginx源码分析-ngx_module_s结构体

该结构体是整个Nginx模块化架构最基本的数据结构体.它描述了Nginx程序中一个模块应该包括的基本属性,在tengine/src/core/ngx_conf_file.h中定义了该结构体 105 struct ngx_module_s { 106 ngx_uint_t ctx_index; // 所属分类标识.Nginx的模块分为4种,分别是core,http,event和mail,每个模块在使用的技术各不尽相同 107 ngx_uint_t index; //模块计数器,Nginx为了方便管