签到

05月06日
尚未签到

共有回帖数 0

    花非花雾非雾

    等级:
    弄了个test.exe,main下第一句是__asm int 3以便断在windbg中。省的直接break落到idle进程中。
    kd !process 0 0
    PROCESS 81ed6778 SessionId: 0 Cid: 0578    Peb: 7ffdf000 ParentCid: 05b8
       DirBase: 04040160 ObjectTable: e1df1da0 HandleCount:   7.
       Image: test.exe

    这就是我们进程了。81ed6779是EPROCESS所在处。DirBase放的是cr3的值,正是我们需要的。
    kd r cr3
    cr3=04040160
    这是相等的。
    随便挑一个地址看吧。就拿00401028来看
    00401028 cc              int     3
    001b:00401029 6a08            push    8
    001b:0040102b e800010000      call    00401130

    所以对应00401028的物理地址一个双字应该是e8086acc(intel小尾)

    看看00401028的二进制
    kd .formats 00401028
    Evaluate expression:
    Hex:     00401028
    Decimal: 4198440
    Octal:   00020010050
    Binary: 00000000 01000000 00010000 00101000
    Chars:   .@.(
    Time:    Wed Feb 18 22:14:00 1970
    Float:   low 5.88327e-039 high 0
    Double: 2.0743e-317
    cr3中存放的是PDPTE的物理地址,而虚拟地址前两位(31,30)表示PDPTE的索引。此时为00,即第0项。

    查看此物理地址

    kd !dd 04040160
    # 4040160 0e1f1001 00000000 0e0f2001 00000000
    # 4040170 0df33001 00000000 0e070001 00000000



    第0项即000000000e1f1001。


    虚拟地址之后9位(29 — 21)是PDE索引,此时为000000 010,即第2项。
    kd !dd 0e1f1000
    # e1f1000 0dfc2067 00000000 0e38d067 00000000
    # e1f1010 0e241067 00000000 00000000 00000000
    # e1f1020 00000000 00000000 00000000 00000000
    # e1f1030 00000000 00000000 00000000 00000000
    # e1f1040 00000000 00000000 00000000 00000000
    # e1f1050 00000000 00000000 00000000 00000000
    # e1f1060 00000000 00000000 00000000 00000000
    # e1f1070 00000000 00000000 00000000 00000000

    第2项即000000000e241067
    后后12位为标志位,第7位说明是要映射一个2mb的页还是存放所对应的PTE的物理地址
    此时,067 = 000001100111,第7位为0,说明存放对应PTE的物理地址








    再之后9(20 - 12)位是PTE索引,此时为00000 0001,即第1项。PTE中存放的就是物理页的基址了。


    kd !dd 0e241000
    # e241000 0e1ef025 80000000 0e26a025 00000000
    # e241010 0e36b025 00000000 0e09b025 00000000
    # e241020 0e15c025 00000000 0e05d025 00000000
    # e241030 00000000 00000000 00000000 00000000
    # e241040 0df60025 00000000 0de21025 00000000
    # e241050 0e062025 00000000 0e1f7025 00000000
    # e241060 0e2af025 00000000 00000000 00000000
    # e241070 00000000 00000000 00000000 00000000


    第1项即000000000e26a025,物理页基址就是0e26a000




    虚拟地址还余下12位(11 - 0),即物理页面中的偏移,此时是0000 00101000,即0x28


    kd !dd 0e26a000
    # e26a000 cccccccc 0006e9cc cccc0000 cccccccc
    # e26a010 83ec8b55 56534cec b47d8d57 000013b9
    # e26a020 ccccb800 abf3cccc e8086acc 00000100
    # e26a030 8904c483 45c7fc45 000100f4 f845c700
    # e26a040 00000101 c7fc458b 00010000 fc4d8b00
    # e26a050 010441c7 8b000001 8b52f855 6850f445
    # e26a060 00422f5c 000047e8 0cc48300 8bfc4d8b
    # e26a070 8b520451 1c685001 e8004220 00000030


    偏移28处为e8086acc,与我们看到的相同。

    总之,PAE除了使用3级映射,其他与与普通的32-bit paging(使用2级映射)大同小异。

    楼主 2015-11-26 14:22 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知