X64下用的是9-9-9-9-12的分页模式,PML4E-PDPTE-PDE-PTE-偏移,线性地址的前16位是作符号扩展,后48位是分页模式.
1.PTE是直接指向物理内存的,X86下有个固定的页目录表0xc0000000 可得到所有地址信息,X64下为了安全起见,页目录表随机了,文章末有分析如何得到。
一、X64内存的算法:
1.首先定位到页目录基质,也就是线性地址0的PTE,WIN7固定是0xFFFFF68000000000
通过固定公式计算可以得到0的PDE\PDPTE\PML4E,把PTE当成一个线性地址来计算
PTE: 0xFFFFF68000000000
PDE: 0xFFFFF6FB40000000 ,算法:((页目录基质&0xffff ffff ffff)>>0xc) *8 + 页目录基质
PDPTE: 0xFFFFF6FB7DA00000 ,算法:((PDE&0xffff ffff ffff)>>0xc) *8 + 页目录基质
PML4E: 0xFFFFF6FB7DBED000,算法:((PDPTE&0xffff ffff ffff)>>0xc) *8 + 页目录基质
以上都可以当做基质来算每个线性地址
2.首先,每次启动系统后0地址的PTE是固定的,每隔0x1000大小PTE会增加8,由此先得到0的PTE,再根据大小便可算出0xfffffa801a628b30的PTE
二、PML4E的算法:PML4E的index*8+PML4E基质
((0xfffffa801a628b30 & 0xFFFFFFFFFFFF)>>39)<<3+0xFFFFF6FB7DBED000=0xFFFFF6FB7DBEDFA8
三、PDPTE的算法:PDPTE的index*8+PDPTE基质
((0xfffffa801a628b30 & 0xFFFFFFFFFFFF)>>30)<<3+0xFFFFF6FB7DA00000 =0xFFFFF6FB7DBF5000
四、PDE的算法:PDE的index*8+PDE基质
((0xfffffa801a628b30 & 0xFFFFFFFFFFFF)>>21)<<3+0xFFFFF6FB40000000 =0xFFFFF6FB7EA00698
五、PTE算法:PTE的index*8+PTE基质
((0xfffffa801a628b30 & 0xFFFFFFFFFFFF)>>12)<<3+0xFFFFF68000000000=0xFFFFF6FD400D3140
六、上面的算法得到了999912的算法,但是一切都是围绕着0的PTE(页目录表基质)已知的情况下,定位MiReturnSystemVa / MiSystemWsMetaPage/MmGetVirtualForPhysical/MmIsAddressValid 函数,硬编码得到