[课上练习]手工将虚拟地址转换为物理地址
2016-01-06 14:45
405 查看
环境设置:
关闭PAE(物理地址扩展)
bcdedit /set PAE forcedisable
bcdedit /set nx AlwaysOff
开启双机调试,在虚拟机中新建一个记事本,并输入“cyxvc”,然后断下来
在WinDBGM中输入:
0: kd> !process 0 0 notepad.exe
PROCESS 8816f3d8 SessionId: 1 Cid: 0960 Peb: 7ffd4000 ParentCid: 0630
DirBase: 38200000 ObjectTable: 8bfbc410 HandleCount: 63.
Image: notepad.exe
0: kd> .process 8816f3d8
Implicit process is now 8816f3d8
WARNING: .cache forcedecodeuser is not enabled
0: kd> s -u 400000 l2000000 "cyxvc"
018a0b3c 0063 0079 0078 0076 0063 0000 0000 0000 c.y.x.v.c.......
0: kd> du 018a0b3c
018a0b3c "cyxvc"
分解018a0b3c
前十位(页目录索引):
6
中十位(页表索引): A0
后十二位(字节索引):
B3C
0: kd> !dd 38200000
#38200000 3962e867 396af867 00000000 00000000
#38200010 36303867 36fcf867 39e3f867 390a5867
#38200020 3a0be867 38000867 36d0f867 00000000
#38200030 00000000 00000000 00000000 00000000
#38200040 00000000 00000000 00000000 00000000
#38200050 00000000 00000000 00000000 00000000
#38200060 00000000 00000000 00000000 00000000
#38200070 00000000 00000000 00000000 00000000
39e3f867 后三位是权限描述 取39e3f000
0: kd>!dd 39e3f000+A0*4
#39e3f280 38180867 00000080 00000080 00000080
#39e3f290 35dc2867 360c1867 00000080 00000080
#39e3f2a0 36604867 36908867 362c3867 367c9867
#39e3f2b0 36c0a867 3690b867 36e8c867 3690d867
#39e3f2c0 36b4e867 36f8f867 36c90867 36c11867
#39e3f2d0 36c52867 367c6867 369c7867 370d3867
#39e3f2e0 36805867 36d96867 36f97867 36e98867
#39e3f2f0 36dd9867 3705a867 371db867 374dc867
38180867 后三位是权限描述 取38180000
最终转换成的物理地址为:38180000+B3C=38180B3C
即 018a0b3c =》 38180B3C
1: kd> du 018a0b3c
018a0b3c "cyxvc"
1: kd> !du 38180B3C
#38180b3c "cyxvc"
相关知识:
其他资料:
已知一个虚拟地址0x01AF5518, 则转换的过程如下:
注意: *这里讨论的以Windows下普通模式分页的情况, 也就是2级页表的情况*
1.首先把虚拟地址拆分成3个部分(低12位, 中10位, 高10位), 换成2进制如下:
-> 0000 0001 1010 1111 0101 0101 0001 1000
按照10, 10, 12的位数重新排列后
-> (页目录索引)00 000 00110, (页表项索引)10 1111 0101, (偏移)0101 0001 1000
换算成十六进制后可以得到如下结果
页目录索引 = 6, 页表项索引 = 0x2f5 , 偏移 = 0x518
2. 根据当前的CR3寄存器中的物理地址定位页目录表基址
Cr3中存放的是物理地址, 这个物理地址指向进程的页目录表基址, 由此可以得到
页目录表基址(PDE) = Cr3 = 0xAA0E5000
3. 计算页表项的地址
页表地址存放在页目录表(PDE)中的第6个项目中, 也就是
[0xAA0E5000 + 4 * 6] = [0xAA0E5018] = 0x3D955867, 其中0x00000867为该页表属性值, PTE = 0x3D955000
3. 计算页面物理地址
我们要找的页面在这个页表中的第0x2f5项, 所以虚拟地址所在的页的物理地址为
[0x3D955000 + 0x2f5 * 4] = [0x3D955BD4] =
假设[0x3D955BD4] = 0x7095e847, 页面的物理地址 x0x7095e000, 0x00000847表示的是页面属性
4. 计算最终的物理地址
由虚拟地址分离的偏移可以计算出最终的物理地址为
0x7095E000 + 0x00000518 = 0x7095E518.
关闭PAE(物理地址扩展)
bcdedit /set PAE forcedisable
bcdedit /set nx AlwaysOff
开启双机调试,在虚拟机中新建一个记事本,并输入“cyxvc”,然后断下来
在WinDBGM中输入:
0: kd> !process 0 0 notepad.exe
PROCESS 8816f3d8 SessionId: 1 Cid: 0960 Peb: 7ffd4000 ParentCid: 0630
DirBase: 38200000 ObjectTable: 8bfbc410 HandleCount: 63.
Image: notepad.exe
0: kd> .process 8816f3d8
Implicit process is now 8816f3d8
WARNING: .cache forcedecodeuser is not enabled
0: kd> s -u 400000 l2000000 "cyxvc"
018a0b3c 0063 0079 0078 0076 0063 0000 0000 0000 c.y.x.v.c.......
0: kd> du 018a0b3c
018a0b3c "cyxvc"
分解018a0b3c
前十位(页目录索引):
6
中十位(页表索引): A0
后十二位(字节索引):
B3C
0: kd> !dd 38200000
#38200000 3962e867 396af867 00000000 00000000
#38200010 36303867 36fcf867 39e3f867 390a5867
#38200020 3a0be867 38000867 36d0f867 00000000
#38200030 00000000 00000000 00000000 00000000
#38200040 00000000 00000000 00000000 00000000
#38200050 00000000 00000000 00000000 00000000
#38200060 00000000 00000000 00000000 00000000
#38200070 00000000 00000000 00000000 00000000
39e3f867 后三位是权限描述 取39e3f000
0: kd>!dd 39e3f000+A0*4
#39e3f280 38180867 00000080 00000080 00000080
#39e3f290 35dc2867 360c1867 00000080 00000080
#39e3f2a0 36604867 36908867 362c3867 367c9867
#39e3f2b0 36c0a867 3690b867 36e8c867 3690d867
#39e3f2c0 36b4e867 36f8f867 36c90867 36c11867
#39e3f2d0 36c52867 367c6867 369c7867 370d3867
#39e3f2e0 36805867 36d96867 36f97867 36e98867
#39e3f2f0 36dd9867 3705a867 371db867 374dc867
38180867 后三位是权限描述 取38180000
最终转换成的物理地址为:38180000+B3C=38180B3C
即 018a0b3c =》 38180B3C
1: kd> du 018a0b3c
018a0b3c "cyxvc"
1: kd> !du 38180B3C
#38180b3c "cyxvc"
相关知识:
其他资料:
已知一个虚拟地址0x01AF5518, 则转换的过程如下:
注意: *这里讨论的以Windows下普通模式分页的情况, 也就是2级页表的情况*
1.首先把虚拟地址拆分成3个部分(低12位, 中10位, 高10位), 换成2进制如下:
-> 0000 0001 1010 1111 0101 0101 0001 1000
按照10, 10, 12的位数重新排列后
-> (页目录索引)00 000 00110, (页表项索引)10 1111 0101, (偏移)0101 0001 1000
换算成十六进制后可以得到如下结果
页目录索引 = 6, 页表项索引 = 0x2f5 , 偏移 = 0x518
2. 根据当前的CR3寄存器中的物理地址定位页目录表基址
Cr3中存放的是物理地址, 这个物理地址指向进程的页目录表基址, 由此可以得到
页目录表基址(PDE) = Cr3 = 0xAA0E5000
3. 计算页表项的地址
页表地址存放在页目录表(PDE)中的第6个项目中, 也就是
[0xAA0E5000 + 4 * 6] = [0xAA0E5018] = 0x3D955867, 其中0x00000867为该页表属性值, PTE = 0x3D955000
3. 计算页面物理地址
我们要找的页面在这个页表中的第0x2f5项, 所以虚拟地址所在的页的物理地址为
[0x3D955000 + 0x2f5 * 4] = [0x3D955BD4] =
假设[0x3D955BD4] = 0x7095e847, 页面的物理地址 x0x7095e000, 0x00000847表示的是页面属性
4. 计算最终的物理地址
由虚拟地址分离的偏移可以计算出最终的物理地址为
0x7095E000 + 0x00000518 = 0x7095E518.
相关文章推荐
- html+jquery1.9+cube解决方案+移动自适应基础结构模板
- 欢迎使用CSDN-markdown编辑器
- android按键事件和触屏事件(二)-带你从源码的角度彻底理解
- 【转载】Github上如何给别人贡献代码
- oracle系列--级联删除和级联更新
- BeanPostProcessor and static BeanFactory Create
- Android开发常用的adb命令整理
- print "hello" SyntaxError: Missing parentheses in call to 'print'
- ios微信支付调起微信只显示一个确定按钮
- View Controller的生命周期
- Eclipse Junit测试报initializationError错误
- 1 Maven-简介
- cocos2dx网络连接部分深入学习
- Java模拟Tracert和ping命令实现跃点追踪
- Xsoup 是一款基于 Jsoup 开发的
- git之创建版本库
- iOS开发-工厂模式
- Xsoup 是一款基于 Jsoup 开发的
- 二、Python安装扩展库
- Spark MLlib 之 Basic Statistics