通过修改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即可。
通过修改VAD属性破除锁页机制的更多相关文章
- 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁
转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...
- mysql查询更新时的锁表机制分析
为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...
- 转 MySQL中的行级锁,表级锁,页级锁
对mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表锁概念的理解 转载. https://blog.csdn.net/puhaiyang/article/details/72284702 实验环境 ...
- mysql查询更新时的锁表机制分析(只介绍了MYISAM)
为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...
- 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型
1 守护进程: 主进程 创建 守护进程 辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...
- Oracle锁的机制
一.为什么要有锁的机制 我们都知道数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破 ...
- MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
- 【转】MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
随机推荐
- C++构造函数的几种使用方法
在C++中,有一种特殊的成员函数,他的名字和类相同,没有返回值,不需要用户显示调用,用户也无法调用,而是在创建对象的时候自动执行. 这种特殊的函数就是构造函数 Constructor 构造函数的名字与 ...
- python利用setsockopt获得端口重用
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) 假如端口呗socket使用过,并且利用socket.close()来关闭连接,但此时端口还没有释放,要经过一个 ...
- 线程提供了一个方法:void join() ,join可以协调线程之间的同步运行。
package seday09; /** * @author xingsir * 线程提供了一个方法:void join() ,join可以协调线程之间的同步运行. * 此方法允许执行这个方法的线程在 ...
- Java连载62-使用throws关键字处理异常
一.处理异常的两种方式 1.所有的编译时异常,要求程序员在编写程序阶段,必须对它进行处理,如果不处理的话,编译就会无法通过,处理异常有两种方法:捕捉和声明抛出. 2.捕捉:try.....catch ...
- springcloud 微服务分布式 框架源码 activiti工作流 前后分离
1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...
- FlowPortal:流程节点定义有误,合流节点"合流"没有对应的聚焦节点
FB版本:6.00c 报错: 流程节点定义有误,合流节点"合流"没有对应的聚焦节点 解决办法:分流和合流之间的节点不能有其他节点汇入.调整如下后,成功保存.
- Centos系统镜像安装
一.下载Centos版本 官网地址:http://isoredirect.centos.org/centos 二.制作U盘启动镜像 1.下载安装win32diskimager,用于制作U盘启动镜像,点 ...
- SpringBoot集成swagger2.0
最近项目里要用到SpringBoot + swagger,查了其他小伙伴们的资料,或多或少有点问题,在此我再梳理一遍. 1.maven依赖 <parent> <groupId> ...
- java使用htmlunit工具抓取js中加载的数据
htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实现.这个没有界面的浏览器,运行速度 ...
- 【Objective-C】探索Category底层的实质
无论一个类设计的多么完美,在未来的需求演进中,都有可能会碰到一些无法预测的情况.那怎么扩展已有的类呢?一般而言,继承和组合是不错的选择.但是在Objective-C 2.0中,又提供了category ...