逆向MmIsAddressValid
MmIsAddressValid
作用:用来判断某个线性地址是否被挂了物理页
说人话!!!!
就是说线性地址是否有效
先到windbg看看源码,静态分析一下
入口部分
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
15行如果PAT位为1则返回1
23行,判断pte指向的PAT位是否为1,是则返回0,否则返回1