本节内容 页表基址 视频提供:昆山滴水信息技术有限公司 官网地址:www.dtdishui.com 论坛地址:www.dtdebug.com QQ交流 :49759272
内容回顾 上一节课我们讲解了页目录表基址,也就是说通过0xC0300000这个线性地址 可以访问一张表,这张表就是页目录表,有了这个地址,我们可以任意修改页目录表。 但如果我们要设置某个线性地址PDE和PTE那么还要能够访问PTT,如何 访问呢?
1、拆分C0000000 / C0001000 (参见课堂实验)
总结: 1、页表被映射到了从0xC0000000到0xC03FFFFF的4M地址空间 2、在这1024个表中有一张特殊的表:页目录表 3、页目录被映射到了0xC0300000开始处的4K地址空间
3、有了0xC0300000和0xC0000000能做什么? 掌握了这两个地址,就掌握了一个进程所有的物理内存读写权限。 公式总结: 1、什么是PDI与PTI 800F00C = PDE&PTE 0 1 2、访问页目录表的公式: 0xC0300000 + PDI*4 3、访问页表的公式: 0xC0000000 + PDI*4096 + PTI*4
4、还有哪些细节 1、高2G有一些大页,即4MB页. 2、两个进程低2G几乎不同,高2G几乎相同. 3、一个进程低2G的内存空间,前64K与后64K是没有使用的。 (线性地址0 - 00010000 与 7FFF0000 - 7FFFFFFFF)
5、谁填充了这些表呢? 进程本身可以通过0xC0300000和0xC0000000访问修改任意物理页. 谁为我们填充0xC0300000和0xC0000000的PDE与PTE呢? 进程的创建过程: 当创建B进程时,先在A进程中将B进程所有信息全部构建好,然后切换Cr3即可。 也就是说,最开始的这张表是由A进程填充的。
6、课后练习 逆向分析MmIsAddressValid函数(10-10-12)