0- 打开虚拟机与Windbg双机调试环境
1- 虚拟机器关闭PAE(物理地址扩展)
2- 在虚拟机中点击开始-运行 notepad.exe 记事本
3- 在记事本中输入:StartSupper
4- 切换至Windbg,Ctrl+Break 中断虚拟机
5- 命令行输入 !process 0 0 notepad.exe 查看进程信息,如果显示错误,则需要设置符号路径
kd> !process 0 0 notepad.exe
PROCESS 85c0dd40 SessionId: 1 Cid: 0a98 Peb: 7ffda000 ParentCid: 0550
DirBase: 3cf32000 ObjectTable: 9fa8aa98 HandleCount: 56.
Image: notepad.exe
6- 命令行输入 .process 85c0dd40 切换进程
kd> .process 85c0dd40
Implicit process is now 85c0dd40
WARNING: .cache forcedecodeuser is not enabled
7- 命令行输入s -u 0x0 L0x1000000 "StartSupper" 在内存地址范围内搜索 Togd666
kd> s -u 0x0 L0x1000000 "StartSupper"
0019dde0 0053 0074 0061 0072 0074 0053 0075 0070 S.t.a.r.t.S.u.p.
001a2f38 0053 0074 0061 0072 0074 0053 0075 0070 S.t.a.r.t.S.u.p.
8- 命令行输入 du 0019dde0 查看宽字符串
kd> du 0019dde0
0019dde0 "StartSupper"
9- .formats 命令在当前线程和进程上下文下对一个表达式或符号进行求值,并以多种数字格式显示出来。
kd> .formats 0019dde0
Evaluate expression:
Hex: 0019dde0
Decimal: 1695200
Octal: 00006356740
Binary: 00000000 00011001 11011101 11100000
Chars: ....
Time: Tue Jan 20 22:53:20 1970
Float: low 2.37548e-039 high 0
Double: 8.3754e-318
10- 虚拟地址0019dde0 二进制的头10位是页目录索引,中10位页表索引,后12位是字节索引
11- 页目录基地+页目录索引*4个字节(因为是指针) 得到页表基址
kd> !dd 3cf32000 +0x00*4
#3cf32000 2ccf3867 255b2867 00000000 00000000
#3cf32010 17c53867 28894867 24fef867 0df89867
12- 页表基址 + 页表索引(19d)*4 = 页
kd> !dd 2ccf3000+19d*4
#2ccf3674 0006b867 0e04d867 25128867 01fa9867
#2ccf3684 0202a867 2532b867 2526d867 2502c867
------------------------------
//13- 页 + 字节索引 = 得到字符串的物理地理
kd> !du 0006b000 + de0
# 6bde0 "StartSupper"
------------------------------
总结:
1- 学习本章主要目的,理解分页机制
2- 如果第一步没有关闭PAE,得到的物理地址可能是一堆问号(?????)
3- 重点:这算法就像一本书,目录->页->字 (第14章->第362页-第100个字)