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

分享一下win10的内存压缩

2021-11-4 19:48
8425

这个内存压缩(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,啥也没查到

 

有篇内存压缩的技术贴参考一下
a5dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2E0j5h3&6V1K9h3q4F1N6q4)9J5k6h3y4G2L8g2)9J5c8Y4u0W2M7$3!0#2M7X3y4W2M7#2)9J5c8X3k6A6L8X3c8A6L8X3N6Q4x3X3c8W2N6X3W2D9i4K6u0V1K9h3&6Q4x3X3c8%4K9h3&6V1L8%4N6K6i4K6u0V1N6r3g2F1i4K6u0V1j5$3!0E0M7s2u0W2M7%4y4W2k6q4)9J5k6r3#2W2L8h3!0J5P5g2)9J5k6s2m8S2M7Y4c8Q4x3X3c8G2L8X3f1`.

 

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

 

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


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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