从DbgView探究Windows内存管理笔记

本文通过探究DbgView的内存分布,深入理解Windows内存管理,涉及线性地址管理、Private Memory(VirtualAlloc与malloc的区别)、Mapped Memory(包括写拷贝特性)、物理内存管理及缺页异常机制。通过实例分析了VirtualAlloc的内存分配方式,展示了如何跟踪和理解线性地址、物理页与文件映射的关系。
摘要由CSDN通过智能技术生成

0x00 前言

  讲内存管理单纯的理论比较空洞,所以本文从探究DbgVeiw的内存分布开始,来探究windows系统的内存管理,讨论malloc和VirtualAlloc的差别,和缺页异常。

参考文章

https://blog.csdn.net/weixin_42052102/article/details/83757538

https://blog.csdn.net/weixin_42052102/article/details/83722047

https://blog.csdn.net/weixin_42052102/article/details/83751896

0x01 线性地址的管理

首先在虚拟机中打开一个.exe的文件,这里选择了DbgView,之后到Windbg里查看对应的进程

 

看一下_KPROCESS结构体

在0x11c的位置的VadRoot处是一个搜索二叉树的入口点,每一个节点都记录被占用的线性地址空间,每一个节点的结构,都是_MMVAD结构体

接下来,先手动找一下这个搜索二叉树的节点  

观察一下1)Parent:因为是根节点所以没有父节点了

               2)LeftChild / RightChild:左子树/右子树,一个是往左边拓展的线,一个是往右边拓展

重复这一过程就可以找到所有的节点选择二叉树而并非链表是因为搜索二叉树查找的效率比链表高很多

               3)StartingVpn && EndingVpn: 这两个值是以页(4kb)为单位的,所以各把这两个数后面添上3个0,就是当前节点的起始位置与结束位置,也此两者之间就是已经被占用的位置,所以想找到那些已被占用和未被占用的线性地址,遍历这个二叉树就可以了。

             4)ControlArea:看一下结构体

     其中的FilePointer如果其中的值是NULL则线性地址对应的是真正的物理页

 

    而如果指向一个_FILE_OBJECT(如上图),那线性地址对应的是某文件影射的内存,我们继续跟下去

         5)_MMVAD+0x14成员u,我们不妨参考一下 ReactOS 里的说明


union {
   ULONG_PTR   LongFlags
 
   MMVAD_FLAGS   VadFlags
 
} u

主要使用的是MMVAD_FLAGS这个结构,跟进这个结构(和实际windows还是有一定差别的,但是主要成员没问题,其中Protection的偏移为0x14)

typedef struct _MMVAD_FLAGS
{
    ULONG_PTR CommitCharge:19
    ULONG_PTR NoChange:1
    ULONG_PTR VadType:3
    ULONG_PTR MemCommit:1
    ULONG_PTR Protection:5//规定文件属性
                          // 1 READONLY  2  EXECUTE  3  EXECUTE _READ  4 READWITER  
	                  // 5 WRITECOPY  6  EXECUTE _READWITER   7 EXECUTE_WRITECOPY  

    ULONG_PTR Spare:2
    ULONG_PTR PrivateMemory:1//是实际物理页(1:private)还是文件映射(0:mapped)
} MMVAD_FLAGS,*PMMVAD_FLAGS;

 

遍历所有节点,在windbg里也存在这样的指令! vad 0x89473968(这个是根节点的线性地址)

一下列举4种不同的情况

1. 其中的Level就是二叉树中的层级,

2. start和end 后面再加3个0(因为单位为4kb)就是每个节点线性地址的起始与终点位置

3.Private是指线性地址对应真实

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值