首页
社区
课程
招聘
分享一下win10的内存压缩
发表于: 2021-11-4 19:48 8115

分享一下win10的内存压缩

2021-11-4 19:48
8115

这个内存压缩(memory compressed)在主流的操作系统上都有,但这个帖子只针对windows,理解一下。

 

以前我是不知道内存压缩这个东西的,最近在hook的时候,发现
图片描述

 

代码进分页(这里其实不是分页)是很正常的,我就没在意。

 

按照windows对分页的设计,

 

图片描述

 

高32位对应的是ReadOffset,应该是0xFEF3,windbg解析成0xdef3,然后PageFile是2(下标为2,意味着存在3个分页文件),但是win8以后PageFile就2个,一个叫PageFile.sys,一个叫swapfile.sys。而且你可以看一下c盘下的pagefile.sys比win7小得多,很多win10机子甚至都不开这个虚拟内存文件,swapfile就更小了。

 

然后我为了验证windbg解析有什么特殊之处,还是我弄错了什么,我试着把pagefile.sys拷贝出来,然后拿winhex到具体偏移地方看了下,发现2个地方都不对。

 

然后我就去研究windows分页文件的相关结构存储在哪里。

 

MI_PARTITION MiSystemPartition;

 

上面这个变量你可以IDA里搜的到,至于这个变量是咋找的,虚拟内存文件的句柄肯定是关机之后才逐个关闭的,那么ida ctrl+f MiShutdownSystem,然后稍微找找就找到了。

 

后面查资料,发现windows有个东西叫Memory partitions的东西,而且win还给用户层暴露了接口,在用户层可以通过NtOpenPartition像NtOpenSection一样访问一片内存,对应的对象类型是PsPartitionType,但是这玩意具体跟shard memory啥区别目前不知道。

 

在介绍第三个分页文件之前,我们得先把前2个找出来。

 

MiSystemPartition.Vp.PagingFile[16]存放着当前操作系统维护的分页文件。
图片描述

 

看着似乎确实是有三个。

 

第一个。
图片描述

 

第二个。
图片描述

 

第三个。

 

图片描述

 

可以看到第三个是很奇怪的,PageFileName为空就算了,File域也为0,那么发生页错误,去哪里找内容?

 

第一时间先找MmAccessFault,然后MiResolvePageFileFault,然后到MiIssueHardFault,代码太多,给大家简化一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
__int64 __fastcall MiReferenceInPageFile(_MMINPAGE_SUPPORT *PageSupport, unsigned int SessionIdForVa)
{
    return PageSupport->ControlArea.FilePointer;
}
 
__int64 __fastcall MiIssueHardFault(
__int64 FaultAddress, _MMINPAGE_SUPPORT *PageSupport)
{
    _FILE_OBJECT PageFileObject = MiReferenceInPageFile(PageSupport, SessionIdForVa);
    if(PageFileObject)
    {
        PageSupport->FilePointer = PageFileObject;
        IoPageReadEx(
            PageSupport->FilePointer,
            PageSupport->Mdl,
            PageSupport->ReadOffset,
            PageSupport->Event,
            PageSupport->IoStatus,
            MMINPAGE_FLAGS,
            0);
    }
    else
    {
        SMKM_STORE_MGR_SM_TRAITS_::SmPageRead
                                     (&a1->ReadOffset, Mdl);
    }
 
}

很明显,按照原本的思路的话肯定FilePointer为空,没有任何页面文件支持的。

 

那么明显会走类成员函数SmPageRead,这个其实就是windows内存压缩的核心API,内部通过一系列内部API访问一个BTree,具体是哪种数据结构,可以自行去看看。

 

看他的符号名字,我去查了一下这个STORE_MGR,啥也没查到

 

有篇内存压缩的技术贴参考一下
https://www.mandiant.com/resources/finding-evil-in-windows-ten-compressed-memory-part-one

 

好像说这个能隐藏一些内存。

 

具体能干啥大家可以自己研究一下,还有一点就是如果开启了内存压缩的话,pagefile.sys就不大了,而且大多数都是访问那个压缩内存,但是行为和被处理方式跟缺页是一摸一样的。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//