X64下用的是9-9-9-9-12的分页模式,PML4E-PDPTE-PDE-PTE-偏移,线性地址的前16位是作符号扩展,后48位是分页模式.
1.PTE是直接指向物理内存的,X86下有个固定的页目录表0xc0000000 可得到所有地址信息,X64下为了安全起见,页目录表随机了,文章末有分析如何得到。
一、PTE的算法:
1.已一个线性地址为例0xfffffa801a628b30,下面先拆分
PML4E:1111 1010 1 1F5
PDPTE:000 0000 00 0
PDE:01 1010 011 D3
PTE:0 0010 1000 28
偏移:1011 0011 0000 B30
PTE先理解为线性地址
2.首先,每次启动系统后0地址的PTE是固定的,每隔0x1000大小PTE会增加8,由此先得到0的PTE,再根据大小便可算出0xfffffa801a628b30的PTE
已知、0的PTE为0xfffffa801a628b30,根据算法(线性地址48位÷0x1000)*8+0的PTE=线性地址PTE
(0xfa801a628b30>>12)<<3+0xFFFFF68000000000=0xFFFFF6FD400D3140 (符合图上)
二、PDE的算法:把PTE理解成线性地址,(PTE线性地址48位>>21)*8+0的PTE=线性地址PDE
(0xF6FD400D3140 >>21)<<3+0xFFFFF68000000000=0xFFFF F6FB 7EA0 0698
三、PDPTE的算法:把PDE理解成线性地址,(PDE线性地址48位÷0x1000)*8+0的PTE=线性地址PDPTE
(0xF6FB7EA00698>>12)<<3+0xFFFFF68000000000=0xFFFF F6FB 7DBF 5000
四、PML4E的算法:把PML4E理解成线性地址,(PDPTE线性地址48位÷0x1000)*8+0的PTE=线性地址PML4E
(0xF6FB 7DBF 5000>>12)<<3+0xFFFFF68000000000=0xFFFF F6FB 7DBE DFA8
五、上面的算法得到了999912的算法,但是一切都是围绕着0的PTE已知的情况下,定位MiReturnSystemVa / MiSystemWsMetaPage 函数,硬编码得到