-
-
分享一下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就不大了,而且大多数都是访问那个压缩内存,但是行为和被处理方式跟缺页是一摸一样的。
赞赏
- 分析一个前段时间中招的恶意木马 11003
- 分享一个搭好的ida lumina服务器 10700
- vmp2代码还原分享 10909
- 记录一次vmp2.xdemo的分析 25815
- 分享一下UEFI固件的启动流程-SEC阶段 9602