内存要通过逻辑地址->线性地址->物理地址
现在我们看一下实例
以下面这段程序为例子
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
有些细节性的东西直接掠过了,我希望的是大家通过这次能够手动得到内存,要想知道那些细节性的东西大家多看书吧。