首页
社区
课程
招聘
[求助]手动将虚拟地址转换成物理地址
发表于: 2014-3-27 14:18 5649

[求助]手动将虚拟地址转换成物理地址

2014-3-27 14:18
5649
最近在学习调试,按照教程将虚拟地址转换成物理地址时出问题,首先描述调试环境,虚拟机xp sp3 vol 32位,只安装windbg。问题描述:
打开计算器,输入123456,然后用windbg附加进程,输入:
0:002> dd calc!gpszNum l1
01014db0  000b4ff0
0:002> dd 000b4ff0
000b4ff0  00320031 00340033 00360035 0000002e
000b5000  00030600 000810d3 000a0178 000b2f58
000b5010  28c7f1d0 11d2de25 1000ddaf b599275a
000b5020  0000000a 00000001 00000000 00000380
000b5030  00000544 0000000b 00043bfc 00043bfc
000b5040  00000000 00000048 00000058 00000060
000b5050  00000510 00800002 00000001 000d016d
000b5060  00000001 00000008 00000008 64050548
0:002> du 000b4ff0
000b4ff0  "123456."
000b4ff0就是存我们输入的,问题就是讲000b4ff0转换成物理地址。
再打开一个windbg内核本地调试,输入:
lkd> !process 0 0 calc.exe
PROCESS 8203fda0  SessionId: 0  Cid: 0544    Peb: 7ffda000  ParentCid: 05c4
    DirBase: 08e38280  ObjectTable: e104b360  HandleCount:  47.
    Image: calc.exe

lkd> !dd 08e38280  
# 8e38280 185b3001 00000000 1853c001 00000000
# 8e38290 18565001 00000000 18642001 00000000
# 8e382a0 159c6001 00000000 15a57001 00000000
# 8e382b0 15b88001 00000000 159e5001 00000000
# 8e382c0 18bbb001 00000000 18b44001 00000000
# 8e382d0 18b55001 00000000 18c22001 00000000
# 8e382e0 f8d47300 00000000 00000000 00000000
# 8e382f0 00000000 00000000 00000000 00000000
上面的000b4ff0是虚拟地址,前10位为0000 0000 00,中间十位为001011 0100,就是b4,后12就是ff0。08e38280  是页目录基址,000b4ff0的偏移是0,就是第一个185b3001 ,前20位为基址,后12位为标志,所以页表就是185b3000+b4*4,查看如下:
lkd> !dd 185b3000+b4*4
#185b32d0 00000000 00000000 00000000 00000000
#185b32e0 00000000 00000000 00000000 00000000
#185b32f0 00000000 00000000 00000000 00000000
#185b3300 00000000 00000000 00000000 00000000
#185b3310 00000000 00000000 00000000 00000000
#185b3320 00000000 00000000 00000000 00000000
#185b3330 00000000 00000000 00000000 00000000
#185b3340 00000000 00000000 00000000 00000000
就这,为什么都是0,这是第一个问题???哪出错了???如果再按此计算那物理地址就是0+ff0*4,显示就是:
lkd> !dd ff0*4
#    3fc0 00000000 00000000 00000000 00000000
#    3fd0 00000000 00000000 00000000 00000000
#    3fe0 00000000 00000000 00000000 00000000
#    3ff0 00000000 00000000 00000000 00000000
#    4000 00000000 00000000 00000000 00000000
#    4010 00000000 00000000 00000000 00000000
#    4020 00000000 00000000 00000000 00000000
#    4030 00000000 00000000 00000000 00000000
这是第二个问题,都是0,现在测试ff0比较大,有时候比较小的时候这一步都不能显示值,也就是读取出错,我想第一个问题解决了,这个也就不是问题。
刚开始学,网上搜的都是成功的例子,我就出错,还望各位不啬赐教。有点长,也就是怕描述不清。
还说一点想法, !dd 08e38280  这里的时候应该没错吧,显示的是
lkd> !dd 08e38280  
# 8e38280 185b3001 00000000 1853c001 00000000
# 8e38290 18565001 00000000 18642001 00000000
# 8e382a0 159c6001 00000000 15a57001 00000000
# 8e382b0 15b88001 00000000 159e5001 00000000
# 8e382c0 18bbb001 00000000 18b44001 00000000
# 8e382d0 18b55001 00000000 18c22001 00000000
# 8e382e0 f8d47300 00000000 00000000 00000000
# 8e382f0 00000000 00000000 00000000 00000000
觉得显示的好奇怪,隔一个为0,之后全为0应该是结束了,难道不是连续的么???这个看起来好像64位,但是我装的是32位的xp,主机是win7 64,这应该没影响吧。。。还是我多想了???
lkd> version
Windows XP Kernel Version 2600 (Service Pack 3) UP Free x86 compatible
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 2600.xpsp.080413-2111
。。。。。
感谢看完的人,更感谢好心人!!!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
我没完全看懂,但你好像没有切换进程空间。
2014-3-27 14:36
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了啊,楼主。。。。。。。。。。。。。
2014-3-27 15:14
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你要先进入进程的空间中,还有你要查看你的机器是否打开PAE之类的机制。你页目录表的基址是在CR3寄存器中取的吧。你加载进你要查看的进程空间后,这个寄存器的值会改变,即所谓的加载上下文环境
2014-3-27 15:36
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可以使用!pte命令辅助学习
2014-3-27 15:40
0
雪    币: 52
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
按照你的提示,我测试,并且恶补知识,现在问题解决,如下:
你说的很对,机器打开PAE了,虽然我知道PAE,但是自以为PAE默认是关闭的,于是没有考虑是否开启,没想到开机启动选项是/noexecute=optin,以前都不知道这个选项是干嘛的,现在才知道这个是开启数据执行保护 (DEP) 和物理地址扩展 (PAE)。
(DEP和PAE介绍bdfK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8W2j5$3S2F1k6i4c8Q4x3X3g2E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6*7K9q4)9J5k6r3y4F1i4K6u0r3k6X3j5#2y4o6t1J5y4K6g2Q4c8e0N6Q4z5e0g2Q4z5e0W2Q4c8e0c8Q4b7V1c8Q4z5f1y4Q4c8e0c8Q4b7V1u0Q4b7e0g2Q4c8e0g2Q4z5e0m8Q4z5p5g2Q4c8e0g2Q4z5p5k6Q4z5o6u0Q4c8e0S2Q4z5o6m8Q4z5o6y4Q4c8f1k6Q4b7V1y4Q4z5o6V1`.
所有问题源于此,顺便说一下,不需要进入进程空间,因为我是通过!process来获得DirBase,这就是页目录的物理地址。为了准确性我也测试了的,本人太菜,只能事实说话。。。
非常感谢你,也感谢那些帮助的人。
2014-3-27 19:17
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
!process是获得的eprocess结构把?
2014-3-27 21:50
0
雪    币: 52
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
也会获得eprocess结构
2014-3-28 09:30
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
忘记你是直接获取的DirBase了,我还以为你是从最初的CR3寄存器的页目录指针表地址开始的。。。
2014-3-28 09:52
0
游客
登录 | 注册 方可回帖
返回