• 通过修改VAD属性破除锁页机制


    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

    技术学习来源:火哥(QQ:471194425)

    注释:因为自己的知识有限,在句柄那块说的不是很清除,在学习相关知识之后会自行补上。

    通过修改VAD属性破除锁页机制

      对于一般的页属性修改,我们直接修改_MMVAD_FLAGS.Protection即可。

      但是,如果有锁页机制,单纯改这个是无法实现目的的。(具体情况参见:利用内存锁定方式页面修改

      面对这种情况,我们既要修改_MMVAD_FLAGS.Protection,又要修改另一处(下面会详细讲述)。

    1. 修改 _SECTION.MMSECTION_FLAGS

          一个 section_object 代表了一个内存段, section_object 可以在不同的进程之间共享它所代表的内存, 进程也可以使用 section object 把文件映射到内存中。

       我们通过HANDLE来获取_SECTION_OBJECT的地址,然后修改。

      1)获取句柄值:

        如图,我们通过VirtualProtect的参数获取其句柄值p。

        VirtualProtect(BaseAddress, 0x10000, PAGE_EXECUTE_READWRITE, &p);

        

          句柄值p为0x34,其4位一个,故其索引位 D(0x34/4)。

      2)句柄表位置:句柄表在 _EPROCESS+0xc4的位置 +0x0c4 ObjectTable      : Ptr32 _HANDLE_TABLE

        ntdll!_HANDLE_TABLE
           +0x000 TableCode        : 0xe2548000
           +0x004 QuotaProcess     : 0x816be878 _EPROCESS

      3)我们查看句柄表 0xe2548000,来获取 表码。

        其结尾代表表层数,比如 001代表一层,002代表三层个,我们现在是000,故直接查这张表。

        kd> dd 0xe2548000
          e2548000  00000000 fffffffe e1005431 000f0003
          e2548010  e1499d49 00000003 81a84d63 00100020
          e2548020  00000000 00000040 e168f2f1 000f000f

        因为"句柄描述符"(暂时先这么称呼),8位一个,前四位地址(最后一位要抹零),后四位属性。

        索引得到0xD处的"句柄描述符",其运算符为 dd 0xe2548000+8*D。

        e153b151 000f001f

      4)e153b150(最后一位置零)指向的是一个,其指向 _OBJECT_HEADER 的结构,表示内核对象(句柄本身就指向内核对象)

        kd> dt _OBJECT_HEADER e153b151
        nt!_OBJECT_HEADER
           +0x000 PointerCount     : 0n16777216
           +0x004 HandleCount      : 0n1610612736
           +0x004 NextToFree       : 0x60000000 Void
           +0x008 Type             : 0x0081fb55 _OBJECT_TYPE
           +0x00c NameInfoOffset   : 0 ''
           +0x00d HandleInfoOffset : 0x10 ''
           +0x00e QuotaInfoOffset  : 0 ''
           +0x00f Flags            : 0xd8 ''
           +0x010 ObjectCreateInfo : 0x0081ecc7 _OBJECT_CREATE_INFORMATION
           +0x010 QuotaBlockCharged : 0x0081ecc7 Void
           +0x014 SecurityDescriptor : (null)
           +0x018 Body             : _QUAD
      5)_SECTION 数据结构 (_OBJECT_HEADER+0x18处)

       我们通过 dt _OBJECT_HEADER -r1 指令并没有分析出+0x18处其是什么结果。

        +0x018 Body             : _QUAD
              +0x000 DoNotUseThisField : 2.9027887682017685678e-306

       但其指向一个 _SECTION结构体,我们在WRK中看到其定义

        typedef struct _SECTION {
            MMADDRESS_NODE Address; // +0x0
            PSEGMENT Segment;  // +0x14
            LARGE_INTEGER SizeOfSection; // +0x18
            union {
                ULONG LongFlags;
                MMSECTION_FLAGS Flags; //+0x24
            } u;
            MM_PROTECTION_MASK InitialPageProtection;

      6)查看并修改 _SECTION.MMSECTION_FLAGS属性。

       我们注意到有一个 MMSECTION_FLAGS,这是表示内存段的属性,我们要修改的内容就在这里。

       偏移为 +0x24(通过WRK中结构体的定义推断出)。

       kd> dd e153b150+18+24
        e153b18c  00000020

       其为 20,正好对应的是R3环的定义(R3环申请内存时页面保护与_MMVAD_FLAGS.Protection位的对应关系)

        #define PAGE_EXECUTE_READ       0x20 
       我们将其修改为 PAGE_EXECUTE_READWRITE  0x40

        ed dd e153b150+18+24 40

      7)至此,我们第一步已经完成,下面我们来修改 _MMVAD_FLAGS.Protection即可。

    2.修改 _MMVAD_FLAGS.Protection属性

      这里比较简单,我们之前写过一篇博客。

      根据那篇博客中的描述,很好的修改 _MMVAD_FLAGS.Protection属性

      ---》VAD树的属性及其遍历《---

    3.修改结果

      本来,我们这篇 利用内存锁定方式页面修改 中无法修改的内存,最终发现可以被修改了。

       

     4.后记

      注意:对于一般Private之类的内存,我们并不需要修改 _SECTION.MMSECTION_FLAGS,只改_MMVAD_FLAGS.Protection即可。

  • 相关阅读:
    新闻发布系统之 登陆注销
    readonly和const的区别
    c#中文件流的读写
    解决jsp两种提交方式乱码 的方法
    B/S 和 C/S两种架构
    App.config的典型应用
    接口实现多态
    Spring概念
    在Spring的核心配置文件applicationContext.xml中配置事务,主要配置三大方面:事务管理器、事务通知和定义事务性切面。
    乱码问题解决方案
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11749140.html
Copyright © 2020-2023  润新知