#1 代码
1 #include <windows.h>
2 #include <stdio.h>
3
4 int main(){
5 int * p = (int *)VirtualAlloc(NULL, 256*4096, MEM_RESERVE, PAGE_NOACCESS);
6 printf("p == %p", p);
7
8 int *q = (int *)VirtualAlloc(p, 4*4096, MEM_COMMIT, PAGE_READWRITE);
9 for (int t=0; t<4096; t++){
10 q[t] = t;
11 printf("%8d", q[t]);
12 }
13
14 getchar();
15 return 0;
16 }
2 #include <stdio.h>
3
4 int main(){
5 int * p = (int *)VirtualAlloc(NULL, 256*4096, MEM_RESERVE, PAGE_NOACCESS);
6 printf("p == %p", p);
7
8 int *q = (int *)VirtualAlloc(p, 4*4096, MEM_COMMIT, PAGE_READWRITE);
9 for (int t=0; t<4096; t++){
10 q[t] = t;
11 printf("%8d", q[t]);
12 }
13
14 getchar();
15 return 0;
16 }
目的很简单,向系统保留256个页面,再提交最开始的4个页面,提交的四个页面全部写入数据。
#2 Windbg登场,!address 查看区域存储信息
bp `source.cpp:8`
bp `source.cpp:9`
接下来开始 g;x
!address @@c++(p) 查看 0x00330000 起始区域的存储信息。
MASM表达式中, 任何符号的数值就是它的内存地址。
C++表达式中, 任何符号都根据类型来解释。
更多请查询windbg帮助档中“Evaluating Expressions”一节。
!address p 的结果相当于 !address 0013fcb0
#3 用dt查看数组
c --- compact
a --- 按数组对待
64 ---- 输出64个元素
int ---- 数据类型
@@c++(q)