页的初步认识

关于准备

我们在之前的学习中,已经学习了相当一部分有关段的知识,CPU提供了段的机制来给我们的内存进行保护,但实际上我们在x86下的段base是0,实际上并没有偏移

两种分页模式

我们有两种分页模式,29912分页和101012分页,这里先不细说,先给自己的实验环境设置成为相对简单的101012分页

win7 32位机子管理员权限输入以下命令

bcdedit /copy {current} /d debug-101012//自己起个名字bcdedit /displayorder {} /addlast//大括号里面是自己的标识符,在输入上一个命令后就会出现bcdedit /dbgsettings SERIAL DEBUGPORT:1 BAUDRATE:115200bcdedit /bootdebug {} ONbcdedit /debug {} ONbcdedit /timeout 30

然后重启电脑,之后继续打开管理员权限,输入以下命令,之后再重启

bcdedit /set /pae ForceDisable //先把pae关了bcdedit /set nx AlwaysOff //再关nx

最后的效果在windbg中用!process 0 0指令检验,如果DirBase结尾都是000,那么就成功了

在这里插入图片描述

基础知识

我们之前提到了在段的视角下CPU如何访问的数据,那么现在我们进入到了页的这个过程来看

比如,当我们执行mov eax ,ds:[0x12345678]的时候,首先查询缓存和TLB里面有没有之前的记录,如果有直接返回到CPU,如果没有,则进入MMU中进行处理

MMU

CPU为了方便管理物理内存,在实际中是按照页的方式进行管理内存的,对于32位来说,它分别有10-10-12分页和2-9-9-12分页,我们在上面已经配置好了10-10-12的分页环境。

我们都知道,在所有进程的视角里面,其占有了整个进程,也就是在win7中,每个进程都有4GB的虚拟地址空间

它们并不是真正的地址,而是一个索引,通过转换来指向真正的的物理地址,而这样的转换,就是通过MMU来达成的,它会解析我们送给CPU的地址

这里先介绍一个寄存器,CR3寄存器

CR3寄存器

每个进程都会有自己的物理起始地址,我们称之为DirBase。通过CR3去查询页目录表,再查询页表,最后查询到具体的物理页,而这个DirBase就被存储在CR3中

在这里插入图片描述

1: kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS 9f979d08  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000DirBase: 00185000//在这里  ObjectTable: a6401bb8  HandleCount: 452.Image: System

首先,每个进程都有一个CR3寄存器,我们先暂时不需要知道太复杂,只要记住,这个寄存器里面存了我们进程真正的物理地址的起点,因为它指向了我们进程的页目录表

对于我们马上要研究的10-10-12分页来说,虚拟地址是有具体的含义的

在这里插入图片描述

(这里再次借用羽夏 大佬的图)

前10个位指的是PDE(页目录表号),中间是PTE(页表号),大小都是4个字节这里我们要和PDT(页目录表)和PTT(页表)作一个区分

实践一下

学到这里的理论知识已经足够我们实践,来在我们已经设置好的Win7中来验证一下我们寻址的理论

首先打开一个记事本,随便输入一个字符串,然后用CE的字符串搜索来找到我们的这个字符串

在这里插入图片描述

可以看见,现在是有四个结果,但是这肯定是不对的,所以我们略微改下字符串,Next Scan一下

在这里插入图片描述

这时候只有两个结果了,我们就以第一个0x0045e8b0为例

我们按照10-10-12的分页方式来看这个地址

在这里插入图片描述

我们就知道了PDE是1,PTE是5e,页内偏移为8B0

用windbg来找

0: kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS 86cdd8e8  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000DirBase: 00185000  ObjectTable: 8ec01b28  HandleCount: 492.Image: System
..........................................
PROCESS 86e62d40  SessionId: 1  Cid: 0848    Peb: 7ffdc000  ParentCid: 062cDirBase: 8dbaf000  ObjectTable: b5b6bb88  HandleCount:  63.Image: notepad.exePROCESS 887ea898  SessionId: 1  Cid: 0ec4    Peb: 7ffd6000  ParentCid: 0374DirBase: 1dbb1000  ObjectTable: b5bf53f8  HandleCount: 185.Image: cheatengine-i386.exe0: kd> !dd 8dbaf000+1*4//这里按照4字节偏移来找
#8dbaf004 97e76867 8f1f2867 97f67867 00000000
#8dbaf014 00000000 94b48867 9474a867 00000000
#8dbaf024 00000000 00000000 00000000 00000000
#8dbaf034 00000000 00000000 00000000 00000000
#8dbaf044 00000000 00000000 00000000 00000000
#8dbaf054 00000000 00000000 00000000 00000000
#8dbaf064 00000000 00000000 00000000 00000000
#8dbaf074 00000000 00000000 00000000 00000000
0: kd> !dd 97e76000 + 4*5E//还是4字节
#97e76178 96156867 9a558847 99857847 9995b847
#97e76188 9695a847 95970847 8f671847 93a77847
#97e76198 98576847 00000000 00000000 00000000
#97e761a8 00000000 00000000 00000000 00000000
#97e761b8 00000000 00000000 00000000 00000000
#97e761c8 00000000 00000000 00000000 00000000
#97e761d8 00000000 00000000 00000000 00000000
#97e761e8 00000000 00000000 00000000 00000000
0: kd> !dd 96156000 + 8B0//这里已经找到了我们要的内容
#961568b0 00680054 00200065 006c0070 00630061
#961568c0 00200065 00680077 00720065 00200065
#961568d0 00650077 00620020 00670065 006e0069
#961568e0 00000000 00000000 00000000 00000000
#961568f0 00000000 00000000 00000000 00000000
#96156900 00000000 00a90004 4151296f 000003f9
#96156910 004600a0 0045a158 0045e598 0045e5d8
#96156920 0045e618 0045e658 5550297a 080003f1
0: kd> !du 961568b0//把这里地址所反汇编一下
#961568b0 "The place where "

PDE和PTE

在具体操作过这两个结构之后,我们来继续学习理论知识

在这里插入图片描述

在这里插入图片描述

在上面搜索字符串的例子中,有一个细节,我使用PDE来寻址的时候,去掉了低12位,这个细节现在由上图得到了回答——前12位是属性位,用来描述结构的属性

P位

P位决定了当前结构是否有效,这和我们在之前学习段的知识时是一样的

R/W位

0为可读,1为可写

U/S位

User和super,为1时可以被R3访问,为0时只能被R0访问,这也是我们R3时无法访问到一些内存的原因

回答一个之前的问题

我们在之前的学习中提到了如果是被声明/被分配的内存,必须要主动置零再使用,这里我们可以用一次实践来给出为什么要这么做的原因了

// Page Alloc.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include<Windows.h>int _tmain(int argc, _TCHAR* argv[])
{PVOID Base = VirtualAlloc(NULL,0x2000,MEM_COMMIT,PAGE_READWRITE);printf("%x\r\n",Base);system("pause");memset(Base,0,0x200);system("pause");return 0;
}

我们运行这段代码,首先知道基址

在这里插入图片描述

根据之前学习的知识,PDE为0,PTE为D,页内偏移还是0

在这里插入图片描述

我们这时候用windbg去找到我们的进程,找到相关的页,结果却发现没有挂上页

0: kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS 86cdd8e8  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000DirBase: 00185000  ObjectTable: 8ec01b28  HandleCount: 513.Image: System
.......................................................
PROCESS 873e9d40  SessionId: 1  Cid: 0fb4    Peb: 7ffdb000  ParentCid: 02b8DirBase: 47e8a000  ObjectTable: b9742ec0  HandleCount:  24.Image: Page Alloc.exePROCESS 873b7d40  SessionId: 1  Cid: 0fe4    Peb: 7ffdf000  ParentCid: 01a8DirBase: 228c3000  ObjectTable: b5cc7a28  HandleCount:  62.Image: conhost.exePROCESS 87733d40  SessionId: 1  Cid: 0cd4    Peb: 7ffdd000  ParentCid: 0fb4DirBase: 83e68000  ObjectTable: b99319f8  HandleCount:  30.Image: cmd.exe0: kd> !dd 47e8a000
#47e8a000 53e16867 17d4d867 33365867 00000000
#47e8a010 00000000 00000000 00000000 00000000
#47e8a020 00000000 00000000 00000000 00000000
#47e8a030 00000000 00000000 00000000 00000000
#47e8a040 00000000 00000000 00000000 00000000
#47e8a050 00000000 00000000 00000000 00000000
#47e8a060 00000000 00000000 00000000 00000000
#47e8a070 00000000 00000000 00000000 00000000
0: kd> !dd 53e16000+d0*4//我们发现这里没有被挂上页,也就是没有办法被直接使用
#53e16340 00000000 00000000 00000000 00000000
#53e16350 00000000 00000000 00000000 00000000
#53e16360 00000000 00000000 00000000 00000000
#53e16370 00000000 00000000 00000000 00000000
#53e16380 00000000 00000000 00000000 00000000
#53e16390 00000000 00000000 00000000 00000000
#53e163a0 00000000 00000000 00000000 00000000
#53e163b0 00000000 00000000 00000000 00000000

这时候我们继续运行程序,用memset向内存中写入值,再用Windbg来看值

1: kd> !dd 53e16000+d0*4//这时候,我们的页就被成功分配了
#53e16340 1486e867 00000000 00000000 00000000
#53e16350 00000000 00000000 00000000 00000000
#53e16360 00000000 00000000 00000000 00000000
#53e16370 00000000 00000000 00000000 00000000
#53e16380 00000000 00000000 00000000 00000000
#53e16390 00000000 00000000 00000000 00000000
#53e163a0 00000000 00000000 00000000 00000000
#53e163b0 00000000 00000000 00000000 00000000

所以,我们知道,在WIn系统中,当我们申请一块内存时,系统并不会会给我们真的直接挂上页,它必须要在我们真正使用了这块内存之后才会真正的挂页。

我们之前提到过,操作系统里面的进程每个都认为自己占了整个内存,如果我们真的申请一块内存,就分配一块内存,那么每个程序你申请一块我申请一块,我们的内存根本就不够用

我们C盘里面有一个隐藏的文件pagefile.sys正是为了解决这种情况而出现的,这里面就存了一些暂时没有使用的内存(比如申请了一块内存,但是一段时间没有用,其他的程序同时页申请了同一块内存所以就会暂时储存起来)

在这里插入图片描述

我们还可以知道一个新的知识,那就是VirtualAlloc里面MEM_COMMIT属性,这个属性的意思就是当我们使用这块内存的时候,为我们挂上页,如果我们没有设置COMMIT,那么使用了之后也不会挂上页

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

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

相关文章

题目一:bugku---game1

2024.11.21 1、题目连接&#xff1a; 2、打开是个小游戏 3、正常玩一把结束后&#xff0c;用bp抓包 4、查看url有三个参数&#xff0c;score对应的就是我们结束这把游戏时获得的分数&#xff0c;sign的zM后面为这把游戏分数的base64加密 5、将抓到的包&#xff0c;发送到重放…

小柴冲刺软考中级嵌入式系统设计师系列三、嵌入式硬件设计(1)嵌入式系统电源管理

越努力&#xff0c;越幸运&#xff01; 人生的意义在于体验&#xff01; 目录 越努力&#xff0c;越幸运&#xff01; 一、电源管理 (1)系统上电行为 (2)空闲模式 (3)断电 (4)电压与频率缩放 例如 具体实现如下: ① 12V 转8V ② 12V 转-8V ③ 12V 转5V ④ 5V 转3…

C++ 优先算法 —— 长度最小的子数组(滑动窗口)

目录 题目&#xff1a;长度最小的子数组 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口&#xff08;同向双指针&#xff09; 滑动窗口正确性 3. 代码实现 Ⅰ. 暴力枚举(会超时&#xff09; Ⅱ. 滑动窗口&#xff08;同向双指针&#xff09; 题目&#xff1a;长…

uniapp定义new plus.nativeObj.View实现APP端全局弹窗

为什么要用new plus.nativeObj.View在APP端实现弹窗&#xff1f;因为uni.showModal在APP端太难看了。 AppPopupView弹窗函数参数定义 参数一:弹窗信息(所有属性可不填&#xff0c;会有默认值) 1.title:"", //标题 2.content:"", //内容 3.confirmBoxCo…

网络安全——SpringBoot配置文件明文加密

一、前言 在日常开发中&#xff0c;项目中会有很多配置文件。比如SpringBoot项目核心的数据库配置、Redis账号密码配置都在properties、yml配置文件 中。 如果这些信息以明文的方式存储&#xff0c;你的电脑被拿去修理&#xff0c;就会容易泄露&#xff0c;一旦被其他人获取到…

Linux系统编程之进程基础知识

概述 在Linux系统中&#xff0c;进程是指一个正在运行的程序实例。每个进程都有一个唯一的进程标识符&#xff0c;即PID&#xff0c;操作系统通过这个PID来唯一识别和管理各个进程。进程不仅仅是程序代码的运行实例&#xff0c;它还包含了程序运行时所需的各种资源&#xff0c;…

2024智能机器人与自动控制国际学术会议 (IRAC 2024)

主办&#xff0c;承办&#xff0c;支持单位 会议官网 www.icirac.org 大会时间&#xff1a;2024年11月29-12月1日 大会简介 2024智能机器人与自动控制国际学术会议 &#xff08;IRAC 2024&#xff09;由华南理工大学主办&#xff0c;会议将于2024年11月29日-12月1日在中国广…

【Pytest+Yaml+Allure】实现接口自动化测试框架

一、框架思想 requestsyamlpytestallure实现接口自动化框架。结合数据驱动和分层思想&#xff0c;将代码与数据分离&#xff0c;易维护&#xff0c;易上手。使用yaml编写编写测试用例&#xff0c;利用requests库发送请求&#xff0c;使用pytest管理用例&#xff0c;allure生成…

利用 Jsoup 进行高效 Web 抓取与 HTML 处理

Jsoup 是一款 Java 的 HTML 解析器&#xff0c;可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API&#xff0c;可通过 DOM&#xff0c;CSS 以及类似于 JQuery 的操作方法来取出和操作数据。 官网&#xff1a;https://jsoup.org/ 中文文档&#xff1a;Jsou…

蓝桥杯不知道叫什么题目

小蓝有一个整数&#xff0c;初始值为1&#xff0c;他可以花费一些代价对这个整数进行变换。 小蓝可以花贵1的代价将教数增加1。 小蓝可以花费3的代价将整数增加一个值,这个值是整数的数位中最大的那个(1到9) .小蓝可以花费10的代价将整数变为原来的2倍, 例如&#xff0c;如果整…

【JavaEE初阶】枫叶经霜艳,梅花透雪香-计算机是如何运行的?

本篇博客给大家带来的是与计算机相关的知识点, 包括:计算机的组成, 指令, 进程(重点). 文章专栏: JavaEE初阶 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 1. 计算机的组成 1.1 计算机的发展史 计算…

SuperMap Objects组件式GIS开发技术浅析

引言 随着GIS应用领域的扩展&#xff0c;GIS开发工作日显重要。一般地&#xff0c;从平台和模式上划分&#xff0c;GIS二次开发主要有三种实现方式&#xff1a;独立开发、单纯二次开发和集成二次开发。上述的GIS应用开发方式各有利弊&#xff0c;其中集成二次开发既可以充分利…

Linux网络——NAT/代理服务器

一.NAT技术 1.NAT IP转换 之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题&#xff0c;NAT 技术就是当前解决 IP 地址不够用的主要手段, 是路由器的一个重要功能。 NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是一种将私有 IP 和全局IP 相互转化的技术方法: 很…

使用八爪鱼爬虫抓取汽车网站数据,分析舆情数据

我是做汽车行业的&#xff0c;可以用八爪鱼爬虫抓取汽车之家和微博上的汽车文章内容&#xff0c;分析各种电动汽车口碑数据。 之前&#xff0c;我写过很多Python网络爬虫的案例&#xff0c;使用requests、selenium等技术采集数据&#xff0c;这次尝试去采集小米SU7在微博、汽车…

C语言笔记(自定义类型:结构体、枚举、联合体 )

前言 本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式&#xff0c;枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述&#xff0c;如有错误&#xff0c;请各位指正。 目录 前言 1 结构体 1.1 结构体的声明 1.2 结构体的自引用 1.3 结构体变…

【消息序列】详解(6):深入探讨缓冲区管理与流量控制机制

目录 一、概述 1.1. 缓冲区管理的重要性 1.2. 实现方式 1.2.1. HCI_Read_Buffer_Size 命令 1.2.2. HCI_Number_Of_Completed_Packets 事件 1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令 1.2.4. HCI_Host_Buffer_Size 命令 1.2.5. HCI_Host_Number_Of_Complete…

Element Plus的快速入门

一、什么是Element Plus Element : 是饿了么团队研发的&#xff0c;基于Vue3&#xff0c;面向设计师和开发者的组件库。 组件&#xff1a;组成网页的部分&#xff0c;例如超链接&#xff0c;按钮&#xff0c;图片&#xff0c;表格&#xff0c;表单&#xff0c;分页条等等。 …

健身房小程序服务渠道开展

健身不单单是锻炼身体、保持身材&#xff0c;也是一种社交方式&#xff0c;城市里门店不少&#xff0c;每家都有一定流量和老客&#xff0c;但仅靠传统线下拉客/自然流量前往和线上朋友圈、短视频发硬广等方式还不够。 商家需要找到更多潜在目标客户&#xff0c;而消费者也对门…

Docker--通过Docker容器创建一个Web服务器

Web服务器 Web服务器&#xff0c;一般指网站服务器&#xff0c;是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档&#xff0c;也可以放置网站文件以供全世界浏览&#xff0c;或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…

HTMLCSS:3D金字塔加载动画

效果演示 这段代码通过CSS3的3D变换和动画功能&#xff0c;创建了一个旋转的金字塔加载动画&#xff0c;每个侧面都有不同的颜色渐变&#xff0c;底部还有一个模糊的阴影效果&#xff0c;增加了视觉的立体感。 HTML <div class"pyramid-loader"><div cl…