关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Windows内核调试
关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
skyworth
2008-06-19, 23:26 下午
环境:
Windows Server 2003 ENT SP2
WinDBG 6.9.0003.113
附加到calc.exe的WinDBG输出:
0:003> x calc!gpszNum
01014dc4 calc!gpszNum =
0:003> dd calc!gpszNum l1
01014dc4 000b3980
0:003> dd 000b3980
000b3980 00320031 00340033 00360035 00380037
000b3990 002e0039 00000000 00040012 000801b2
000b39a0 000b3a30 000b39d0 000b39e4 00000000
000b39b0 00000000 00000000 00000000 00000000
000b39c0 00000000 00000000 00000000 00000000
000b39d0 004c0043 00460049 004f0046 00440052
000b39e0 00000000 00000401 05000000 00000015
000b39f0 6de3efe2 34d12ec7 ba79359f 00000000
0:003> .formats 000b3980
Evaluate expression:
Hex: 000b3980
Decimal: 735616
Octal: 00002634600
Binary: 00000000 00001011 00111001 10000000
Chars: ..9.
Time: Fri Jan 09 20:20:16 1970
Float: low 1.03082e-039 high 0
Double: 3.63443e-318
从上面可以得出结论:
输入缓冲区的线性地址为: 0x000b3980
页目录索引:0x0
页表索引:0xb3
页内偏移:0x980
Local Kernel Debug的WinDBG输出:
lkd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
................此处省略无关信息
PROCESS 88fb91a8 SessionId: 0 Cid: 07f4 Peb: 7ffde000 ParentCid: 0198
DirBase: 7fac7460 ObjectTable: e11e6e78 HandleCount: 63.
Image: calc.exe
................此处省略无关信息
可以看出页目录表的地址为
0x7fac7460
lkd> !dd 7fac7460
#7fac7460 52816801 00000000 52317801 00000000
#7fac7470 527d8801 00000000 527d9801 00000000
#7fac7480 5295e801 00000000 6399f801 00000000
#7fac7490 639e0801 00000000 524e1801 00000000
#7fac74a0 51b70801 00000000 52071801 00000000
#7fac74b0 51df2801 00000000 51bb3801 00000000
#7fac74c0 5023a801 00000000 5043b801 00000000
#7fac74d0 5043c801 00000000 502fd801 00000000
可以看出
页表基址为: 0x52816000
页表属性为 0100 0000 0001
继续观察页表:
lkd> !dd 52816000+b3*4
#528162cc 00000000 00000000 00000000 00000000
#528162dc 00000000 00000000 00000000 00000000
#528162ec 00000000 00000000 00000000 00000000
#528162fc 00000000 00000000 00000000 00000000
#5281630c 00000000 00000000 00000000 00000000
#5281631c 00000000 00000000 00000000 00000000
#5281632c 00000000 00000000 00000000 00000000
#5281633c 00000000 00000000 00000000 00000000
此时的输出为全零。
请问问题出在哪里呢??
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
skyworth
2008-06-19, 23:27 下午
另外,操作在Windows XP SP2上的输出完全正常。
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
王宇
2008-06-20, 08:55 上午
PD(E) / PT(E) 怎么会位于用户态地址空间呢?
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
小喂
2008-06-20, 09:34 上午
lkd> !dd 7fac7460
#7fac7460 52816801 00000000 52317801 00000000
#7fac7470 527d8801 00000000 527d9801 00000000
看起来好像启动 PAE 了,结构都不一样了吧!
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
skyworth
2008-06-20, 21:01 下午
嗯,我也纳闷,开始还以为是符号问题,可是我重新加载了符号的。
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
skyworth
2008-06-20, 21:02 下午
我检查过了的,并没有启动PAE
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
格蠹老雷
2008-06-20, 23:12 下午
这是因为内核的安全机制导致的,即所谓的PatchGuard技术的一部分。为了保护内核的核心数据被篡改,内核会对关键数据进行编码(加密),正常使用时会先解码再使用。每个进程的页目录基地址(DirBase)就在此列,也是被编码的。当系统切换线程需要将其加载到CR3寄存器前会解码。在上面的试验中,本地内核调试器取得的是没有解码的数据,所以不正确。
在《软件调试》的审稿过程中,就发现了类似的问题。因此在试验前我特意加上了在XP SP1或以调试选项启动的Vista系统上来做这个试验,因为当时页码以确定,没有加太多的说明。如果能在双机调试环境下做这个试验也可以。
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
小喂
2008-06-21, 17:09 下午
skyworth,你是怎么检查有没有启动 PAE 的?这个问题找到最终原因了吗?
PatchGuard 技术是 64 位系统上的东西吧,看 skyworth 贴的输出信息,应该是 32 位系统啊!
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
skyworth
2008-06-21, 19:18 下午
谢谢Raymond,这个理由可以很好的解释为什么Windows XP上正常,而Windows Server 2003下有异常情况的问题。我正在查找相关资料,看看Windows Server 2003下有没有类似的机制^_^,如果有该怎么样解决类似的问题。
呵呵,还是没有解决。
查过微软的文档,PAE需要在boot.ini中设置,默认并没有打开,而我检查了boot.ini,并没有相关的设置项存在。的确,PatchGuard好像是在Vista中明确提出来的,不过并不代表着Windows Server 2003中就一定没有。因为Windows 2003和Windows XP的内核的CodeBase不一样。
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
格蠹老雷
2008-06-21, 22:16 下午
解决的办法是以调试选项启动,这样的话PatchGuard机制就会被禁止。在Vista上面,如果没有以调试选项启动,那么本地内核调试根本不可用。在SP 2和打过patch的Server 2003上,安全机制被应用了,但是调试方面的更新没有完全跟上去。
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
skyworth
2008-06-22, 00:39 上午
我试试看。
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
小喂
2008-06-22, 14:47 下午
boot.ini 中没有设置 pae 不一定就不启动 pae,应该是显式设置了 nopae 才会不启动 pae。你可以用 sysinternals 的 procfeatures 工具看看当前系统是不是启动了 pae。
而且,你是不是尝试过了用 pae 相关结构转换地址确实没有成功?
没听说过 32 位系统上也有 PatchGuard 的,奇怪!呵呵
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
格蠹老雷
2008-06-25, 21:52 下午
WANGyu wrote:
PD(E) / PT(E) 怎么会位于用户态地址空间呢?
那是物理地址,非虚拟地址。
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
skyworth
2008-06-25, 22:52 下午
不好意思,最近比较忙,一直没时间上线。
谢谢 小喂 的提醒,我现在检查一下是否打开了PAE。
呵呵,我的机器才2G内存,不至于要打开PAE呀。
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
王宇
2008-06-26, 08:35 上午
张老师的书第二章还没来得及看,实验也没做...
我记得原来看 John H.Crawford 的《Programming the 80386》里面有这样的一个练习题:
请将线性地址 12345678h 转译为物理地址。
已知 CR3 中的值为8000h ; 00008120h地址中的值为00010021h ; 00010D14地址中的值为54321021h
答案是:54321678h
总页数 1 第 2 页 [共有 30 条记录]
1
2
>