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

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

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

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

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

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

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

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

一、修改 _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即可。

二、修改 _MMVAD_FLAGS.Protection属性

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

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

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

三、修改结果

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

   

四、后记

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

原文地址:https://www.cnblogs.com/onetrainee/p/11749140.html

时间: 2024-10-10 20:44:18

通过修改VAD属性破除锁页机制的相关文章

mysql查询更新时的锁表机制分析(只介绍了MYISAM)

为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁:InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁. MySQL这3种锁的特性可大致归纳如下: 表级锁:开销小,加

mysql查询更新时的锁表机制分析

为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁:InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁. MySQL这3种锁的特性可大致归纳如下: 表级锁:开销小,加

开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型

开启子进程的两种方式 # # # 方式一: # from multiprocessing import Process # import time # # def task(x): # print('%s is running' %x) # time.sleep(3) # print('%s is done' %x) # # if __name__ == '__main__': # # Process(target=task,kwargs={'x':'子进程'}) # p=Process(tar

[数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的

java反射调用私有方法和修改私有属性

//调用私有方法package com.java.test; public class PrivateMethod { private String sayHello(String name) { return "hello "+name; } } 测试: package com.java.test; import java.lang.reflect.Method; public class PrivateMethodTest { public static void main(Str

【转】MySQL中的行级锁,表级锁,页级锁

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的开销也最大.行级锁分为共享锁 和 排他锁. 特点 开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲

修改浏览器属性配置的作用---开发机上解决跨域的方式

开发阶段解决跨域问题,可以通过修改浏览器属性配置,来关闭浏览器的同源策略保护机制,从而实现解决跨域问题,有下面三种方式:1. MAC系统,终端输入代码段 "open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir=/Users/admin/MyChromeDevUserData/" 2.window系统,cmd输入代码段 "C:\Program Files (

可重入锁的机制

1.听故事把知识掌握了 在一个村子里面,有一口井水,水质非常的好,村民们都想打井里的水.这井只有一口,村里的人那么多,所以得出个打水的规则才行.村长绞尽脑汁,最终想出了一个比较合理的方案,咱们来仔细的看看聪明的村长大人的智慧. 井边安排一个看井人,维护打水的秩序. 打水时,以家庭为单位,哪个家庭任何人先到井边,就可以先打水,而且如果一个家庭占到了打水权,其家人这时候过来打水不用排队.而那些没有抢占到打水权的人,一个一个挨着在井边排成一队,先到的排在前面.打水示意图如下 : 是不是感觉很和谐,如果

线程同步机制之互斥锁通信机制

#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <string.h> void *thread_function(void *arg); pthread_mutex_t work_mutex; #define WORK_SIZE 1024 char work_area[WORK_SIZE]; int time_to_exit=0; int main(int argc,