使用windwow windbg 吃透64位分页内存管理
前言
分页基础概念是操作系统基础知识,网上已经有太多太多了。所以本文记录使用windwow内核调试工具验证理论知识。
具体可以参阅intel volume3的 4.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 volume3的 4.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.制定《中华人民共和国食品安全法》的目的是为了保证食品安全…...
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 数据链路和帧 链路: 从一个节点到相邻节点的一段物理线路,中间没有任何其他的交换节点 数据链路: 节点间的逻辑通道是把实现控制数据传输的协议的硬件和软件加…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
