windows内存映射实例

本文详细解析了从逻辑地址到物理地址的转换过程,并通过Windbg工具演示了具体实例,展示了如何通过寄存器信息、页表等进行内存寻址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存要通过逻辑地址->线性地址->物理地址
现在我们看一下实例
以下面这段程序为例子

int _tmain(int argc, _TCHAR* argv[])  
{  
    int t=1234;  
    printf("%p",&t);  
    system("pause");  
    return 0;  
} 

我们查看运行结果是什么
这里写图片描述

可以看到我们的地址是0x0012FF60

现在转到windbg中查看

查看当进程信息

PROCESS 864ef020 SessionId: 0 Cid: 025c Peb: 7ffde000 ParentCid: 0238
DirBase: 0f5c03e0 ObjectTable: e1b63248 HandleCount: 15.
Image: HelloWorld1.exe
.process 864ef020 进入当前进程空间

r查看寄存器信息

kd> r
eax=00000001 ebx=00000000 ecx=80000003 edx=000000b7 esi=000000b7 edi=7c94fb5c
eip=7c92121a esp=0012dc50 ebp=0012dee8 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
001b:7c92121a cc int 3

由于我们的变量是存在栈中所以我们关注ss

ss是选择子35=32+3
0x23=100 (具体的第几项) 0(代表在GDT中)11(RPL代表rin3 00代表ring0) b
100b为4 在GDT中的第4项

8003f010 0000ffff 00cf9300 0000ffff 00cffb00
8003f020 0000ffff 00cff300 200020ab 80008b04
8003f030 f0000001 ffc093df f0000fff 7f40f3fd

这个时候上图解决问题
这里写图片描述

这里写图片描述

这里写图片描述

对照着我们的也可以发现我们的基地址是0000所以说我们的逻辑地址就是线性地址了

这个时候再上一张图片
这里写图片描述
将我们的地址转换为二进制可以得到 ps这是PAE扩展的 非PAE扩展大同小异
00 0000 0000 0 1001 0111 1 111 1011 0000 0

线性地址31~30,用来指向一个PDPT的entry
线性地址29~21,用来指向一个pmd的entry
线性地址20~12,用来指向一个pte
线性地址11~0,为4KB页中的offset

我们的dirBase就是将会载入到我们的cr3寄存器中

因为31~30为0所以直接读cr3地址

kd> !dd 0f5c03e0
# f5c03e0 35d97001 00000000 35e58001 00000000
# f5c03f0 35d59001 00000000 35c56001 00000000
# f5c0400 3601d001 00000000 35fde001 00000000
# f5c0410 3605f001 00000000 3619c001 00000000

其中35d97001就是我们需要的 清除后三位得到 35d97000

接着计算第二步因为21-29为0所以直接访问地址

kd> !dd 35d97000
#35d97000 35d16067 00000000 35ee6067 00000000
#35d97010 35c54067 00000000 00000000 00000000
#35d97020 00000000 00000000 00000000 00000000

第三步
还是需要清除35d16067的后三位 35d16000
35d16000+(12~20位中的值)12F*8=35d16978

kd> !dd 35d16978
#35d16978 35fdf067 00000000 14ae0025 00000000
#35d16988 14b61025 00000000 00000000 00000000

最后
得到35fdf067清除后三位35fdf000
这次直接加上最后的偏移就得到地址
35fdf000+(12~20)111 1011 0000 0 得到35fdfF60

kd> !dd 35fdfF60
#35fdff60 000004d2 cccccccc 0012ffb8 0041198f
#35fdff70 00000001 00394500 00395838 de4d1fe8
#35fdff80 22130936 01d20a7b 7ffde000 00369e99

注意了我们的0x4d2=1234

有些细节性的东西直接掠过了,我希望的是大家通过这次能够手动得到内存,要想知道那些细节性的东西大家多看书吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值