使用windwow windbg 吃透64位分页内存管理

news2024/11/15 4:48:48

前言

分页基础概念是操作系统基础知识,网上已经有太多太多了。所以本文记录使用windwow内核调试工具验证理论知识。

具体可以参阅intel volume34.1.1 Four Paging Modes章节。

简而言之:CR0.PG = 0表示不开启分页.并且根据CR4各种标志开启不同类别的分页模式,大致有四种模式。这里贴出原文:

CR4.PAE 开启物理地址扩展 简单点理解就是
IA32_EFER.LME 用于启用64位模式(本文讨论范围)
CR4.LA57 CR4.LA57是一个控制寄存器的位,用于启用或禁用所谓的5级分页模式,启用57位线性地址。(本文不讨论,因为现在基本没有使用)
在这里插入图片描述

CR4.LA57 是CR4的第12位,在window10 64位都没有启用(也没有必要启用)

本位讨论的分页机制是原文中的4-level paging分页机制。
这里给出对应原文翻译(仅作参考):

如果 CR4.PAE = 1,IA32_EFER.LME = 1,且 CR4.LA57 = 0,则使用 4 级分页1。4 级分页在第 4.5 节中详细介绍(以及 5 级分页)。
4 级分页使用 CR0.WP、CR4.PGE、CR4.PCIDE、CR4.SMEP、CR4.SMAP、CR4.PKE、CR4.CET、CR4.PKS 和 IA32_EFER.NXE,
如第 4.1.3 节和第 4.6 节所述。

这种分页机制可以存在以下三种分页大小分别为4k ,2M ,1G。具体参阅intel volume34.5.4 Linear-Address Translation with 4-Level Paging and 5-Level Paging章节

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

举例说明

本文以win10 64举例

首先查看cr0.PG用于判断是否开启了分页

1: kd> r cr0
cr0=0000000080050033
1: kd> .formats 0000000080050033
Evaluate expression:
  Hex:     ffffffff`80050033
  Decimal: -2147155917
  Octal:   1777777777760001200063
  Binary:  11111111 11111111 11111111 11111111 10000000 00000101 00000000 00110011
  Chars:   .......3
  Time:    ***** Invalid
  Float:   low -4.59249e-040 high -1.#QNAN
  Double:  -1.#QNAN

我们cr0.PG是第31位,上面可以看到已经设置为1表示已经开启分页。

接着我们查看是否开启了64位

我们首先查看IA32_EFER寄存器。(这是一个MSR,其编号0xC00000801

//查询寄存器数值
1: kd> rdmsr c0000080
msr[c0000080] = 00000000`00000d01


//打印数值
1: kd> .formats  00000000`00000d01
Evaluate expression:
  Hex:     00000000`00000d01
  Decimal: 3329
  Octal:   0000000000000000006401
  Binary:  00000000 00000000 00000000 00000000 00000000 00000000 00001101 00000001
  Chars:   ........
  Time:    Thu Jan  1 08:55:29 1970
  Float:   low 4.66492e-042 high 0
  Double:  1.64474e-320


在这里插入图片描述
其中第8和第10位是我们需要关注的,如果是1的话表示开启。(本例已经可以看到已经设置为1),证明已经开启了64位

最后我们分析一下开启哪种分页模式

1: kd> r cr4
cr4=00000000001506f8


1: kd> .formats  00000000001506f8
Evaluate expression:
  Hex:     00000000`001506f8
  Decimal: 1378040
  Octal:   0000000000000005203370
  Binary:  00000000 00000000 00000000 00000000 00000000 00010101 00000110 11111000
  Chars:   ........
  Time:    Sat Jan 17 06:47:20 1970
  Float:   low 1.93105e-039 high 0
  Double:  6.80842e-318

其中PAE是第5位,LA57 是第12位
CR4.PAE = 1, CR4.LA57 = 0 综上本系统开启了level 4的分页模式

我们随便查看一个寄存器的数值:

1: kd> r gdtr
gdtr=ffffd001fee69840
1: kd> dq ffffd001fee69840
ffffd001`fee69840  00000000`00000000 00000000`00000000
ffffd001`fee69850  00209b00`00000000 00409300`00000000
ffffd001`fee69860  00cffb00`0000ffff 00cff300`0000ffff
ffffd001`fee69870  0020fb00`00000000 00000000`00000000
ffffd001`fee69880  fe008be6`2ac00067 00000000`ffffd001
ffffd001`fee69890  7240f36e`90007c00 00000000`00000000
ffffd001`fee698a0  00000000`00000000 00000000`00000000
ffffd001`fee698b0  ecdd8e00`00106100 00000000`fffff800

我们通过计算得到相关偏移:

ffffd001fee69840
对于 4k大小 分页
PML4 =  0x1A0  , Directory ptr = 0x7 , Directory = 0x1F7 , table = 0x69,  offset = 0x840
其他略
//查看页表
1: kd> r cr3
cr3=00000000001ab000

//由于PML4全部8字节的,所以我们计算可以得相关地址位cr3 + 8 *PML4  
最后得到 PML4E=00000000`00125863 

1: kd> !dq  00000000001ab000+8*1A0
#  1abd00 00000000`00125863 00000000`00000000
#  1abd10 00000000`00000000 00000000`00000000
#  1abd20 00000000`00000000 00000000`00000000
#  1abd30 00000000`00000000 00000000`00000000
#  1abd40 00000000`00000000 00000000`00000000
#  1abd50 00000000`00000000 00000000`00000000
#  1abd60 00000000`00000000 00000000`00000000
#  1abd70 00000000`00000000 00000000`00000000



//根据规范取出 00000000`00125863中的40位 也就是51到12位 0x0000000125000然后计算出
 

//PDPTE = 00000000`00237863
1: kd> !dq 0x0000000125000+0x7*8
#  125038 00000000`00237863 00000000`00243863
#  125048 00000000`00000000 00000000`00000000
#  125058 00000000`00000000 00000000`00000000
#  125068 00000000`00000000 00000000`00000000
#  125078 00000000`00000000 00000000`00000000
#  125088 00000000`00000000 00000000`00000000
#  125098 00000000`00000000 00000000`00000000
#  1250a8 00000000`00000000 00000000`00000000



//得到 PDPTE = 00000000`00237863,这时候我们需要查看ps是否启用了1G大小分页
//ps是第7位这里显然为0 ,我可以继续下一步提取PDE 即提取51位到12位得到 0x0000000237000
//PDE= 00000000`00325863
1: kd>  !dq 0x0000000237000+0x1F7 *0x8
#  237fb8 00000000`00325863 00000000`0014a863
#  237fc8 00000000`7a6c5863 00000000`7a6c6863
#  237fd8 00000000`7bfc4863 00000000`024d1863
#  237fe8 00000000`013a5863 00000000`03f79863
#  237ff8 00000000`0550c863 80000000`0023a963
#  238008 80000000`6e450963 80000000`04049963
#  238018 80000000`7ae2b963 80000000`7a7b2963
#  238028 80000000`7a828963 80000000`7a75a963


//   首先要判断是否是4k分页还2M分页 也就是看第7位为1(为1开启2M)
// 这里得到结论为0 所以为4k分页, 提取PTE即提取51位到12位得到 0x0000004e5f000得到物理地址


//PTE=80000000`04e5f963
1: kd> !dq 0000000325000+ 69*8
#  325348 80000000`04e5f963 80000000`04e60963
#  325358 80000000`04e61963 80000000`04e62963
#  325368 80000000`04e63963 80000000`04e64963
#  325378 80000000`04e65963 80000000`04e66963
#  325388 80000000`04e67963 80000000`04e68963
#  325398 80000000`05069963 80000000`0516a963
#  3253a8 80000000`0516b963 80000000`0026c963
#  3253b8 80000000`0016d963 80000000`0036e963

// 0x0000004e5f000加上偏移0x840得到最后的物理地址
1: kd> !dq 0000004e5f000+840
# 4e5f840 00000000`00000000 00000000`00000000
# 4e5f850 00209b00`00000000 00409300`00000000
# 4e5f860 00cffb00`0000ffff 00cff300`0000ffff
# 4e5f870 0020fb00`00000000 00000000`00000000
# 4e5f880 fe008be6`2ac00067 00000000`ffffd001
# 4e5f890 7240f36e`90007c00 00000000`00000000
# 4e5f8a0 00000000`00000000 00000000`00000000
# 4e5f8b0 ecdd8e00`00106100 00000000`fffff800

最后用两个命令分别查看物理地址和虚拟地址内存数值判断是否正确

//使用dq直接看虚拟地址内存
1: kd> dq gdtr
ffffd001`fee69840  00000000`00000000 00000000`00000000
ffffd001`fee69850  00209b00`00000000 00409300`00000000
ffffd001`fee69860  00cffb00`0000ffff 00cff300`0000ffff
ffffd001`fee69870  0020fb00`00000000 00000000`00000000
ffffd001`fee69880  fe008be6`2ac00067 00000000`ffffd001
ffffd001`fee69890  7240f36e`90007c00 00000000`00000000
ffffd001`fee698a0  00000000`00000000 00000000`00000000
ffffd001`fee698b0  ecdd8e00`00106100 00000000`fffff800
//使用!dq查看物理地址
1: kd> !dq 0000004e5f000+840
# 4e5f840 00000000`00000000 00000000`00000000
# 4e5f850 00209b00`00000000 00409300`00000000
# 4e5f860 00cffb00`0000ffff 00cff300`0000ffff
# 4e5f870 0020fb00`00000000 00000000`00000000
# 4e5f880 fe008be6`2ac00067 00000000`ffffd001
# 4e5f890 7240f36e`90007c00 00000000`00000000
# 4e5f8a0 00000000`00000000 00000000`00000000
# 4e5f8b0 ecdd8e00`00106100 00000000`fffff800

参考链接

[原创]windows64位分页机制分析-隐藏可执行内存方法

Control_register

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣-变更性别

大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:627. 变更性别二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结前言…

算法设计与分析期末考试复习(三)

动态规划 动态规划算法与分治法类似,其基本思想也是将待求解问题分成若干个子问题。但是经分解得到的子问题往往不是互相独立的。在用分治法求解时,有些子问题被重复计算机了许多次。 如果能够保存已解决的子问题的答案,而在需要时再找出已求…

Scala-抽象类、匿名子类、伴生对象、单例模式

抽象类 匿名子类 伴生对象(单例对象) 单例设计模式 抽象类 定义抽象类:abstract class Person{} //通过 abstract 关键字标记抽象类定义抽象属性:val|var name:String //一个属性没有初始化,就是抽象属性定义抽象…

应用场景六:同时支持CP343和CP341功能(Modbus连接仪表,以太网连接WINCC)

应用描述: 桥接器同时支持西门子PLC的CP343以太网通讯模块和CP341串口通讯模块的功能。可以同时通过ModbusRTU连接仪表、变频器等串口设备,同时可以通过网口连接组态监控软件WINCC。PLC内部不需要编程,也不需要进行硬件组态配置,…

FME+YOLOV7写DNF自动刷图脚本

目录 前言 一、难点分析 二、实现流程 1.DNF窗口位置获取 2.获取训练数据 3.数据标注 4.数据格式转换 5.数据训练 5.刷图逻辑编写 前言 这是一篇不务正业的研究,首先说明,这不是外挂!这不是外挂!这不是外挂!这只是用a…

【网络原理10】构造HTTP请求、HTTPS加密

目录 一、构造HTTP请求 ①使用form表单构造HTTP请求: form表单是如何提交的 form提交的缺点 ②基于ajax构造http请求 如何使用Jquery框架 二、HTTPS 运营商劫持 HTTP的加密版本:HTTPS ①对称加密:客户端和服务端使用同一把密钥&…

【AcWing】差分及其应用

&#x1f386;音乐分享 光辉岁月 (粤语版)_BEYOND 所谓差分&#xff0c;就是前缀和的逆运算 &#xff08;不懂前缀和的同学可以去C站看一下&#x1f602;&#xff09; 797. 差分 - AcWing题库 代码 #include<iostream> using namespace std; const int N 1e5 10…

怎样选择运动耳机、5款最佳运动蓝牙耳机推荐

你是否在跑步时大幅度抖动让耳机松落&#xff0c;不得不一遍又一遍的塞紧耳机&#xff1f;你是否在游泳时因为耳机进水而懊恼自己大意&#xff1f;没错&#xff0c;在运动过程中这些情况我都有遇到过&#xff01;运动耳机因其使用都是在跑步、游泳、骑行、徒步等场景&#xff0…

Apache Hadoop生态部署-Maxwell(实时数据同步)采集节点安装

目录 Apache Hadoop生态-目录汇总-持续更新 1&#xff1a;安装包准备 2&#xff1a;MySQL 环境准备 2.1&#xff1a;开启MySQL Binlog 2.2&#xff1a;验证mysql配置是否正确 2.3&#xff1a;初始化Maxwell元数据库,分配账号 3&#xff1a;安装 4&#xff1a;测试 Apach…

【开发规范】go项目开发中的[流程,git,代码,目录,微服务仓库管理,静态检查]

文章目录前言一、有哪些规范我们应该遵循二、项目开发流程三、git的代码分支管理1. 分支管理2. commit规范三、go的代码规范四、go项目目录规范五、微服务该采用multi-repo还是mono-repo&#xff1f;1. 引言2. Repos 是什么?3. 什么是 Mono-repo?4. Mono-repo 的劣势5. 什么是…

1、算法导论---时间复杂度、确定性和非确定性图灵机、算法的确定性与非确定性、P问题、NP问题、规约/约化、NPC问题、NP-hard问题

算法导论1、 时间复杂度2、图灵机3、算法的确定性与非确定性4、P问题5、NP问题6、规约/约化7、NPC问题8、NP-Hard问题9、四大问题关系1、 时间复杂度 要想了解算法的问题&#xff0c;首先要知道问题的分类&#xff0c;而要想知道问题的分类&#xff0c;就要先了解时间复杂度。…

_vue-2

v-model实现原理 我们在 vue 项目中主要使用 v-model 指令在表单 input、textarea、select 等元素上创建双向数据绑定&#xff0c;我们知道 v-model 本质上不过是语法糖&#xff08;可以看成是value input方法的语法糖&#xff09;&#xff0c;v-model 在内部为不同的输入元素…

什么是原型、原型链?原型和原型链的作用

1、ES6之前&#xff0c;继承都用构造函数来实现&#xff1b;对象的继承,先申明一个对象&#xff0c;里面添加实例成员<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><script…

Ubuntu(虚拟机)的Anaconda 及使用

安装Anaconda 使用firefox打开Ananconda网址Anaconda | The Worlds Most Popular Data Science Platform 下载后有.sh文件&#xff1a; Anaconda3-2022.10-Linux-x86_64.sh 进入所在目录打开终端并输入 $ bash Anaconda3-2022.10-Linux-x86_64.sh 然后开始安装。 对于给…

SAP MM学习笔记1-SAP中扩张的概念,如何将一个物料从工厂A扩张到工厂B

MM中在创建物料的时候&#xff0c;最低也得创建如下5个view。 基本数据1 基本数据2 购买管理 会计1 会计2 1&#xff0c;扩张是什么 有时候&#xff0c;你想增加其他的View&#xff0c;比如保管场所 等&#xff0c;你不能用MM02来做编辑&#xff0c;要用MM01来做扩张。这就是扩…

OSPF的多区域特性 (电子科技大学TCP/IP实验三)

一&#xff0e;实验目的 1、掌握OSPF 协议中区域的类型、特征和作用 2、掌握OSPF 路由器的类型、特征和作用 3、掌握OSPF LSA 分组的类型、特征和作用 4、理解OSPF 区域类型、路由器类型和OSPF LSA 分组类型间的相互关系 二&#xff0e;预备知识 1、静态路由选择和动态路…

分享美容美发会员管理系统功能的特点_美容美发会员管理系统怎么做

人们越来越关心美发&#xff0c;美发行业发展迅速&#xff0c;小程序可以连接在线场景&#xff0c;许多美发院也开发了会员卡管理系统。那么一个实用的美发会员管理系统怎么制作呢&#xff1f;它有什么功能&#xff1f;我们一起来看看~&#xff08;干货满满&#xff0c;耐心看完…

Lenovo Legion Y530-15ICH电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。硬件型号驱动情况主板Lenovo Legion Y530-15ICH处理器Intel Core™ i7-8750H (Coffee-Lake)已驱动内存16GB RAM DDR4 2667MHz已驱动硬盘2TB HP EX950 PCI-E Gen3 x4 NVMe SSD已驱动显卡Intel UHD Graphics 630Nvidia GTX 10…

电子科技大学TCP/IP实验一——IP分组和ARP协议

目录 一&#xff0e;实验目的 二&#xff0e;预备知识 三&#xff0e;实验原理 四&#xff0e;实验内容 五&#xff0e;实验步骤 六、实验数据及结果分析 七、实验结论 八、总结及心得体会 九、对本实验过程及方法、手段的改进建议 一&#xff0e;实验目的 1、掌握 IP…

Lambda表达式的本质

一直想写一篇文章&#xff0c;来总结lambda表达式&#xff0c;但是之前感觉总结的不是特别到位&#xff0c;现在看了几篇文章和视频后&#xff0c;感觉对lambda表达式有了比较深刻的认识&#xff0c;现在进行记录总结如下&#xff1a; lambda表达式又叫做匿名函数&#xff0c;…