[课上练习]手工将虚拟地址转换为物理地址

来源:互联网 发布:股票训练软件 编辑:程序博客网 时间:2024/04/28 17:54

环境设置:

关闭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.

0 0
原创粉丝点击