通过修改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引 ...
随机推荐
- 1、采用SD启动盘bootingLinux
一.准备条件 1.Arrow Sockit 开发板: 2.主机:可以是Linux系统,也可以是windows系统: 3.可以让主机识别的SD卡,不管是用读卡器还是用主机上的卡槽,内存4G以上 二.创建 ...
- re常用模块
re模块:从字符串里面找到特定的字符串 re的基本语法(匹配规则) import re s = '王大炮打炮被大炮打死了 王大炮打炮被大炮打死了' ^:开头 print(re.findall('^王大 ...
- eclipse 导入别人拷贝过来的工作空间项目
切换自己的工作空间 File --> Import --> Existing Project into Workspace --> 选择项目根目录 --> 确定 如果你的ecl ...
- ajax添加请求头(添加Authorization字段)
我们在发AJAX请求的时候可能会需要自定义请求头,在jQuery的$.ajax()方法中提供了beforeSend属性方便我们进行此操作. beforeSend: function(request) ...
- Gradle-任务
任务结果标签 当 Gradle 执行一个任务时,它会在控制台和 Tooling API 根据任务结果给任务打标签. 这些标签是根据任务是否有操作,是否应该执行操作,是否执行了操作以及这些操作做了哪些改 ...
- django-建表出现的错误
在执行python3 manage.py migrate时出现以下错误 ?: (mysql.W002) MySQL Strict Mode is not set for database connec ...
- Spring Cloud @RefreshScope刷新问题
问题 使用@RefreshScope会刷新在sprign ioc中所有bean中使用@Value的值,但是在配置类中使用方法去配置的其他类参数并不会改变例如 解决方案 //使用此方法监听事件 @Eve ...
- .NET Core AES-CCM&AES-GCM加密算法
一. 前言 关于 CCM 以及 GCM 看此文( CCM和GCM )或者直接搜索网上资料. .NET Core 3.0 实现了对AES-GCM和AES-CCM加密的支持.这些算法既是带有关联数据的身份 ...
- Apollo 分布式配置中心(补充)
1. Namespace 1.1. 什么是Namespace Namespace是配置项的集合,类似于一个配置文件的概念. Apollo在创建项目的时候,都会默认创建一个“application ...
- C#封装继承
面向对象开发有三大特性(特点 / 特征) : 封装, 继承, 多态.我们今天主要讨论封装和继承,多态会在下篇中讨论. 一.封装: 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法 ...