内存管理


线性地址的管理

进程空间的地址划分

分区x86 32位Windows
空指针赋值区0x00000000 - 0x0000FFFF
用户模式区0x00010000 - 0x7FFEFFFF
64KB禁入区0x7FFF0000 - 0x7FFFFFFF
内核0x80000000 - 0xFFFFFFFF

线性地址有4GB,但是并不是所有的地方都能访问(这里的不能访问只是默认情况下,一但给这些区域挂上物理页还是可以访问的),所以需要记录哪些地方分配了

在内核空间是通过一个链表把所有未分配的空间链在一起
但是在用户空间,这样管理的效率太低,而是通过收索二叉树来管理

在_EPROCESS结构体当中有一个成员VadRoot,这个成员就是这个二叉树的入口点

在这里插入图片描述
由于我是用64位windbg分析32位的系统,版本等原因导致VadRoot的地址未被正常解析出来,所以我们直接加上偏移来解析这个地址

dt _RTL_AVL_TREE (ac110040 + 310)  // 进程地址ac110040 + 偏移310 VadRoot处

在这里插入图片描述
得到地址:0xbb925678

VadRoot通常每一个节点都是_MMVAD结构,但是现在的windows对VadRoot进行了优化,并不直接指向_MMVAD,而是通过AVL 树/红黑树的结构来进行优化访问和存储可以使用以下命令直接遍历VadRoot

!vad 地址 // 遍历vad

在这里插入图片描述

字段示例值含义
VAD 节点地址bb923260该 VAD 节点在内核中的内存地址(_MMVAD 结构地址)
Level8该节点在 VAD 树中的深度(层级)
Start580内存区域的起始页号(需转换为虚拟地址:Start << PAGE_SHIFT,32位系统 PAGE_SHIFT=12,即 0x580000
End5a7内存区域的结束页号(0x5A7000
Commit5已提交的物理页数量(单位:页,每页通常 4KB)
TypeMapped内存类型:
Private(私有内存,如堆/栈)
Mapped(映射文件或共享内存)
SubtypeExe子类型(仅适用于 Mapped 类型):
Exe(可执行文件映射)
Image(镜像文件)
• 其他(如 Pagefile
ProtectionEXECUTE_WRITECOPY内存保护标志:
READONLY/READWRITE
EXECUTE/EXECUTE_WRITECOPY
PAGE_GUARD(保护页)
File/Desc\Users\...\x32dbg.exe如果是文件映射,显示文件路径;如果是共享内存,显示描述信息(如 Pagefile section

Private Memory

申请内存的两种方式:

  1. 通过VirtualAlloc/VirtualAllocEx申请的:Private Memory(当前的进程独享内存)
  2. 通过CreateFileMapping映射的:Mapped Memory

我们来通过代码来看一下VirtualAlloc在没有分配和分配后的线性地址

#include<iostream>
#include<windows.h>LPVOID lpAddr;int main() {printf("当前内存还未申请!");getchar();lpAddr = VirtualAlloc(NULL, 0x1000 * 2, MEM_COMMIT, PAGE_READWRITE);printf("申请的内存地址:0x%x", lpAddr);system("pasue");return 0;
}

在这里插入图片描述
此时内存还未申请,我们用windbg查看一下当前进程的线程地址

在这里插入图片描述
回到程序让程序申请内存后我们再来看下
在这里插入图片描述

在这里插入图片描述
可以看到在我们没有分配内存时,0xbc0位置是没有分配的,可以看上面对应的属性和我们申请时填写的一致

堆与栈

那这个VirtualAlloc和我们在写c/c++程序时,用到的molloc/new关键字有什么区别呢,c/c++使用的申请是在当中申请的它们的低层实现是HeapAlloc,它是由操作系统提前通过VirtualAlloc申请好的一块内存空间,当使用molloc/new时,就会把申请好的地址给挂过去

代码测试

#include<iostream>
#include<Windows.h>int num = 0x789;int main() {printf("申请内存之前!");getchar();// 在栈上分配内存int stack = 0x123;// 在堆上分配内存int* heap = new int(0x456);printf("栈空间的地址:0x%x\n",&stack);printf("堆空间的地址:0x%x\n",heap);printf("全局变量的地址:0x%x\n", &num);system("pause");return 0;
}

在这里插入图片描述

在这里插入图片描述

可以发现在我们程序中无论是全局变量,还是堆空间,栈空间中的内存在程序运行时就已经存在了

可以发现全局变量是在我们的程序中的一个位置写死的


Mapped Memory

上面讲到Private Memory是推私有的,而Mapped Memory是共享的,可以是文件共享或者是物理页共享

在这里插入图片描述
在上图中,Mapped后面有对应文件路径的就是文件共享,反之就是物理页共享

代码测试

#include<iostream>
#include<windows.h>int main(){// 第一个参数如果提供一个文件的句柄,那么创建出来的就是文件映射,否则就是内存映射。HANDLE g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,BUFSIZ,L"共享内存");// 将物理页与线性地址进行关联LPTSTR g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile,FILE_MAP_ALL_ACCESS,0,0,BUFSIZ);*(PDWORD)g_lpBuff = 0x12345678;printf("A进程写入地址内容:%p - %x",g_lpBuff,*(PDWORD)g_lpBuff);system("pause");return 0;
}

在这里插入图片描述
我们再到windbg中遍历一下

在这里插入图片描述
可以看到B30的位置已经分配好了物理页,然后我们就可以在其他进程获取到这个创建好的内存空间

代码测试

#include <iostream>
#include <windows.h>int main() {HANDLE g_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, L"共享内存");// 将物理页与线性地址进行映射LPTSTR g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUFSIZ);printf("B进程读取%x", *(PDWORD)g_lpBuff);system("pause");return 0;
}

在这里插入图片描述
可以看到我们成功的读取到了内容

共享文件

#include<iostream>
#include<windows.h>int main(){HANDLE g_hFile = CreateFile(L"newMemory.exe",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_READONLY, NULL);HANDLE g_hMapFile = CreateFileMapping(g_hFile,NULL,PAGE_READWRITE,0,BUFSIZ,NULL);LPTSTR g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUFSIZ);printf("地址:0x%x",g_lpBuff);system("pause");return 0;
}

在这里插入图片描述

windbg中查看

在这里插入图片描述

可以看到已经成功的映射到了我们的文件上


写拷贝

可以看到这里的有一部分它的类型是EXECUTE_WRITECOPY,Mapped的后面还有一个Exe,这又是什么呢?
在这里插入图片描述

代码测试

#include<iostream>
#include<windows.h>int main(){LoadLibrary(L"C:\\Users\\win10x32\\Desktop\\gxnc.exe");system("pause");return 0;
}

在这里插入图片描述

可以看到当我们以LoadLibrary载入一个PE文件时,它的属性会被设置为EXECUTE_WRITECOPOY,所以我们看到的kernel32.dll,KernelBase.dll,其实都是操作系统用LoadLibrary一个个加载的,本质上没有任何区别,设置为EXECUTE_WRITECOPOY是因为当前系统环境有很多进程都在使用,也都可以对该文件进行修改,那这样以来,一但某一个进程修改了系统dll,那其他使用这个dll的进程就会出问题

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

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

相关文章

【问题解决】使用patch-package修改node-models中的源码

文章目录一、应用场景二、patch-package 和 postinstallpatch-packagepostinstall三、操作步骤1、使用yarn安装patch-package和postinstall-postinstall2、修改package.json3、修改node-model中源码、保存。4、找到修改文件对应的包名5、使用git将新增的patches文件同步到仓库6…

当配置项只支持传入数字,即无法指定单位为rem,需要rem转px

您好&#xff01;针对您 Vue 3 Element Plus 的技术栈&#xff0c;要优雅且符合大厂规范地解决这个问题&#xff0c;最佳实践是创建一个响应式的 Composition API (组合式函数)。 这个方法完全遵循 Vue 3 的设计哲学&#xff0c;具有高内聚、低耦合、可复用、类型安全&#xf…

谷歌搜索 sg_ss 逆向分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;部分python代码sg_ss cp.call(get_sg_…

一个“加锁无效“的诡异现象

加锁了还出问题&#xff1f;从"点击过快"到"状态可控"&#xff1a;多线程共享变量的并发陷阱与实战对策详情如下&#xff1a;在服务端开发中&#xff0c;多线程并发处理客户端请求是提升系统吞吐量的常见手段。最近有位开发者朋友遇到了一个令人费解的问题…

液体泄漏识别误报率↓76%:陌讯多模态融合算法实战解析

原创声明本文为原创技术解析&#xff0c;核心技术参数与架构设计引用自《陌讯技术白皮书》&#xff0c;禁止未经授权的转载与篡改。一、行业痛点&#xff1a;液体泄漏识别的现实挑战在化工生产、食品加工、仓储物流等场景中&#xff0c;液体泄漏的实时监测是保障安全生产的关键…

Y9000P跑开源模型(未完成)

环境信息 1、Y9000笔记本 2、1T空白硬盘 3、ubunut24.04桌面版 一、环境初始化 第一部分&#xff1a;系统初始化 1、安装基础软件 apt-get update apt-get -y install openssh-server openssh-client apt-utils freeipmi ipmitool sshpass ethtool zip unzip nano less git ne…

ARM体系结构

ARM体系结构 编程原理 从源代码到CPU执行过程 #mermaid-svg-M4xemCxDjIQVNNnW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:14px;fill:#333;}#mermaid-svg-M4xemCxDjIQVNNnW .error-icon{fill:hsl(220.5882352941, 100%, 98.3333333333%);}#mer…

基于SpringBoot的高校社团管理系统的设计与实现(代码+LW文档+远程运行)

&#x1f4af;博主&#xff1a;✌全网拥有50W粉丝、博客专家、全栈领域优质创作者、平台优质Java创作者、专注于Java技术领域和毕业项目实战✌&#x1f4af; &#x1f497;开发技术&#xff1a;SpringBoot、Vue、SSM、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、…

F5发布业界首创集成式应用交付与安全平台,开启ADC 3.0新时代

在数字化转型加速与AI技术蓬勃发展的今天&#xff0c;企业对应用性能与安全的需求正经历革命性变革。传统应用架构已难以满足现代混合多云环境与AI驱动型业务场景的严苛要求。全球领先的应用安全和交付服务提供商F5&#xff08;NASDAQ: FFIV&#xff09;&#xff0c;持续推动 F…

SELinux 入门指南

SELinux(Security-Enhanced Linux)是 Linux 内核的一个安全模块&#xff0c;它提供了一种强制访问控制&#xff08;Mandatory Access Control, MAC&#xff09;机制。与传统的 Linux 自主访问控制&#xff08;Discretionary Access Control, DAC&#xff09;不同&#xff0c;SE…

ARMv8 MMU页表格式及地址转换过程分析

1.简介 CPU发出的虚拟地址经过MMU转换后得到物理地址&#xff0c;然后使用物理地址访问真实的硬件。虚拟地址和物理地址的映射关系保存在页表中&#xff0c;MMU需要遍历页表&#xff0c;才能将虚拟地址转换成物理地址。ARM64现在有两种大小的页表描述符&#xff0c;分别是ARMv8…

数据结构---二叉树(概念、特点、分类、特性、读取顺序、例题)、gdb调试指令、时间复杂度(概念、大O符号法、分类)

一、二叉树1、树1&#xff09;概念 树是 n(n > 0) 个结点的有限集合。若 n0 &#xff0c;为空树。在任意一个非空树中&#xff1a;&#xff08;1&#xff09;有且仅有一个特定的根结点&#xff1b;&#xff08;2&#xff09;当 n>1 时&#xff0c;其余结点可分为 …

安全基础DAY1-安全概述

信息安全现状及挑战常见术语信息安全的脆弱性及常见攻击网络环境的开放性其实就是人人可以上网&#xff0c;网上零成本。协议栈自身的脆弱性及常见攻击协议栈自身的脆弱性常见安全风险网络的基本攻击模式物理层--物理攻击前置知识 1.打开Apache服务 cd /etc/init.d ./apache2 s…

Claude Code 的核心能力与架构解析

技术分析介绍&#xff1a;Claude Code 的核心能力与架构解析一、概述 Claude Code 是由 Anthropic 推出的面向开发者的智能编码助手&#xff0c;它不仅仅是一个代码生成工具&#xff0c;更是一个具备记忆、工具调用、自主规划和环境感知能力的“智能代理”&#xff08;Agentic …

Mac 电脑放在环境变量中的通用脚本

mac电脑下放在环境变量中&#xff0c;方便提高效率执行 注&#xff1a;相关路径需要根据实际情况进行更新 需要在 .bash_profile 文件中定义如下&#xff08;路径需要做实际替换&#xff09;&#xff1a; source $HOME/software/scripts/base_profile.sh source $HOME/software…

UE蓝图节点Add Impulse和Add Torque in Radians

​​​​​​​Add Impulse&#xff1a;对刚体施加一次性的线性脉冲&#xff08;瞬时改变量&#xff09;&#xff0c;改变速度&#xff08;与质量有关&#xff0c;除非你勾 bVelChange&#xff09;。Add Torque (in Radians)&#xff1a;对刚体施加转矩/旋转力&#xff08;向量…

大型语言模型幻觉检测与缓解技术研究综述

摘要 本文系统综述了大型语言模型(LLMs)中的幻觉现象及其检测与缓解技术。研究首先从认知机制角度分析了幻觉产生的理论根源&#xff0c;包括模型对语言先验的过度依赖、训练数据偏差以及推理过程中的信息衰减等问题。在技术层面&#xff0c;综述将现有方法归纳为三类&#xff…

【数据结构初阶】--二叉树(二)

&#x1f618;个人主页&#xff1a;Cx330❀ &#x1f440;个人简介&#xff1a;一个正在努力奋斗逆天改命的二本觉悟生 &#x1f4d6;个人专栏&#xff1a;《C语言》《LeetCode刷题集》《数据结构-初阶》 前言&#xff1a;上篇博客我们学习了有关树的概念和相关术语的介绍&…

jmm 指令重排 缓存可见性 Volatile 内存屏障

CPU指令重排 CPU指令重排是指CPU为了提高指令执行效率&#xff0c;可能会对指令的执行顺序进行优化&#xff0c;使得&#xff08;单线程下&#xff09;指令的实际执行顺序与代码中的顺序不同&#xff0c;但结果是一致的。 这种优化是通过乱序执行和缓存读写重排来实现的。 乱序…

卡车手机远程启动一键启动无钥匙进入有哪些好处

随着汽车科技的发展&#xff0c;卡车智能化升级已成为趋势&#xff0c;其中手机控车、远程启动、无钥匙进入及一键启动等功能显著提升了驾驶便捷性与安全性。以下从功能特点、技术原理、适用场景及改装建议等方面展开说明。一、核心功能及技术特点1. 无钥匙进入系统自动感应操作…