当前位置: 首页 > news >正文

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

前言

分页基础概念是操作系统基础知识,网上已经有太多太多了。所以本文记录使用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`80050033Decimal: -2147155917Octal:   1777777777760001200063Binary:  11111111 11111111 11111111 11111111 10000000 00000101 00000000 00110011Chars:   .......3Time:    ***** InvalidFloat:   low -4.59249e-040 high -1.#QNANDouble:  -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`00000d01Decimal: 3329Octal:   0000000000000000006401Binary:  00000000 00000000 00000000 00000000 00000000 00000000 00001101 00000001Chars:   ........Time:    Thu Jan  1 08:55:29 1970Float:   low 4.66492e-042 high 0Double:  1.64474e-320

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

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

1: kd> r cr4
cr4=00000000001506f81: kd> .formats  00000000001506f8
Evaluate expression:Hex:     00000000`001506f8Decimal: 1378040Octal:   0000000000000005203370Binary:  00000000 00000000 00000000 00000000 00000000 00010101 00000110 11111000Chars:   ........Time:    Sat Jan 17 06:47:20 1970Float:   low 1.93105e-039 high 0Double:  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

相关文章:

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

前言 分页基础概念是操作系统基础知识,网上已经有太多太多了。所以本文记录使用windwow内核调试工具验证理论知识。 具体可以参阅intel volume3的 4.1.1 Four Paging Modes章节。 简而言之:CR0.PG 0表示不开启分页.并且根据CR4各种标志开启不同类别的…...

Java知识复习(五)JVM虚拟机

1、虚拟机的自动内存管理和C/C的区别 C/C开发程序时需要为每一个new操作去写对应的delete/free操作,不容易出现内存泄漏和溢出问题。而Java程序将内存控制权交给了Java虚拟机 2、JVM的运行机制 1、Java程序的具体运行过程如下: Java源文件被编译器编…...

房屋出租管理系统

1. 铺垫 1.1 项目真实开发的过程 上来要做什么???? 有电脑—》配环境(JDK、IDEA、MAVEN……) 这个项目:房屋管理系统 从什么角度出发,第一步做什么?? 架构 …...

2023年全国最新食品安全管理员精选真题及答案6

百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 51.制定《中华人民共和国食品安全法》的目的是为了保证食品安全&#xf…...

C++中的文件操作

文件操作 所有数据程序运行结束后都会释放通过文件可以将数据持久化头文件文件类型分为两种 文本文件—文件以文本的ASCII码形式存储在计算机中二进制文件—文件以文本的二进制存储在计算机中 操作文件的三大类 ofstream—写操作ifstream—读操作fstream—读写操作 文本文件 写…...

监控生产环境中的机器学习模型

简介 一旦您将机器学习模型部署到生产环境中,很快就会发现工作还没有结束。 在许多方面,旅程才刚刚开始。你怎么知道你的模型的行为是否符合你的预期?下周/月/年,当客户(或欺诈者)行为发生变化并且您的训练…...

15s了解什么是物联网技术

目录 15s了解什么是物联网技术 15s了解什么是物联网技术 什么是物联网技术。 简单地说,物联网就是把所有的物体连接起来,相互作用,形成一个互联互通的网络,这就是物联网。如果说互联网是我们身体的虚拟大脑,那么物联网就是我们身体的感知系统,就像眼睛和耳朵-样,让我们…...

敲出来的真理-mysql备份大全,备份命令,还原命令,定时备份

mysqldump命令全量备份数据全量标准语句格式mysqldump -h主机名 -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql 1.备份全部数据库的数据和结构mysqldump -uroot -p123456 -A > /data/mysqlDump/mydb.sql2.备份全部数据库的结构(加 -d 参数&#x…...

ATTCK实战系列-红队评估(一)

from ATT&CK实战系列-红队评估(一) 环境搭建 下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 将三个虚拟机启动起来 除了windows 7那个主机,其他都只设置成仅主机模式 windows 7添加两个网卡,一个是仅主机,一个是NAT …...

学python的第二天---差分

一、改变数组元素(差分)方法一:差分数组map(int,input().split())for b in arr[:n]:print(1 if b else 0,end )方法二:区间合并interval.sort(keylambda x:x[0])二、差分a [0] list(map(int, input().split())) a[n 1:]三、差…...

数据结构入门5-2(数和二叉树)

目录 注: 树的存储结构 1. 双亲表示法 2. 孩子表示法 3. 重要:孩子兄弟法(二叉树表示法) 森林与二叉树的转换 树和森林的遍历 1. 树的遍历 2. 森林的遍历 哈夫曼树及其应用 基本概念 哈夫曼树的构造算法 1. 构造过程 …...

把Redis当作队列来用,到底合适吗?

文章目录 前言从最简单的开始:List 队列发布/订阅模型:Pub/Sub趋于成熟的队列:Stream1) Stream 是否支持「阻塞式」拉取消息?2) Stream 是否支持发布 / 订阅模式?3) 消息处理时异常,Stream 能否保证消息不丢失,重新消费?4) Stream 数据会写入到 RDB 和 AOF 做持久化吗?…...

Python学习-----项目设计1.0(设计思维和ATM环境搭建)

目录 前言: 项目开发流程 MVC设计模式 什么是MVC设计模式? ATM项目要求 ATM项目的环境搭建 前言: 我个人学习Python大概也有一个月了,在这一个月中我发布了许多关于Python的文章,建立了一个Python学习起步的专栏…...

(九)python网络爬虫(理论+实战)——爬虫实战:指定关键词的百度新闻爬取

系列文章目录 (1)python网络爬虫—快速入门(理论+实战)(一) (2)python网络爬虫—快速入门(理论+实战)(二) (3) python网络爬虫—快速入门(理论+实战)(三) (4)python网络爬虫—快速入门(理论+实战)(四) (5)...

数据分析面试、笔试题汇总+解析(六)

(接上篇) 面试题(MySQL篇) 3. 如何提高MySQL的查询速度? 考点解析: 考察面试者对MySQL查询优化的理解 参考答案: (因为这个问题如果回答的详细一点可以写上一整篇,…...

vue3+rust个人博客建站日记3-编写主页

内容 绘制了主页的基本布局设置了封装了header栏组件并设置了全局黑夜模式. 选择一个组件库-Naive UI 如果没有设计能力,又想开发出风格统一的前端页面。就一定要选择一个漂亮的组件库。 本次项目选择使用Naive UI,NaivUI库曾被Vue框架作者尤雨溪推荐…...

前端常考react面试题(持续更新中)

react diff 算法 我们知道React会维护两个虚拟DOM,那么是如何来比较,如何来判断,做出最优的解呢?这就用到了diff算法 diff算法的作用 计算出Virtual DOM中真正变化的部分,并只针对该部分进行原生DOM操作,而…...

C++11多线程编程 二:多线程通信,同步,锁

C11多线程编程 一:多线程概述 C11多线程编程 二:多线程通信,同步,锁 C11多线程编程 三:锁资源管理和条件变量 2.1 多线程的状态及其切换流程分析 线程状态说明: 初始化(Init)&am…...

js——原型和原型链

最近看了很多面试题,看到这个js原型是常考点,于是,我总结了一些该方面的知识点分享给大家,其实原型就是那么一回事,搞明白了就没啥了。结果如下图所示:原型原型又可分为显式原型和隐式原型1.1显式原型显式原…...

[计算机网络(第八版)]第三章 数据链路层(学习笔记)

物理层解决了相邻节点透明传输比特的问题 3.1 数据链路层的几个共同问题 3.1.1 数据链路和帧 链路: 从一个节点到相邻节点的一段物理线路,中间没有任何其他的交换节点 数据链路: 节点间的逻辑通道是把实现控制数据传输的协议的硬件和软件加…...

ES6从入门到精通:前言

ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中&#xff0…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...

自定义线程池1.2

自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本,将线程池中的线程数量交给使用者决定,并且将线程的创建延迟到任务提交的时候,在本文中我们将对这个版本进行如下的优化: 在新建线程时交给线程一个任务。让线程在某种情况下…...

华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手

华为云FlexusDeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手 一、构建知识库问答助手引言二、构建知识库问答助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建知识库问答助手实战3.1 配置Dify环境3.2 创建知识库问答助手3.3 使用知…...

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…...