1 打开windbg. 用windbg打开notepad.exe, g
2 随便输入几个字符。 例如 952795279527
3 搜索记事本里面的字符串, 可知输入的字符在记事本的虚拟地址是 000a93f0
4 再打开一个 windbg, 选择本地调试 clrl+k , 确定,输入 !process 0 0 notepad.exe
得到notepad的DirBase, 也就是CR3寄存器
lkd> !process 0 0 notepad.exe
PROCESS 88c6d020 SessionId: 0 Cid: 0b54 Peb: 7ffdf000 ParentCid: 1d58
DirBase: 0b902b80 ObjectTable: eb072c08 HandleCount: 47.
Image: notepad.exe
cr4的第5位标示是否开启PAE, 可以用livekd查看cr4寄存器
lkd> .formats 000a93f0
Evaluate expression:
Hex: 000a93f0
Decimal: 693232
Octal: 00002511760
Binary: 00000000 00001010 10010011 11110000
Chars: ....
Time: Fri Jan 09 08:33:52 1970
Float: low 9.71425e-040 high 0
Double: 3.42502e-318
我的电脑开启了pae。 根据上图intel指令手册32位地址分为 2 9 9 12
2 9 9 12
00 000000 000 01010 1001 0011 11110000
对应的16进制
0 0 A9 3f0
lkd> !dd 0b902b80
# b902b80 8dcf9801 00000000 ddaba801 00000000
# b902b90 7727b801 00000000 9dcb8801 00000000
# b902ba0 b32ae801 00000000 adfaf801 00000000
# b902bb0 97fb0801 00000000 3dbed801 00000000
# b902bc0 7a9e2801 00000000 3e963801 00000000
# b902bd0 67324801 00000000 1b321801 00000000
# b902be0 d5df8801 00000000 7ee79801 00000000
# b902bf0 63d3a801 00000000 ab077801 00000000
lkd> !dd 8dcf9000
#8dcf9000 81ed8867 00000000 56871867 00000000
#8dcf9010 89bce867 00000000 d37bf867 00000000
#8dcf9020 83d72867 00000000 339c5867 00000000
#8dcf9030 00000000 00000000 00000000 00000000
lkd> !dd 81ed8000+a9*8
#81ed8548 8e1ba867 80000000 c583e867 80000000
#81ed8558 7e643867 80000000 b9f84867 80000000
#81ed8568 89d05867 80000000 1c2c6867 80000000
#81ed8578 87987867 80000000 10688867 80000000
lkd> !dd 8e1ba000+3f0
#8e1ba3f0 00350039 00370032 00350039 00370032
#8e1ba400 00350039 00370032 00000000 00000000
#8e1ba410 00000000 00000000 00000000 00000000
#8e1ba420 00000000 00000000 00000000 00000000
lkd> !du 8e1ba3f0
#8e1ba3f0 "952795279527"
得知地址内存8e1ba3f0 对应notepad虚拟内存000a93f0
注意显示物理内存的!dd, 并且取到的 目录项要去掉低 12的标志位
文章示例的是开启PAE,页面大小是4k的情况,其他的分页方式命令有所不同
具体看intel指令手册 3a的介绍