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