• 逆向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

  • 相关阅读:
    线性时间将两个有序链表合成一个有序链表(constant additional space)
    C++定义指针数组
    cmd运行java编译文件
    java的方法
    Java流程控制
    用户交互-Scanner
    Java的注释
    编译型语言和解释性语言
    JDK、JRE和JVM
    MarkDown的简单使用
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/13868420.html
Copyright © 2020-2023  润新知