当前位置: 首页 > 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 数据链路和帧 链路: 从一个节点到相邻节点的一段物理线路,中间没有任何其他的交换节点 数据链路: 节点间的逻辑通道是把实现控制数据传输的协议的硬件和软件加…...

void在不同场景下的意义

指针一般有三种含义:一是指明数据的位置,体现在指针的值,表示一个地址。二是表示数据类型的大小,例如int指针表示四个字节为一组数据,体现在指针的加减法如何计算。三是表示数据如何被解释,例如float指针和…...

Flume简介

Flume是一个高可用,高可靠,分布式的海量日志采集、聚合和传输的系统,能够有效的收集、聚合、移动大量的日志数据。 优点: 使用Flume采集数据不需要写一行代码,注意是一行代码都不需要,只需要在配置文件中…...

java简单学习

Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象&#xff…...

Vue2 组件基础使用、父子组件之间的传值

一、什么是组件如画红框的这些区域都是由vue里的各种组件组成、提高复用信通常一个应用会以一棵嵌套的组件树的形式来组织:例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。为了能在模板中使用…...

代码随想录算法训练营 || 贪心算法 122 55 45

Day28122.买卖股票的最佳时机II力扣题目链接给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易…...

数据结构基础之栈和队列

目录​​​​​​​ 前言 1、栈 2、队列 2.1、实现队列 2.2、循环队列 前言 上一篇中我们介绍了数据结构基础中的《动态数组》,本篇我们继续来学习两种基本的数据结构——栈和队列。 1、栈 特点:栈也是一种线性结构,相比数组&#xff…...

【Spark分布式内存计算框架——Spark Streaming】3.入门案例(上)官方案例运行

2.1 官方案例运行 运行官方提供案例,使用【$SPARK_HOME/bin/run-example】命令运行,效果如下: 具体步骤如下: 第一步、准备数据源启动端口,准备数据 nc -lk 9999 spark spark hive hadoop spark hive 第二步、运行…...

【博学谷学习记录】超强总结,用心分享 | 架构师 Tomcat源码学习总结

文章目录TomcatTomcat功能需求分析Tomcat两个非常重要的功能(身份)Tomcat的架构(设计实现)连接器的设计连接器架构分析核心功能ProtocolHandler 组件1.EndPoint组件EndPoint类结构图2.Processor组件Processor类结构图3.Adapter组件…...

泛型<E>

泛型 案例引出泛型 按要求写出代码: 在ArrayList中添加3个Dog对象,Dog对象有name和age两个属性,且输出name和age public class test1 {public static void main(String[] args) {ArrayList list new ArrayList();list.add(new Dog(10,&quo…...

你对MANIFEST.MF这个文件知道多少?

前言我们在读源码过程中,经常看到每个jar包的METE-INF目录下有个MANIFEST.MF文件,这个文件到底是做什么的呢?在计算机领域中,"manifest" 通常指的是一份清单或概要文件,用于描述一组文件或资源的内容和属性。…...

合作网站seo/友情链接多久有效果

题目 题目大意 平面上有一堆带权值的点。两种操作&#xff1a;交换两个点的权值&#xff0c;查找一个矩形的第kkk小 N<60000N<60000N<60000 M<10000M<10000M<10000 10000ms10000ms10000ms 思考历程&各种可能过的方法 先是想了一会儿&#xff0c;然后突…...

wordpress弹出层插件/品牌推广运营策划方案

1、题目描述 给定一个无序的数组&#xff0c;找出数组在排序之后&#xff0c;相邻元素之间最大的差值。 如果数组元素个数小于 2&#xff0c;则返回 0。 示例 1: 输入: [3,6,9,1] 输出: 3 解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。…...

临沂网站建设哪家更好/自己想做个网站怎么做

在Java中经常会涉及到对象数组的排序问题&#xff0c;那么就涉及到对象之间的比较问题。本文为大家介绍java比较器的使用。java比较器的使用对于一个实现了Comparable接口的对象&#xff0c;该接口只能实现一次。如果在一个集合里面需要使用id排序&#xff0c;而在另外一个集合…...

怎么做彩票网站的代理/新闻媒体发布平台

要开始我是非常新的自举&#xff0c;但我想要做一些类似于这个例子&#xff1a;text over background image但在一个引导框架内。我曾尝试在导航栏下面的容器内创建一个div&#xff0c;但似乎在背后的文字背后放置了白色背景......您可以在此处看到我的代码&#xff1a;JSFiddl…...

正版视频素材网站/茶叶网络推广方案

为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator).对 Collection 进行迭代的类&#xff0c;称其为迭代器。还是面向对象的思想&#xff0c;专业对象做专业的事情&#xff…...

开发动态网站有哪些技术/seo百度首页排名业务

2019独角兽企业重金招聘Python工程师标准>>> WKWebView是iOS8推出的&#xff0c;用来代替UIWebView,解决了UIWebView加载速度慢、占用内存大的问题。 一些特性&#xff1a; 1、高达60fps的滚动刷新率以及内置手势&#xff1b; 2、性能更快&#xff0c;稳定性更强&am…...