首页
社区
课程
招聘
[求助]本人初学习windbg,在手动将虚拟内存地址转换成物理地址时失败遇到疑惑,请求解答.
发表于: 2011-11-17 11:39 11169

[求助]本人初学习windbg,在手动将虚拟内存地址转换成物理地址时失败遇到疑惑,请求解答.

2011-11-17 11:39
11169
以下是我的操作过程。

操作平台为 winxp sp2系统以及系统自带notepad.exe.

以/Debug (带调试的参数)的winxp系统启动。运行notepad.exe 然后输入字串"Aabzz", 我的本意是通过启动一个windbg附加上
这个notepad.exe,然后内存中搜索字串"Aabzz"找到后,把其内存虚拟地址转换成物理地址。

过程应该是先从虚拟地址通过分段机制转换成线性地址,在从线性地址通过分页机制转换成最终的物理地址。

开始:
启动一个windbg并附加上notepad.exe,附加中断后,使用命令 "s -u 00000000 L08000000 "Aabzz" "全用户内存搜索unicode字串,如下所示
0:001> s -u 00000000 L08000000 "Aabzz"
000aabd0  0041 0061 0062 007a 007a 0000 0000 0000  A.a.b.z.z.......

也就是其虚拟地址为aabd0, 通过如下命令得到线性地址.

0:001> r
eax=7ffdc000 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005
eip=7c921230 esp=00a6ffcc ebp=00a6fff4 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
7c921230 cc              int     3
0:001> dg 1b
                                  P Si Gr Pr Lo
Sel    Base     Limit     Type    l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
001B 00000000 ffffffff Code RE Ac 3 Bg Pg P  Nl 00000cfb
0:001> dg 23
                                  P Si Gr Pr Lo
Sel    Base     Limit     Type    l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
0023 00000000 ffffffff Data RW Ac 3 Bg Pg P  Nl 00000cf3

可以得知代码段和数据段基地址为0 范围为0xffffffff, 也就是同分段机制没有启用一样,虚拟地址也就是线性地址。

下面就是将线性地址到物理地址的转换了,也就是分页机制。

再打开一个windbg并且以本地内核模式运行,启动成功后,执行命令
lkd> !process 0 0 notepad.exe
PROCESS 891a79e0  SessionId: 0  Cid: 0934    Peb: 7ffdc000  ParentCid: 0130
    DirBase: 0a1802a0  ObjectTable: e28018a8  HandleCount:  42.
    Image: notepad.exe

然后使用命令切换领空到notepad.exe:
lkd> .process /p 891a79e0
Implicit process is now 891a79e0
lkd> d aabd0
000aabd0  41 00 61 00 62 00 7a 00-7a 00 00 00 00 00 00 00  A.a.b.z.z.......
000aabe0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
000aabf0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

通过上面的显示,得到页目录的物理地址为 DirBase: 0a1802a0.
将线性地址分解为:

lkd> .formats aabd0
Evaluate expression:
  Hex:     000aabd0
  Decimal: 699344
  Octal:   00002525720
  Binary:  00000000 00001010 10101011 11010000
  Chars:   ....
  Time:    Fri Jan 09 10:15:44 1970
  Float:   low 9.7999e-040 high 0
  Double:  3.45522e-318
二进制数为节后 10 10 12:

0000000000 0010101010 101111010000
0           aa         bd0

打开页目录:
lkd> !dd 0a1802a0  
# a1802a0 44550801 00000000 44691801 00000000
# a1802b0 44452801 00000000 4470f801 00000000
# a1802c0 38ae1801 00000000 38ae2801 00000000
# a1802d0 38b63801 00000000 38aa0801 00000000
# a1802e0 54c29801 00000000 566ea801 00000000
# a1802f0 56b6b801 00000000 55768801 00000000
# a180300 3e4c4801 00000000 3e485801 00000000
# a180310 3e286801 00000000 3e4c3801 00000000

继续打开页表
lkd> !dd 44550000+0aa*4
#445502a8 00000000 00000000 00000000 00000000
#445502b8 00000000 00000000 00000000 00000000
#445502c8 00000000 00000000 00000000 00000000
#445502d8 00000000 00000000 00000000 00000000
#445502e8 00000000 00000000 00000000 00000000
#445502f8 00000000 00000000 00000000 00000000
#44550308 00000000 00000000 00000000 00000000
#44550318 00000000 00000000 00000000 00000000

问题出来了 页表的0AA个项居然是00000000,这让我情何以堪阿, 按照运算方法,难道0+bd0就是最终的物理地址??????

lkd> !dd bd0
Physical memory read at bd0 failed
If you know the caching attributes used for the memory,
try specifying [c], [uc] or [wc], as in !dd [c] <params>.
WARNING: Incorrect use of these flags will cause unpredictable
processor corruption.  This may immediately (or at any time in
the future until reboot) result in a system hang, incorrect data
being displayed or other strange crashes and corruption.

搜索发现一个扩展命令!vtop可以实现虚拟地址到物理地址的转换,于是在内核模式下的windbg中运行这个命令显示如下:
lkd> !vtop 0a1802a0  aabd0
X86VtoP: Virt 000aabd0, pagedir a1802a0
X86VtoP: PAE PDPE a1802a0 - 0000000044550801
X86VtoP: PAE PDE 44550000 - 0000000045182867
X86VtoP: PAE PTE 45182550 - 800000004498e867
X86VtoP: PAE Mapped phys 4498ebd0
Virtual address aabd0 translates to physical address 4498ebd0.

这是怎么回事呢? 有点迷惑了 难道哪里操作错了?!vtop显示的PAE PTE 45182550从哪里来的?
为了便于看者定位问题将44550000处的内容显示如下:
lkd> !dd 44550000
#44550000 45182867 00000000 44f5f867 00000000
#44550010 44fb5867 00000000 5b744867 00000000
#44550020 44e88867 00000000 45301867 00000000
#44550030 00000000 00000000 00000000 00000000
#44550040 44e75867 00000000 00000000 00000000
#44550050 00000000 00000000 00000000 00000000
#44550060 00000000 00000000 00000000 00000000
#44550070 00000000 00000000 00000000 00000000

以上的操作我在2台机子上作过测试结果都是类似的这样的情况。

请发现问题所在的朋友给予解答?????????????????????????? 谢谢!!

另外还发现一个疑惑的问题就是如下所示:
lkd> .process /p 891a79e0
Implicit process is now 891a79e0
lkd> .process
Implicit process is now 8921dbd0

首先我切换了一下领空到 891a79e0 但是马上使用.process命令来确认是否切换领空成功,但是现实的结果却不是
我要切换的进程的EProcess. 这是怎么回事啊 还是我使用上面有错误?

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 564
活跃值: (42)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
2
开启pae和没开启pae的是不一样的
2011-11-17 13:14
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢回复!你回答的是那个问题呢? 前一个虚拟内存转换还是后面的.process? 我刚接触windbg还不是很熟悉!
2011-11-17 15:35
0
雪    币: 304
活跃值: (507)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
http://bbs.pediy.com/archive/index.php?t-67820.html
2011-11-18 10:59
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢 楼上朋友的回复!确实是这个问题.现在已经可以了! 多谢!

还有就是第二个问题 目前还没有解决:

另外还发现一个疑惑的问题就是如下所示:
lkd> .process /p 891a79e0
Implicit process is now 891a79e0
lkd> .process
Implicit process is now 8921dbd0

首先我切换了一下领空到 891a79e0 但是马上使用.process命令来确认是否切换领空成功,但是现实的结果却不是
我要切换的进程的EProcess. 这是怎么回事啊 还是我使用上面有错误?
2011-12-8 20:34
0
雪    币: 37
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我也有这个问题,求解答。
2012-9-12 19:03
0
雪    币: 6956
活跃值: (1522)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
7
4: 使用非侵入式的切换进程空间

            .process /i /p Eprocess 地址
2012-9-26 14:52
0
雪    币: 122
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
初学都这么牛X,厉害。膜拜一下,坐下观赏。
2012-9-26 16:09
0
雪    币: 2120
活跃值: (73)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
.process不是用来确认是否切换成功
If you omit Process or specify zero, the process context is reset to the default process for the current system state.
8921dbd0应该是你的system的EPROCESS
2012-9-27 08:52
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码