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

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

技术学习来源:火哥(QQ:471194425)数据结构

注释:由于本身的知识有限,在句柄那块说的不是很清除,在学习相关知识以后会自行补上。学习

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

  对于通常的页属性修改,咱们直接修改_MMVAD_FLAGS.Protection便可。3d

  可是,若是有锁页机制,单纯改这个是没法实现目的的。(具体状况参见:利用内存锁定方式页面修改htm

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

1、修改 _SECTION.MMSECTION_FLAGSblog

      一个 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便可。

相关文章
相关标签/搜索