探讨关于MiAllocatePool申请内存的部分算法
无需任何API枚举信息
下文描述的调用过程:MiAllocatePool->ExpAllocatePoolWithTagFromNode->ExAllocateHeapPool->RtlpHpLfhSlotAllocate
非分页内存下
首先让我们回顾一下VAD树

不知道有没有细心的师傅们观察过_MMVAD结构这个地址是存在一个非常有规律的内存布局
当有模块的情况下

我们仔细观察发现 它是一个极其规律的布局形式
既然存在这么一块区域,我们就可以遍历
如何找到想要的区域起始位置?
这里微软给出了答案:
在RtlpHpLfhSlotAllocate下的

就是想要的起始位置
我们向上看发现
继续看AffinitySlotPtr_buffer来源
来源于第三个参数,追回到上一层
其第三个参数是一个算法过程:
这里有几个参数过程很麻烦 很复杂这里给各位整理之后的算法 (Windows 10 21H2 19044)
这样我们就精准的定位到了这块区域的起始位置,当然逆向出算法仅仅是一种提高效率的方法,还有很多暴力搜索的方法各位师傅们可以自行探索,这里暂时不作研究
有了起始地址之后,我们就可以进行内存暴力搜索,这里就比较容易
举个例子,我们要得到MMVAD结构的模块信息,只需要在这块内存中

找到这个Vad的码然后+0x10的位置就是 MMVAD Address
那么MMVAD+0x70的位置然后 &~0xf 就是EPROCESS 这里可以用作枚举进程
当然这里是不同的内存区域情况,不仅局限于VAD还有更多的信息不言而喻>>>
Base_Before
=
*
(_QWORD
*
)(AffinitySlotPtr_buffer
+
0x38
);
SubsegmentBaseAddress
=
Base_Before &
0xFFFFFFFFFFFFF000ui64
;
Base_Before
=
*
(_QWORD
*
)(AffinitySlotPtr_buffer
+
0x38
);
SubsegmentBaseAddress
=
Base_Before &
0xFFFFFFFFFFFFF000ui64
;
unsigned __int64 __fastcall RtlpHpLfhSlotAllocate(
__int64 LfhContextPtr,
__int64 BucketPtr,
__int64 AffinitySlotPtr,
unsigned
int
AlignedBlockSize,
unsigned
int
AllocationFlags)
unsigned __int64 __fastcall RtlpHpLfhSlotAllocate(
__int64 LfhContextPtr,
__int64 BucketPtr,
__int64 AffinitySlotPtr,
unsigned
int
AlignedBlockSize,
[注意]看雪招聘,专注安全领域的专业人才平台!
最后于 2025-4-9 20:00
被S极客编辑
,原因: