我在《软件调试》这本书上看到了用windbg观察虚拟地址与物理地址的转换。网上也有类似的文章(http://www.cnblogs.com/Winston/archive/2009/04/12/1434225.html)。我于是做同样的实验:
首先在计算器中输入123456,然后打开windbg并且附加到计算器进程,接着:
0:002> dd calc!gpszNum
01014db0 000b7c30 00000000 00000001 00000000
01014dc0 00000000 ffffffff 00000000 00000000
看到123456存储在000b7c30中,输入:
0:002> du 000b7c30
000b7c30 "123456."
可以看到这个地址是正确的,下面看下这个地址的二进制:
0:002> .formats 000b7c30
Evaluate expression:
Hex: 000b7c30
Decimal: 752688
Octal: 00002676060
Binary: 00000000 00001011 01111100 00110000
Chars: ..|0
Time: Sat Jan 10 01:04:48 1970
Float: low 1.05474e-039 high 0
Double: 3.71877e-318
这个地址的二进制看到了,接下来打开另一个windbg,启动本地内核模式,输入lkd> !process 0 0
PROCESS 87b16408 SessionId: 0 Cid: 0fac Peb: 7ffdb000 ParentCid: 05e4
DirBase: 0a5c0640 ObjectTable: e369e6f8 HandleCount: 110.
Image: TXPlatform.exe
PROCESS 87a83b88 SessionId: 0 Cid: 01f0 Peb: 7ffd7000 ParentCid: 0a0c
DirBase: 0a5c0340 ObjectTable: e389d858 HandleCount: 568.
Image: Maxthon.exe
PROCESS 89a905d8 SessionId: 0 Cid: 0134 Peb: 7ffd6000 ParentCid: 0a0c
DirBase: 0a5c0540 ObjectTable: e39bc0a0 HandleCount: 109.
Image: calc.exe
PROCESS 87f12030 SessionId: 0 Cid: 09ec Peb: 7ffdf000 ParentCid: 0a0c
DirBase: 0a5c0660 ObjectTable: e38d2d90 HandleCount: 173.
Image: windbg.exe
PROCESS 87c4c030 SessionId: 0 Cid: 029c Peb: 7ffd9000 ParentCid: 0a0c
DirBase: 0a5c0620 ObjectTable: e524b818 HandleCount: 131.
Image: windbg.exe
从这儿开始我就有疑问了,为什么所有的进程的dirbase都是以0a5c0开头?接着查看计算器进程首地址:
lkd> !dd 0a5c0540
# a5c0540 2371d801 00000000 22c1e801 00000000
# a5c0550 23f9f801 00000000 26c1c801 00000000
# a5c0560 5b1d1801 00000000 5b212801 00000000
跟据上面的二进制码可以得知也表基地址为2371d000,然后:
lkd> !dd 2371d000+B7*4
#2371d2dc 00000000 00000000 00000000 00000000
#2371d2ec 00000000 00000000 00000000 00000000
#2371d2fc 00000000 00000000 00000000 00000000
#2371d30c 00000000 00000000 00000000 00000000
竟然全是0.
不知道这是为什么,请高手帮忙解答一下
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课