非PAE模式

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值