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

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

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

    该篇博客整理了<Windows内核分析>专题的各篇博文,方便查找. 一.保护模式 二.进程与线程 [Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Cont ...

  2. 鸿蒙内核源码分析(双向链表篇) | 谁是内核最重要结构体? | 开篇致敬鸿蒙内核开发者 | v1.11

    子曰:"见贤思齐焉,见不贤而内自省也."<论语>:里仁篇 百篇博客系列篇.本篇为: v01.xx 鸿蒙内核源码分析(双向链表篇) | 谁是内核最重要结构体 | 51.c ...

  3. 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)

    原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...

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

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

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

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

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

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  7. Windows驱动开发-IRP结构体

    IRP的全名是I/O Request Package,即输入输出请求包,它是Windows内核中的一种非常重要的数据结构. 上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的 ...

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

    网址:http://blog.chinaunix.net/uid-24807808-id-3219820.html 在看linux源码的时候,经常会看到类似于下面的结构体赋值的代码: struct d ...

  9. golang(07)结构体介绍

    golang支持面向对象的设计,一般支持面向对象的语言都会有class的设计,但是golang没有class关键字,只有struct结构体.通过结构体达到类的效果,这叫做大成若缺,其用不弊. stru ...

随机推荐

  1. 如何设计web系统的监控

    如何使用httpclient设计开发一套web系统监控? 我之前有实现和写过关于运维和开发两个层面的监控系统的文章(https://www.cnblogs.com/zhikou/p/8576891.h ...

  2. vim 同时操作多行

    使用 vim 的时候,经常会有同时注释或解开注释的情况,逐行编辑很浪费时间,下面的同时操作多行的方式 删除操作 control+v 进入 visual block 模式 选中要删除几行文字 d删除 插 ...

  3. SVN更新失败

    一.svn更新失败 使用svn遇到的问题是,更新失败,代码被锁定. 解决办法: 在项目上右键,如图所示: 图一: ​ 图二: ​ 之后再更新,基本上都没有问题了.如果还有问题,看下面. 二.工具清理 ...

  4. C#客户端程序Visual Stadio远程调试

    一,需求来源 在开发过程中,可能会要使用Win7 ,Win8 ,Win10等不同版本的系统去做兼容性调试,也有时候会去针对特别的显卡,无线网卡等等硬件设备的机器做优化,有一种较优的方案,那就是使用Vi ...

  5. 剑指Offer(三十二):把数组排成最小的数

    剑指Offer(三十二):把数组排成最小的数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  6. 【LeetCode】215-数组中的第K个最大元素

    题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...

  7. 使用ECMAScript 6 模块封装代码

    JavaScript 用"共享一切"的方法加载代码,这是该语言中最容易出错且最容易让人感到困惑的地方.其他语言使用诸如包这样的概念来定义代码作用域,但在 ECMAScript 6 ...

  8. Hibernate,一对多,多对一

    Hibernate环境的配置 hibernate.cfg.xml的配置 <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibern ...

  9. C#中将表示颜色的string转换成Color

    场景 在Winform中需要存储某控件的Color属性,存储的是string字符串, 然后再对控件进行赋值时需要将string转换成Color. 实现 myPane.YAxis.Color = Sys ...

  10. hadoop 通过distcp进行并行复制

    通过distcp进行并行复制 前面的HDFS访问模型都集中于单线程的访问.例如通过指定文件通配,我们可以对一部分文件进行处理,但是为了高效,对这些文件的并行处理需要新写一个程序.Hadoop有一个叫d ...