吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3736|回复: 12
收起左侧

[系统底层] 保护模式之10-10-12分页,并实现不同线性地址指向同一物理地址

[复制链接]
hangzhouw 发表于 2022-3-28 17:09
该篇文章是我自己学完保护模式的10-10-12分页所记录下的心得和体会,因本人也只是初学者,难免会有知识上的欠缺,若有任何疑问或建议,欢迎在下方留言

4个关键词:
CR3寄存器
页目录表(PDT)
页表(PTT)
页(P)

1个关键点:
PTT里存的是每一个页的首地址,PDT里存的是PTT的首地址

页(P):
大小为4KB,共2^20个(一个进程大小为4GB)
页0的地址为0x00000000~0x00000fff,页1的地址为0x00001000~0x00001fff,依此类推,每一个页的首地址为0x****000,表示0x0~0xf中的任意一种情况。

页表(PTT):
PTT也是一张页,但是这张页不是存的指令或者数据,而是存的每张页的首地址,即0x*****000,存储一个地址需要4B,因此PTT一共能存2^10个地址,至少需要2^10个PTT才能放下所有页的首地址。

页目录表(PDT):
存放PTT的首地址,虽然PTT里也有PTT的首地址,但是你咋知道PTT的首地址是在哪个PTT里的哪一项?因此,PDT里存放了所有PTT的首地址,存储一个地址需要4B,因此PDT一共能存2^10个地址。

CR3寄存器:
存放PDT的首地址。

如果你已经看懂上述内容,接下来我将介绍一个线性地址如何转化成一个物理地址:
1、  首先读取CR3寄存器的值
2、  PDT的首地址+线性地址的最左边10bit 4 得到PTT的首地址
3、  PTT的首地址+线性地址的中间10bit
4 得到页的首地址
4、  页的首地址+线性地址的最后10bit 得到物理地址

注:10bit索引2^10个4B,12bit索引2^12个1B



下面这张草图可以帮助你更好理解:
a.png

接下来我将实现两个不同的线性地址指向同一物理地址的功能:
#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>

int main(int argc, char* argv[])
{
    int x = 0x1;
    printf("x的地址:%x\n", &x);
    // 申请一个新的物理页,将p的PTE和物理页内偏移改成和x一样
    int* p = (int*)VirtualAlloc(NULL,0x1000,MEM_COMMIT,PAGE_READWRITE);
    int* p_bak = p;

    p = (int*)((int)p & 0xFFFFF000);
    p = (int*)((int)p | ((int)&x & 0x00000FFF));
    printf("新的线性地址:%x\n", p);
    getchar(); // 在windbg里修改 p 的 PTE

    // 用新的线性地址读x
    printf("*addr:%x\n",*p); // 0x1
    // 用新的线性地址写x
    *p = 0x112233;
    printf("x:%x\n",x); // 0x112233

    getchar();
    VirtualFree(p_bak,0x1000,MEM_DECOMMIT);
    return 0;
}

在getchar函数执行后,需要将x所在页的首地址给到p对应PTT里的相应位置,具体操作可参考下图:



b.png
c.png
d.png

DirBase的值就是PDT的首地址,17a16000是PTT的首地址,0d15a000是x所在页的首地址,x与p对应的PDT与PTT的首地址是一样的,但是x所在页的首地址所存储的地方是不一样的,前者在17a164bc,后者在17a16e80,所以要在17a16e80写入x所在页的首地址,这样不同的线性地址就指向同样的物理地址。

再强调一下,x与p的PDT的首地址是一样的,PTT的首地址可以不一样,但是对应PTT里存的页的首地址必须一样,且线性地址的最后12bit必须一样。



最后的结果:
e.png

需要强调一点,图里面的每个数值仅供参考,不同的主机可能有不同的数值

免费评分

参与人数 2吾爱币 +6 热心值 +1 收起 理由
Hmily + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
baipiaowwang + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zhangting2022 发表于 2022-3-29 06:41
厉害厉害!
new1001 发表于 2022-3-29 07:47
lin1229 发表于 2022-3-29 09:11
skiss 发表于 2022-3-29 11:31
小白不懂就问  这是干啥的?囧。。
minibeetuaman 发表于 2022-3-30 09:11
64bit下和这个还是有很大的不同,之后可以研究一下
dl0618 发表于 2022-3-30 09:20
不错不错真不错
Tony2009 发表于 2022-3-30 11:59
好高端啊
jsncy 发表于 2022-7-20 20:10
谢谢分享
1993zhang 发表于 2022-7-22 10:55
好,谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-19 15:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表