Windows中的虚拟地址分配
使用指令dt _EPROCESS 874ed030 观察EPROCESS结构体偏移为0x278的地方,这个地方就是系统拿来存放每个进程的虚拟地址空间的分配情况
输入!vad 874ed030+278 查看该平衡二叉树
Level是二叉树的层数 start是该块虚拟地址空间的起始地址 end为结束地址 commit为请求次数
写一段程序测试下
#include<stdio.h>#include<Windows.h>int main() {system("pause");PVOID base = VirtualAlloc(NULL, 0x1000, MEM_RESERVE, PAGE_NOACCESS);printf("base:%p\r\n", base);system("pause");base = VirtualAlloc(base, 0x1000, MEM_COMMIT, PAGE_READWRITE);printf("base:%p\r\n", base);system("pause");return 0; }
首先找到程序VAD一开始的状态
申请一块内存之后
再重新修改属性 可以发现commit变为1,但是属性还是没改
打开CE 看内存 发现还是修改了的
VAD里面的结构为MMVAD
私有内存一般是MMVAD_SHORT
映射内存一般是MMVAD_LONG
kd> dt _MMVADnt!_MMVAD+0x000 u1: <unnamed-tag>+0x004 LeftChild : Ptr32 _MMVAD+0x008 RightChild : Ptr32 _MMVAD+0x00c StartingVpn: Uint4B+0x010 EndingVpn : Uint4B+0x014 u: <unnamed-tag>+0x018 PushLock : _EX_PUSH_LOCK+0x01c u5: <unnamed-tag>+0x020 u2: <unnamed-tag>+0x024 Subsection : Ptr32 _SUBSECTION+0x024 MappedSubsection : Ptr32 _MSUBSECTION+0x028 FirstPrototypePte : Ptr32 _MMPTE+0x02c LastContiguousPte : Ptr32 _MMPTE+0x030 ViewLinks : _LIST_ENTRY+0x038 VadsProcess: Ptr32 _EPROCESSkd> dt _MMVAD_SHORTnt!_MMVAD_SHORT+0x000 u1: <unnamed-tag>+0x004 LeftChild : Ptr32 _MMVAD+0x008 RightChild : Ptr32 _MMVAD+0x00c StartingVpn: Uint4B+0x010 EndingVpn : Uint4B+0x014 u: <unnamed-tag>+0x018 PushLock : _EX_PUSH_LOCK+0x01c u5: <unnamed-tag>kd> dt _MMVAD_LONGnt!_MMVAD_LONG+0x000 u1: <unnamed-tag>+0x004 LeftChild : Ptr32 _MMVAD+0x008 RightChild : Ptr32 _MMVAD+0x00c StartingVpn: Uint4B+0x010 EndingVpn : Uint4B+0x014 u: <unnamed-tag>+0x018 PushLock : _EX_PUSH_LOCK+0x01c u5: <unnamed-tag>+0x020 u2: <unnamed-tag>+0x024 Subsection : Ptr32 _SUBSECTION+0x028 FirstPrototypePte : Ptr32 _MMPTE+0x02c LastContiguousPte : Ptr32 _MMPTE+0x030 ViewLinks : _LIST_ENTRY+0x038 VadsProcess: Ptr32 _EPROCESS+0x03c u3: <unnamed-tag>+0x044 u4: <unnamed-tag>
kd> dt _MMVAD_SHORT 876f4f50 -r1nt!_MMVAD_SHORT+0x000 u1: <unnamed-tag>+0x000 Balance: 0y00+0x000 Parent : 0x8757afc0 _MMVAD //有无父节点+0x004 LeftChild : (null) +0x008 RightChild : (null) //有无左子树与右子树+0x00c StartingVpn: 0xd0+0x010 EndingVpn : 0xd0//起始页与结束页+0x014 u: <unnamed-tag>//锁页+0x000 LongFlags : 0x98000001+0x000 VadFlags : _MMVAD_FLAGS+0x018 PushLock : _EX_PUSH_LOCK+0x000 Locked : 0y0+0x000 Waiting: 0y0+0x000 Waking : 0y0+0x000 MultipleShared : 0y0+0x000 Shared : 0y0000000000000000000000000000 (0)+0x000 Value : 0+0x000 Ptr : (null) +0x01c u5: <unnamed-tag>+0x000 LongFlags3 : 0+0x000 VadFlags3 : _MMVAD_FLAGS3kd> dt _MMVAD_FLAGS 876f4f50+14nt!_MMVAD_FLAGS+0x000 CommitCharge: 0y0000000000000000001 (0x1)+0x000 NoChange : 0y0//如果为1则不可改属性+0x000 VadType: 0y000//类型+0x000 MemCommit : 0y0+0x000 Protection : 0y11000 (0x18)//保护+0x000 Spare : 0y00+0x000 PrivateMemory : 0y1
修改保护模式
kd> ed 876f4f50+14 86000001kd> dt _MMVAD_FLAGS 876f4f50+14nt!_MMVAD_FLAGS+0x000 CommitCharge: 0y0000000000000000001 (0x1)+0x000 NoChange : 0y0+0x000 VadType: 0y000+0x000 MemCommit : 0y0+0x000 Protection : 0y00110 (0x6)+0x000 Spare : 0y00+0x000 PrivateMemory : 0y1
如果觉得《VAD 虚拟内存》对你有帮助,请点赞、收藏,并留下你的观点哦!