Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: skyworth   发起时间: 2008-06-19 23:26 下午   回复: 29

Print Search
帖子排序:    
   2008-06-19, 23:26 下午
skyworth 离线,最后访问时间: 2009/12/15 16:03:09 skyworth

发帖数前25位
注册: 2008-06-07
发 贴: 55
Huh? [:^)] 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
环境:
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
此时的输出为全零。

请问问题出在哪里呢??


IP 地址: 已记录   报告
   2008-06-19, 23:27 下午
skyworth 离线,最后访问时间: 2009/12/15 16:03:09 skyworth

发帖数前25位
注册: 2008-06-07
发 贴: 55
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
另外,操作在Windows XP SP2上的输出完全正常。
IP 地址: 已记录   报告
   2008-06-20, 08:55 上午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
PD(E) / PT(E) 怎么会位于用户态地址空间呢?
IP 地址: 已记录   报告
   2008-06-20, 09:34 上午
xiaowei 离线,最后访问时间: 2010/12/28 1:17:57 小喂

发帖数前100位
注册: 2008-04-05
发 贴: 12
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
lkd> !dd 7fac7460
#7fac7460 52816801 00000000 52317801 00000000
#7fac7470 527d8801 00000000 527d9801 00000000

看起来好像启动 PAE 了,结构都不一样了吧!
IP 地址: 已记录   报告
   2008-06-20, 21:01 下午
skyworth 离线,最后访问时间: 2009/12/15 16:03:09 skyworth

发帖数前25位
注册: 2008-06-07
发 贴: 55
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
嗯,我也纳闷,开始还以为是符号问题,可是我重新加载了符号的。
IP 地址: 已记录   报告
   2008-06-20, 21:02 下午
skyworth 离线,最后访问时间: 2009/12/15 16:03:09 skyworth

发帖数前25位
注册: 2008-06-07
发 贴: 55
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
我检查过了的,并没有启动PAE
IP 地址: 已记录   报告
   2008-06-20, 23:12 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
这是因为内核的安全机制导致的,即所谓的PatchGuard技术的一部分。为了保护内核的核心数据被篡改,内核会对关键数据进行编码(加密),正常使用时会先解码再使用。每个进程的页目录基地址(DirBase)就在此列,也是被编码的。当系统切换线程需要将其加载到CR3寄存器前会解码。在上面的试验中,本地内核调试器取得的是没有解码的数据,所以不正确。
在《软件调试》的审稿过程中,就发现了类似的问题。因此在试验前我特意加上了在XP SP1或以调试选项启动的Vista系统上来做这个试验,因为当时页码以确定,没有加太多的说明。如果能在双机调试环境下做这个试验也可以。
IP 地址: 已记录   报告
   2008-06-21, 17:09 下午
xiaowei 离线,最后访问时间: 2010/12/28 1:17:57 小喂

发帖数前100位
注册: 2008-04-05
发 贴: 12
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
skyworth,你是怎么检查有没有启动 PAE 的?这个问题找到最终原因了吗?

PatchGuard 技术是 64 位系统上的东西吧,看 skyworth 贴的输出信息,应该是 32 位系统啊!

IP 地址: 已记录   报告
   2008-06-21, 19:18 下午
skyworth 离线,最后访问时间: 2009/12/15 16:03:09 skyworth

发帖数前25位
注册: 2008-06-07
发 贴: 55
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
谢谢Raymond,这个理由可以很好的解释为什么Windows XP上正常,而Windows Server 2003下有异常情况的问题。我正在查找相关资料,看看Windows Server 2003下有没有类似的机制^_^,如果有该怎么样解决类似的问题。

呵呵,还是没有解决。
查过微软的文档,PAE需要在boot.ini中设置,默认并没有打开,而我检查了boot.ini,并没有相关的设置项存在。的确,PatchGuard好像是在Vista中明确提出来的,不过并不代表着Windows Server 2003中就一定没有。因为Windows 2003和Windows XP的内核的CodeBase不一样。
IP 地址: 已记录   报告
   2008-06-21, 22:16 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
解决的办法是以调试选项启动,这样的话PatchGuard机制就会被禁止。在Vista上面,如果没有以调试选项启动,那么本地内核调试根本不可用。在SP 2和打过patch的Server 2003上,安全机制被应用了,但是调试方面的更新没有完全跟上去。

IP 地址: 已记录   报告
   2008-06-22, 00:39 上午
skyworth 离线,最后访问时间: 2009/12/15 16:03:09 skyworth

发帖数前25位
注册: 2008-06-07
发 贴: 55
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
我试试看。
IP 地址: 已记录   报告
   2008-06-22, 14:47 下午
xiaowei 离线,最后访问时间: 2010/12/28 1:17:57 小喂

发帖数前100位
注册: 2008-04-05
发 贴: 12
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
boot.ini 中没有设置 pae 不一定就不启动 pae,应该是显式设置了 nopae 才会不启动 pae。你可以用 sysinternals 的 procfeatures 工具看看当前系统是不是启动了 pae。

而且,你是不是尝试过了用 pae 相关结构转换地址确实没有成功?

没听说过 32 位系统上也有 PatchGuard 的,奇怪!呵呵

IP 地址: 已记录   报告
   2008-06-25, 21:52 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote

 WANGyu wrote:
PD(E) / PT(E) 怎么会位于用户态地址空间呢?

那是物理地址,非虚拟地址。

 


IP 地址: 已记录   报告
   2008-06-25, 22:52 下午
skyworth 离线,最后访问时间: 2009/12/15 16:03:09 skyworth

发帖数前25位
注册: 2008-06-07
发 贴: 55
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
不好意思,最近比较忙,一直没时间上线。

谢谢 小喂 的提醒,我现在检查一下是否打开了PAE。
呵呵,我的机器才2G内存,不至于要打开PAE呀。
IP 地址: 已记录   报告
   2008-06-26, 08:35 上午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。
Reply Quote
张老师的书第二章还没来得及看,实验也没做...

我记得原来看 John H.Crawford 的《Programming the 80386》里面有这样的一个练习题:

请将线性地址 12345678h 转译为物理地址。
已知 CR3 中的值为8000h ; 00008120h地址中的值为00010021h ; 00010D14地址中的值为54321021h

答案是:54321678h
IP 地址: 已记录   报告
  总页数 1 第 2 页 [共有 30 条记录] 1 2 >
高端调试 » 软件调试 » Windows内核调试 » Re: 关于 《软件调试》 2.7.5 使用WinDBG观察分页机制。

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.