逆向MmIsAddressValid

MmIsAddressValid

作用:用来判断某个线性地址是否被挂了物理页

说人话!!!!

就是说线性地址是否有效

先到windbg看看源码,静态分析一下

逆向MmIsAddressValid

入口部分

 1 nt!MmIsAddressValid:
 2 804e2f46 8bff            mov     edi,edi  
 3 804e2f48 55              push    ebp  
 4 804e2f49 8bec            mov     ebp,esp  ;保存寄存器,并且压栈
 5 804e2f4b 8b4d08          mov     ecx,dword ptr [ebp+8]  ;把参数给ecx
 6 804e2f4e 8bc1            mov     eax,ecx  
 7 804e2f50 c1e814          shr     eax,14h  ;线性地址右移20,还剩下高位的12位
 8 804e2f53 bafc0f0000      mov     edx,0FFCh  
 9 804e2f58 23c2            and     eax,edx  ;高地址12位与0xffc做and运算,保留pdi 10位
10 804e2f5a 2d0000d03f      sub     eax,3FD00000h ;相当于0xc0300000+eax(因为0-3fd00000=0xc0300000)
11 804e2f5f 8b00            mov     eax,dword ptr [eax] ;由于0xc0300000是存储着pde地址的,所以把pde给了eax
12 804e2f61 a801            test    al,1 ;检查是否为1,如果为1,就跳转
13 804e2f63 0f844e3e0100    je      nt!MmIsAddressValid+0x4f (804f6db7)
14 804e2f69 84c0            test    al,al ;判断ps位是否为1
15 804e2f6b 7824            js      nt!MmIsAddressValid+0x53 (804e2f91)
16 804e2f6d c1e90a          shr     ecx,0Ah ;线性地址右移10位
17 804e2f70 81e1fcff3f00    and     ecx,3FFFFCh ;获得pdi与pti的10位,并且pdi乘以了4(相当于保留pti 10位并乘4)
18 804e2f76 81e900000040    sub     ecx,40000000h ;相当于ecx+0x40000000,因为0x40000000是0号地址的pte
19 804e2f7c 8bc1            mov     eax,ecx ;
20 804e2f7e 8b08            mov     ecx,dword ptr [eax]//将pte中的物理页给ecx
21 804e2f80 f6c101          test    cl,1 //低8位是否为1
22 804e2f83 0f842e3e0100    je      nt!MmIsAddressValid+0x4f (804f6db7) 
23 804e2f89 84c9            test    cl,cl //判断ps位是否为1
24 804e2f8b 0f88d5410400    js      nt!MmIsAddressValid+0x3f (80527166)
25 804e2f91 b001            mov     al,1 把p位置1
26 804e2f93 5d              pop     ebp
27 804e2f94 c20400          ret     4

 12行如果低8位为1,则直接返回0

逆向MmIsAddressValid

 逆向MmIsAddressValid

15行如果PAT位为1则返回1

逆向MmIsAddressValid

 23行,判断pte指向的PAT位是否为1,是则返回0,否则返回1

逆向MmIsAddressValid