最近在学习调试,按照教程将虚拟地址转换成物理地址时出问题,首先描述调试环境,虚拟机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
。。。。。
感谢看完的人,更感谢好心人!!!
[培训]科锐逆向工程师培训第53期2025年7月8日开班!