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