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即可。

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

  1. 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁

    转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...

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

    为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...

  3. 转 MySQL中的行级锁,表级锁,页级锁

      对mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表锁概念的理解 转载. https://blog.csdn.net/puhaiyang/article/details/72284702 实验环境 ...

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

    为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...

  5. 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型

    1  守护进程: 主进程 创建 守护进程   辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...

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

    注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...

  7. Oracle锁的机制

    一.为什么要有锁的机制 我们都知道数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破 ...

  8. MySQL中的行级锁,表级锁,页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...

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

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...

随机推荐

  1. VMware Fushion解决:与vmmon模块的版本不匹配: 需要385.0,现有330.0。

    可以按下列步骤解决: 1. 退出VMware fusion2. 打开[终端]3. 执行命令:sudo rm -rf /System/Library/Extensions/vmmon.kext ,根据提 ...

  2. 为什么要使用Unix时间戳

    概念: UNIX时间戳:Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp) 是从1970年1月1日(UTC/GMT的午夜)开始 ...

  3. 《Java基础知识》Java变量的声明、初始化和作用域

    一.Java变量的声明 在 Java 程序设计中,每个声明的变量都必须分配一个类型.声明一个变量时,应该先声明变量的类型,随后再声明变量的名字.下面演示了变量的声明方式. double salary; ...

  4. 《Java基础知识》Java 泛型详解

    JDK 1.5 之后,Java 通过泛型解决了容器类型安全这一问题,而几乎所有人接触泛型也是通过Java的容器.那么泛型究竟是什么? 泛型的本质是参数化类型:也就是说,泛型就是将所操作的数据类型作为参 ...

  5. React: 研究Redux的使用

    一.简介 在上一篇文章中,大概讲了下Flux设计模式的使用,在末尾顺便提了一些基于Flux的脚本库,其中Redux已经毋庸置疑地成为了众多脚本库的翘楚之一.是的,Redux是基于Flux开发的,Red ...

  6. C#8.0中新特性之一:结构readonly成员

    结构struct成员支持readonly,用来限制被其修饰的成员不会改变结构的内部状态.加上7.2版本添加的readonly struct和ref readonly方法返回以及之前的字段声明修饰作用, ...

  7. day 28-1 元类

    元类 元类的用途:自定义元类控制类的创建行为及类的实例化行为 Python 中一切皆为对象. 一切接对象,对象可以怎么用呢? 1.都可以被引用,x=obj 2.都可以当作函数的参数传入 3.都可以当作 ...

  8. abp模块生命周期设计思路剖析

    abp中将生命周期事件抽象为4个接口: //预初始化 public interface IOnPreApplicationInitialization { void OnPreApplicationI ...

  9. SpringCloud-使用路由网关统一访问接口(附代码下载)

    场景 SpringCloud-使用熔断器仪表盘监控熔断: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102673599 Spr ...

  10. 【iOS翻译】App启动时的响应过程

    Responding to the Launch of Your App Initialize your app’s data structures, prepare your app to run, ...