1. 程式人生 > 實用技巧 >學習筆記(八)MmIsAddressValid逆向(PAE)

學習筆記(八)MmIsAddressValid逆向(PAE)

kd> u MmIsAddressValid l50h
nt!MmIsAddressValid:
80511980 8bff            mov     edi,edi
80511982 55              push    ebp
80511983 8bec            mov     ebp,esp
80511985 51              push    ecx
80511986 51              push    ecx
80511987 8b4d08          mov     ecx,dword ptr [ebp+8]  ;引數address
8051198a
56 push esi 8051198b 8bc1 mov eax,ecx 8051198d c1e812 shr eax,12h ;eax>>18 80511990 bef83f0000 mov esi,3FF8h         ; 80511995 23c6 and eax,esi ;eax=(DPD)*8 80511997 2d0000a03f sub eax,3FA00000h       ;eax+C0600000(PDT基址) 8051199c 8b10 mov edx,dword ptr [eax] ;edx=PDE後半段 8051199e 8b4004 mov eax,dword ptr [eax
+4] ;eax=PDE前半段 805119a1 8945fc mov dword ptr [ebp-4],eax 805119a4 8bc2 mov eax,edx 805119a6 57 push edi 805119a7 83e001 and eax,1 805119aa 33ff xor edi,edi 805119ac 0bc7 or eax,edi 805119ae 7461 je nt!MmIsAddressValid+0x91
(80511a11)  ;判斷P位是否有效,P=0跳轉返回假 805119b0 bf80000000 mov edi,80h 805119b5 23d7 and edx,edi                   ;判斷PS位 805119b7 6a00 push 0 805119b9 8955f8 mov dword ptr [ebp-8],edx           805119bc 58 pop eax                      ;eax=0 805119bd 7404 je nt!MmIsAddressValid+0x43 (805119c3) ;PS=0跳轉(小頁) 805119bf 85c0 test eax,eax 805119c1 7452 je nt!MmIsAddressValid+0x95 (80511a15) ;PS=1(大頁)返回真 805119c3 c1e909 shr ecx,9                    ;address>>9(取T) 805119c6 81e1f8ff7f00 and ecx,7FFFF8h                 ; 805119cc 8b81040000c0 mov eax,dword ptr [ecx-3FFFFFFCh]      ;[ecx+0xC0000004](eax為PTE前段) 805119d2 81e900000040 sub ecx,40000000h                ;ecx=ecx+C0000000(頁表基址) 805119d8 8b11 mov edx,dword ptr [ecx]            ;edx為PTE後段 805119da 8945fc mov dword ptr [ebp-4],eax 805119dd 53 push ebx                       805119de 8bc2 mov eax,edx                    805119e0 33db xor ebx,ebx 805119e2 83e001 and eax,1 805119e5 0bc3 or eax,ebx 805119e7 5b pop ebx 805119e8 7427 je nt!MmIsAddressValid+0x91 (80511a11) ;PTE,P=0,返回FALSE 805119ea 23d7 and edx,edi                   ;PAT位 805119ec 6a00 push 0 805119ee 8955f8 mov dword ptr [ebp-8],edx 805119f1 58 pop eax                      ;eax=0 805119f2 7421 je nt!MmIsAddressValid+0x95 (80511a15) ;PAT=0返回TRUE 805119f4 85c0 test eax,eax 805119f6 751d jne nt!MmIsAddressValid+0x95 (80511a15)   ;不會執行 805119f8 23ce and ecx,esi ;PAT=1時情況 805119fa 8b89000060c0 mov ecx,dword ptr [ecx-3FA00000h]      ;不往下分析了 80511a00 b881000000 mov eax,81h 80511a05 23c8 and ecx,eax 80511a07 33d2 xor edx,edx 80511a09 3bc8 cmp ecx,eax 80511a0b 7508 jne nt!MmIsAddressValid+0x95 (80511a15) 80511a0d 85d2 test edx,edx 80511a0f 7504 jne nt!MmIsAddressValid+0x95 (80511a15) 80511a11 32c0 xor al,al                      //return FALSE 80511a13 eb02 jmp nt!MmIsAddressValid+0x97 (80511a17)     80511a15 b001 mov al,1                       //return TRUE 80511a17 5f pop edi 80511a18 5e pop esi 80511a19 c9 leave 80511a1a c20400 ret 4
BOOLEAN MmIsAddressValid(
  PVOID VirtualAddress
);

結論

PDE=[((VirtualAddress>>18)&0x3FF8)+0xC0600000]
PTE=[((VirtualAddress>>9)&0x7FFFF8)+0xC0000000]