zoukankan      html  css  js  c++  java
  • 保护模式(八):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]
  • 相关阅读:
    UML总结4---UML九种图关系说明
    TCP/IP学习笔记__mbuf
    操作系统内存管理之 内部碎片vs外部碎片
    校园招聘面试-操作系统知识总结 分看点三
    操作系统常见面试题总结 分看点二
    操作系统之面试常考 分看点一
    操作系统基础知识总结(二)
    操作系统基础知识总结(一)
    Java HashMap的扩容
    linux查看端口被占用情况
  • 原文地址:https://www.cnblogs.com/harmonica11/p/14176092.html
Copyright © 2011-2022 走看看