[Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Control Region)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
逆向分析操作系统内核代码至少需要具备两项技能:
- 段页汇编代码非常懂。
- 至少掌握三个结构体:EPROCESS、ETHRAEAD、KPCR(注意:EPROCESS、ETHREAD是在R0,在R3的是PEB与TEB。)
一、KPCR结构体介绍
- 当线程进入0环时,FS:[0]指向KPCR(3环时 FS:[0] --> TEB,如果想了解这个信息,可以看这篇博客利用C++实现模块隐藏(R3层断链))
- 每个CPU都有一个KPCR结构体(一个内核一个)
- 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)的更多相关文章
- 《Windows内核分析》专题-索引目录
该篇博客整理了<Windows内核分析>专题的各篇博文,方便查找. 一.保护模式 二.进程与线程 [Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Cont ...
- 鸿蒙内核源码分析(双向链表篇) | 谁是内核最重要结构体? | 开篇致敬鸿蒙内核开发者 | v1.11
子曰:"见贤思齐焉,见不贤而内自省也."<论语>:里仁篇 百篇博客系列篇.本篇为: v01.xx 鸿蒙内核源码分析(双向链表篇) | 谁是内核最重要结构体 | 51.c ...
- 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)
原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...
- FFmpeg源代码简单分析:结构体成员管理系统-AVOption
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- FFmpeg源代码简单分析:结构体成员管理系统-AVClass
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- FFmpeg源码简单分析:结构体成员管理系统-AVOption
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- Windows驱动开发-IRP结构体
IRP的全名是I/O Request Package,即输入输出请求包,它是Windows内核中的一种非常重要的数据结构. 上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的 ...
- (转)关于linux中内核编程中结构体的赋值操作(结构体指定初始化)
网址:http://blog.chinaunix.net/uid-24807808-id-3219820.html 在看linux源码的时候,经常会看到类似于下面的结构体赋值的代码: struct d ...
- golang(07)结构体介绍
golang支持面向对象的设计,一般支持面向对象的语言都会有class的设计,但是golang没有class关键字,只有struct结构体.通过结构体达到类的效果,这叫做大成若缺,其用不弊. stru ...
随机推荐
- Charles安装windows篇
简介 Charles是一款非常好用的网络抓包工具,类似fiddle抓包工具,当然也可以理解为一款HTTP代理服务器.HTTP监视器.反向代理服务器等. 二.官网下载 地址:https://www.ch ...
- 【Offer】[3-2] 【不修改数组找出重复的数字】
题目描述 思路分析 Java代码 代码链接 题目描述 在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的. 请找出数组中任意一个重复的数字,但不能修改输入的数组. ...
- springcloud超简单的入门2--Eureka服务治理
Eureka服务治理 下面请听第一个话题,母...咳咳,拿错书了. Eureka简介 eureka是什么呢? 简单来说呢,当我的微服务应用多了起来,一个一个写死再程序里是件很不优雅的事情,而且同一服务 ...
- centos7安装mongodb以及使用
https://blog.csdn.net/sun007700/article/details/100671570
- postman--请求以及变量设置的实例练习
我们可以在2个地方添加需要执行的js脚本,一个是Pre-request Script,还有一个tests,我们先看请求之前的 1 在请求被发送到服务器之前:就是在“Pre-request Script ...
- Net基础篇_学习笔记_第十天_方法(函数)
方法(函数): 函数就是将一堆代码进行重用的一种机制.//解决冗余代码问题------方法出现了. 面向对象的三大特征:封装.继承.多态 函数的语法:[public] stati ...
- .Net基础篇_学习笔记_第七天_随机数的产生
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 装逼手册之 python中的内存分配的小秘密
装逼手册之 python中的内存分配的小秘密 虽然我们现在得益于时代和技术的发展,不用再担心内存的问题:但是遥想当年,都是恨不得一个钢镚掰成俩份用,所以我就想深入了解一下,在python中内存分配的一 ...
- Django--路由层、视图层、模版层
路由层: 路由匹配 url(正则表达式,视图函数内存地址) 只要正则匹配到了内容,就不再往下匹配,而是直接运行后面的视图函数 匹配首页) url(r'^&', home) 匹配尾页 url(r ...
- 数据库高级:SQL-CREATE-DATABASE语句
CREATE DATABASE 语句 CREATE DATABASE 用于创建数据库. SQL CREATE DATABASE 语法 CREATE DATABASE database_name SQL ...