XP关闭PAE
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Debug" /noexecute=alwaysoff /NOPAE /debug /debugport=COM1: /baudrate=115200
逻辑地址和线性地址:
在保护模式的架构下,处理器分两步进行地址转换获得物理地址:逻辑地址转换为线性地址,线性地址转换为物理地址
逻辑地址:一个逻辑地址是由16位的段选择子和32位的偏移量组成
线性地址:是处理器线性地址空间内的32位地址,线性地址与物理地址一样,是平坦的(不分段),空间大小2^32字节,地址0000 0000到FFFF FFFF
mov eax,[0x12345678]
16位:线性地址:(ds为2323)*16+offset
32位下:平坦模式(ds.base为0),线性地址等于逻辑地址
处理器逻辑地址转换线性地址步骤:
1、通过选择子中的偏移量,在GDT或LDT中定位段描述符
2、检查段描述符中的权限和段的地址范围确保段是可访问的,偏移量在段限长范围内的
3、将段描述符中的段基址与偏移量相加构成线性地址
传入逻辑地址0x12345678,通过cpu找到GDT,计算线性地址,传入MMU通过
(1)TLB取出物理地址(线性地址->物理地址),然后通过 物理地址在缓存中查找到数据,然后返回TLB->MMU->CPU
(2)如果没有则通过计算TEB,PTE查找,如果还是没有直接查找物理地址
10-10-12分页
4KB页
10-10-12分页将线性地址分为3个部分:
1、页目录表项(PDT):22-31位,页表项在页目录中的偏移量,为表项提供物理基址
2、页表项(PTT):12-21位,提供表项在所选的页表中的偏移量,提供了物理内存页的物理基地址
3、页偏移项:0-11位,提供了该地址在页中的偏移量
4MB项
通过CR4中的PSE位和页目录表中的PS标志,可以启用4MB的页,线性地址被分为2部分:
1、页目录表项(PDT):22-31位,页表项在页目录中的偏移量,为表项提供了4MB的页的物理基地址
2、页偏移量:线性地址的0-21位提供了该地址在页中的偏移量
PDE\PTE属性
P位:该位表示指向的物理页是否存在内存中,为1则存在,0不存在,如果为0时,试图访问当前物理页,此标志与U/S位和CR0的WP标志共同起作用,会产生缺页异常(PF)
R/W位:读写标志位,确定对一个页或一组页的读写权限,清零时,表示只读,置1表示可读可写
U/S位:用户权限位,确定一个页或一组页的用户权限。清零时表示该页的用户权限位超级用户,置1时,该位表示普通权限,此标志与R/W位和CR0的WP标志共同起作用
A位:访问标志位,表示该页是否被访问过
D位:脏位,表示该页是否被写入过,内存管理软件使用访问位和脏位来调度页或页表进出物理内存
PS位:页尺寸位,仅用于页目录表,判断是否为大页(4MB)。
G位:全局位,当一个页被标识位全局时,且CR4中的PGE位置1时,一旦CR3寄存器发生切换或载入,TLB置页表或指向页的页目录项不失效。对于指向页表的页目录来说,这个标志不起作用,一个页的全局特性是在页表项中设置的
MmIsAddressValid逆向
WDK文档指出MmIsAddressValid例程检查是否会在给定的虚拟地址对读取或写入操作出现页错误。也就是说用来判断地址是否可用;(10-10-12分页)
.text:0040C661 mov edi, edi
.text:0040C663 push ebp
.text:0040C664 mov ebp, esp
.text:0040C666 mov ecx, [ebp+VirtualAddress] ; 获取线性地址
.text:0040C669 mov eax, ecx
.text:0040C66B shr eax, 20 ; 右移20位
.text:0040C66E mov edx, 0FFCh ; 置0移动符号位,并把后两位清空
.text:0040C673 and eax, edx ; addr=地址>>22<<2
.text:0040C675 sub eax, 3FD00000h ; addr+=0xc0300000 获取PDE
.text:0040C67A mov eax, [eax] ; 获取地址内容
.text:0040C67C test al, 1 ; 判断p位是否为1
.text:0040C67E jz loc_41B856 ; 不为1则返回FLASE
.text:0040C67E
.text:0040C684 test al, al ; 判断ps位是否位1
.text:0040C686 js short loc_40C6AC ; 如果ps位为1,是大页,返回TRUE
.text:0040C686
.text:0040C688 shr ecx, 0Ah ; 右移10位
.text:0040C68B and ecx, 3FFFFCh ; 置0添加位,把后两位清空
.text:0040C691 sub ecx, 40000000h ; addr=地址>>10<<2+0xc0000000 获取PTE
.text:0040C697 mov eax, ecx
.text:0040C699 mov ecx, [eax] ; 获取地址内容
.text:0040C69B test cl, 1 ; 判断P位是否为1
.text:0040C69E jz loc_41B856 ; 不为1返回FALSE
.text:0040C69E
.text:0040C6A4 test cl, cl ; 判断PAT为是否为1
.text:0040C6A6 js loc_44A562 ; (PTE)addr&0XFFC
.text:0040C6A6
.text:0040C6AC
.text:0040C6AC loc_40C6AC: ; CODE XREF: MmIsAddressValid(x)+25↑j
.text:0040C6AC ; MmIsAddressValid(x)+3DF0F↓j
.text:0040C6AC mov al, 1
.text:0040C6AC
.text:0040C6AE
.text:0040C6AE loc_40C6AE: ; CODE XREF: MmIsAddressValid(x)+F1F7↓j
.text:0040C6AE pop ebp
.text:0040C6AF retn 4
.text:0040C6AF
.text:0040C6AF _MmIsAddressValid@4 endp
.text:0044A562
.text:0044A562 loc_44A562: ; CODE XREF: MmIsAddressValid(x)+45↑j
.text:0044A562 and eax, edx ; (PTE)addr&0XFFC
.text:0044A564 mov eax, [eax-3FD00000h] ; PDE
.text:0044A56A and ax, 81h ; 清空除了P位与PS位
.text:0044A56E cmp al, 81h ; 判断P位和PS位是否都为1
.text:0044A570 jnz loc_40C6AC ; 如果不都为1,返回TRUE
.text:0044A570
.text:0044A576 jmp loc_41B856 ; 都为1,返回FALSE