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 _MMVAD
nt!_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 _EPROCESS
kd> dt _MMVAD_SHORT
nt!_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_LONG
nt!_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 -r1
nt!_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_FLAGS3
kd> dt _MMVAD_FLAGS 876f4f50+14
nt!_MMVAD_FLAGS
+0x000 CommitCharge : 0y0000000000000000001 (0x1)
+0x000 NoChange : 0y0
+0x000 VadType : 0y000
+0x000 MemCommit : 0y0
+0x000 Protection : 0y11000 (0x18)
+0x000 Spare : 0y00
+0x000 PrivateMemory : 0y1
修改保护模式
kd> ed 876f4f50+14 86000001
kd> dt _MMVAD_FLAGS 876f4f50+14
nt!_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
|