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

页的初步认识

关于准备

我们在之前的学习中,已经学习了相当一部分有关段的知识,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,那么使用了之后也不会挂上页

相关文章:

页的初步认识

关于准备 我们在之前的学习中&#xff0c;已经学习了相当一部分有关段的知识&#xff0c;CPU提供了段的机制来给我们的内存进行保护&#xff0c;但实际上我们在x86下的段base是0&#xff0c;实际上并没有偏移 两种分页模式 我们有两种分页模式&#xff0c;29912分页和101012…...

[C++]:IO流

1. IO 流 1.1 流的概念 在C中&#xff0c;存在一种被称为“流”的概念&#xff0c;它描述的是信息流动的过程&#xff0c;具体来说就是信息从外部输入设备&#xff08;比如常见的键盘&#xff09;传输到计算机内部&#xff08;像内存区域&#xff09;&#xff0c;以及信息从内…...

Excel如何批量导入图片

这篇文章将介绍在Excel中如何根据某列数据&#xff0c;批量的导入与之匹配的图片。 准备工作 如图&#xff0c;我们准备了一张员工信息表以及几张员工的照片 可以看到&#xff0c;照片名称是每个人的名字&#xff0c;与Excel表中的B列&#xff08;姓名&#xff09;对应 的卢易…...

TCP socket api详解

文章目录 netstat -nltpaccept简单客户端工具 telnet 指定服务连接connect异常处理version 1 单进程版version 2 多进程版version 3 -- 多线程版本version 4 ---- 线程池版本 应用-简单的翻译系统服务器细节write 返回值 客户端守护进程化前台和后台进程的原理Linux的进程间关系…...

《C++搭建神经网络基石:开启智能编程新征程》

在人工智能的璀璨星空中&#xff0c;神经网络无疑是最为耀眼的星座之一。而 C以其卓越的性能和高效的执行效率&#xff0c;成为构建神经网络模型的有力武器。今天&#xff0c;就让我们一同探索如何使用 C构建一个基础的神经网络模型&#xff0c;踏上智能编程的奇妙旅程。 一、…...

if (条件) { return true; } return false; 简写为 return 条件 详解

在 Java 中&#xff0c;将以下代码&#xff1a; if (条件) {return true; } return false;简写为&#xff1a; return 条件;原理 在 Java 中&#xff0c;条件 是一个布尔表达式&#xff0c;它直接返回 true 或 false。所以&#xff0c;if-else 结构中的逻辑判断和返回值的逻…...

Pytorch使用手册-Datasets DataLoaders(专题三)

数据集与数据加载器(Datasets & DataLoaders) 在 PyTorch 中,torch.utils.data.Dataset 和 torch.utils.data.DataLoader 是数据处理的两种核心工具。它们通过模块化的方式,将数据加载与模型训练分离,提高代码的可读性和可维护性。 1. 加载数据集 以 Fashion-MNIST …...

【数据结构】双向链表、单向循环链表、双向循环链表、栈、链栈

目录 一、双向链表 定义类和封装函数以及测试样例如下&#xff1a; 注意事项&#xff1a; 二、循环链表 单循环列表的类和函数封装如下&#xff1a; 注意事项&#xff1a; 三、双向循环链表 结点类和双循环链表的定义部分 函数封装之判空和尾插 双循环链表遍历 双循…...

(动画)Qt控件 QProgressBar

文章目录 QProgressBar1. 介绍一、基本特性二、核心属性 2. 代码实现3. 动画效果 QProgressBar 1. 介绍 QProgressBar是Qt框架中的一个控件&#xff0c;主要用于显示进度条&#xff0c;以图形化的方式表示任务的完成进度或操作的进度。 一、基本特性 显示方向&#xff1a;…...

【AI】基础原理

文章目录 前言1. AI 是如何学习的&#xff1f;2. AI 怎么做决定&#xff1f;3. AI 的“大脑”是什么样的&#xff1f;4. AI 为什么会犯错&#xff1f;5. AI 的不同类型总结&#xff1a;AI 的本质是什么&#xff1f; 前言 人工智能&#xff08;AI&#xff09;这个词对很多人来说…...

多模态大型语言模型(MLLM)综述

目录 多模态大语言模型的基础 长短期网络结构(LSTM) 自注意力机制 基于Transformer架构的自然语言处理模型 多模态嵌入概述 多模态嵌入关键步骤 多模态嵌入现状 TF-IDF TF-IDF的概念 TF-IDF的计算公式 TF-IDF的主要思路 TF-IDF的案例 训练和微调多模态大语言模…...

计算机的错误计算(一百六十六)

摘要 探讨 MATLAB 关于算式 的计算误差。 例1. 已知 计算 直接贴图吧&#xff1a; 然而&#xff0c;16位的正确结果为 -0.9765626220703239e-21&#xff08;ISRealsoft 提供&#xff09;。这样&#xff0c;MATLAB输出的有效数字的错误率为 (16-2)/16 87.5% . 注&…...

typeof 和 as 关键字

在编程语言中&#xff0c;类型系统是确保代码正确性和可维护性的关键。JavaScript和TypeScript作为现代前端开发的两大支柱&#xff0c;它们在处理类型方面有着不同的机制。本文将探讨typeof和as这两个关键字在JavaScript和TypeScript中的应用&#xff0c;帮助开发者更好地理解…...

Python酷库之旅-第三方库Pandas(237)

目录 一、用法精讲 1116、pandas.tseries.offsets.BusinessHour.is_year_end方法 1116-1、语法 1116-2、参数 1116-3、功能 1116-4、返回值 1116-5、说明 1116-6、用法 1116-6-1、数据准备 1116-6-2、代码示例 1116-6-3、结果输出 1117、pandas.tseries.offsets.Cu…...

git提交到远程仓库如何撤回?

git提交到远程仓库如何撤回? 要撤回已经提交到远程仓库的更改&#xff0c;你可以使用以下步骤&#xff1a; 首先&#xff0c;确保你的本地仓库是最新状态。如果不是&#xff0c;请先执行 git pull 来更新你的本地仓库。 使用 git log 查看提交历史&#xff0c;找到你想要撤回…...

微信小程序常用全局配置项及窗口组成部分详解

微信小程序常用全局配置项及窗口组成部分详解 引言 微信小程序作为一种新兴的应用形态,凭借其轻量级、便捷性和丰富的功能,已成为开发者和用户的热门选择。在开发小程序的过程中,了解全局配置项和窗口组成部分是至关重要的。本文将详细介绍微信小程序的常用全局配置项及窗…...

ThingsBoard规则链节点:Azure IoT Hub 节点详解

目录 引言 1. Azure IoT Hub 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据传输 3.2 数据分析 3.3 设备管理 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;提供了设备…...

「Mac玩转仓颉内测版32」基础篇12 - Cangjie中的变量操作与类型管理

本篇将深入探讨 Cangjie 编程语言中的变量操作与类型管理&#xff0c;涵盖变量的定义、作用域、类型推断、常量、变量遮蔽、类型转换等方面的知识。通过这些概念的学习&#xff0c;开发者将更好地理解和灵活掌握变量的使用与管理技巧。 关键词 变量定义类型推断常量变量作用域…...

【Android】RecyclerView回收复用机制

概述 RecyclerView 是 Android 中用于高效显示大量数据的视图组件&#xff0c;它是 ListView 的升级版本&#xff0c;支持更灵活的布局和功能。 我们创建一个RecyclerView的Adapter&#xff1a; public class MyRecyclerView extends RecyclerView.Adapter<MyRecyclerVie…...

麒麟系统性能瓶颈分析

1.使用率&#xff0c;表示资源用于服务的时间或容量百分比。100% 的使用率&#xff0c;表示容量已经用尽或者全部时 间都用于服务。 2. 饱和度&#xff0c;表示资源的繁忙程度&#xff0c;通常与等待队列的长度相关。100% 的饱和度&#xff0c;表示资源无法接受 更多的请求。 3…...

Java二分查找+冒泡排序

二分查找在编程中是用来查找目标元素在有序数组中的位置,并返回目标元素的索引 先给定一个有序数组,在创建一个方法来进行二分 主要思想是:根据数组具有下标的特点来分别计算,最左边的索引,以及最右边的索引,在判断目标元素与中间元素的大小,如果目标元素小于中间元素,我们可…...

(三)手势识别——动作识别应用【代码+数据集+python环境(免安装)+GUI系统】

&#xff08;三&#xff09;手势识别——动作识别应用【代码数据集python环境&#xff08;免安装&#xff09;GUI系统】 &#xff08;三&#xff09;手势识别——动作识别【代码数据集python环境GUI系统】 背景意义 随着互联网的普及和机器学习技术的进一步发展&#xff0c;手…...

大数据实战——MapReduce案例实践

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 大数据实战——MapReduce案例实践 一&#xff0e;过程分析&#xff08;截图&#xff09;1. 确定Hadoop处于启动状态2. 在/usr/local/filecotent…...

OpenCV基础(3)

1.图像直方图 1.1.像素统计 计算图像均值&#xff1a; Scalar cv::mean(InputArray src,InputArray masknoArray()); src&#xff1a;输入图像mask&#xff1a;掩膜层过滤 返回值是对输入图像通道数计算均值后的Scalar对象 计算图像均值与方差&#xff1a; void cv::meanSt…...

大语言模型---RewardBench 介绍;RewardBench 的主要功能;适用场景

文章目录 1. RewardBench 介绍2. RewardBench 的主要功能3. 适用场景 1. RewardBench 介绍 RewardBench: Evaluating Reward Models是一个专门用于评估 Reward Models&#xff08;奖励模型&#xff09; 的公开平台&#xff0c;旨在衡量模型在多种任务上的性能&#xff0c;包括…...

泷羽sec-linux

基础之linux 声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…...

栈、队列、链表

一、栈 1. 定义 栈是一种线性数据结构&#xff0c;遵循后进先出&#xff08;LIFO, Last In First Out&#xff09;的原则。这意味着最后被添加到栈中的元素将会是最先被移除的元素。 2. 基本操作 Push&#xff1a;将一个元素添加到栈顶。Pop&#xff1a;移除并返回栈顶的元…...

【maven】配置下载私有仓库的快照版本

1、setting.xml配置 <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/SETTINGS/1.0.0https://maven.apache.org/xsd/settings-1.0.0.…...

LabVIEW引用类型转换问题

一、问题描述 在LabVIEW中&#xff0c;refnum&#xff08;引用编号&#xff09;用于引用各种资源&#xff0c;如文件、队列、控件等。这些引用是与具体类型相关的&#xff0c;通常情况下&#xff0c;LabVIEW会根据引用的类型自动进行处理。然而&#xff0c;当不同类型的引用需…...

GUI智能代理:用AI代理玩米哈游游戏《崩坏》

项目名称:The Dawn of GUI Agent研究对象:Claude 3.5 Computer Use特点:首个公测版GUI智能代理系统 技术创新 首创性:这是首个提供公测版图形界面控制功能的前沿AI模型。交互方式:实现了从自然语言到桌面操作的端到端控制,用户可以通过简单的自然语言指令完成复杂的桌面…...