页表基址
知识点
线性地址和物理地址是一对一映射关系, 等价映射;
每个进程在高地址中有4兆空间是不共享的, 他指向的是本进程的PDE和PTE;
判断一个线性地址是否有效?
- 如果是PDE.p = 1并且PS=1, 那么有效
- 如果PDE.p=1 PS=0, PTE.p=1 PTE.PAT=0, 有效
101012下页表基址计算
- 汇编代码
MiIsAddressValid(线性地址有效性验证函数)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31.text:0048DBB8 mov eax, ecx
.text:0048DBBA shr eax, 14h ; 右移动 20位 eax >> 20
.text:0048DBBD and eax, 0FFCh ; (eax >> 20) & ffc
.text:0048DBC2 sub eax, 3FD00000h
.text:0048DBC7 mov eax, [eax] ; C0300000是一个起始地址
.text:0048DBC9 test al, 1
.text:0048DBCB jnz short loc_48DBD0
.text:0048DBCD
.text:0048DBCD loc_48DBCD: ; CODE XREF: MiIsAddressValid(x,x)+32↓j
.text:0048DBCD xor al, al
.text:0048DBCF retn
.text:0048DBD0 ; ---------------------------------------------------------------------------
.text:0048DBD0
.text:0048DBD0 loc_48DBD0: ; CODE XREF: MiIsAddressValid(x,x)+13↑j
.text:0048DBD0 test al, al
.text:0048DBD2 jns short loc_48DBD7 ; 判断是否是大页
.text:0048DBD4 mov al, 1
.text:0048DBD6 retn
.text:0048DBD7 ; ---------------------------------------------------------------------------
.text:0048DBD7
.text:0048DBD7 loc_48DBD7: ; CODE XREF: MiIsAddressValid(x,x)+1A↑j
.text:0048DBD7 shr ecx, 0Ah
.text:0048DBDA and ecx, 3FFFFCh
.text:0048DBE0 sub ecx, 40000000h ; C0000000
.text:0048DBE6 mov eax, [ecx]
.text:0048DBE8 test al, 1 ; PTE
.text:0048DBEA jz short loc_48DBCD
.text:0048DBEC and al, 80h
.text:0048DBEE cmp al, 80h
.text:0048DBF0 setnz al
.text:0048DBF3 retn
C0300000 PDE基址
C0300000 + ((线性地址 >> 0x14) & 0xFFC)
C0000000 PTE基址
C000000 + ((线性地址 >> 0xA) & 0x3FFFFC)
PAE
最大能支持36根地址总线
2^32 = 4G
2^33 = 4G * 2 = 8G
2^36 = 4G*2^4 = 64G
2-9-9-12分页
- 2^2 = 4, 有4种(00, 01, 10, 11), 所以CR3是以0x20来递增的;
作业
- 2-9-9-12拆法;
- 逆向分析2-9-9-12分页模式下内核函数MmIsAddressValied;
- 通过调用门进入R0修改高2G的所有PDE、PTE的u/s位, 然后返回应用层访问高地址, 分页模式10-10-12;