制作精美网站建设口碑好,网站开发工具最好用,网站排名优化技巧,ppt模板下载网址一#xff1a;背景
1. 讲故事
前几天有位朋友找到我#xff0c;说他的机器内存在不断的上涨#xff0c;但在任务管理器中查不出是哪个进程吃的内存#xff0c;特别奇怪#xff0c;截图如下#xff1a; 在我的分析旅程中都是用户态模式的内存泄漏#xff0c;像上图中的…一背景
1. 讲故事
前几天有位朋友找到我说他的机器内存在不断的上涨但在任务管理器中查不出是哪个进程吃的内存特别奇怪截图如下 在我的分析旅程中都是用户态模式的内存泄漏像上图中的异常征兆已经明确告诉你了不是用户态程序吃的内存那就是内核态程序吃的比如
某些驱动程序操作系统
从概率上来说一般都是某些第三方程序内存泄露导致的这一篇我们就来聊一聊这种问题该如何解决。
二内核模式堆泄露分析
1. 驱动程序是如何分配内存的
相信有很多朋友都知道用户态的程序是直接或者间接的调用 VirtualAlloc 方法来向操作系统要内存包括 C# 的 GC 堆也是一样它的方法签名如下 LPVOID VirtualAlloc([in, optional] LPVOID lpAddress,[in] SIZE_T dwSize,[in] DWORD flAllocationType,[in] DWORD flProtect
);
那内核中的驱动程序是如何向操作系统要内存的呢一般都是调用 ExAllocatePool2 方法来要内存的签名如下 DECLSPEC_RESTRICT PVOID ExAllocatePool2(POOL_FLAGS Flags,SIZE_T NumberOfBytes,ULONG Tag
);
上面有两个参数要详细解释一下
Flags 参数
一般用的多的就是 POOL_FLAG_NON_PAGED 和 POOL_FLAG_PAGED 两种前者表示分配的内存是需要永久驻留内存不可以交换到硬盘的。后者分配的内存是可以交换到硬盘的。
Tag 参数
这个参数的本意就是方便日后洞察内存泄露的它强行让一块内存和这个 Tag(4byte的ascii 字符串) 做了强绑定到时候通过这个 tag 就知道是谁分配的内存。
2. 制造内核模式堆泄露
为了能够让驱动程序泄露可以使用微软提供的 NotMyFault 工具这个工具利用 myfault.sys 驱动不断的向操作系统分配内存。官方网址为https://learn.microsoft.com/zh-cn/sysinternals/downloads/notmyfault
打开 myfault 工具然后输入 40M/s 的泄露并分配在非换页池中同时配置下内核态转储dump 代码和截图参考如下 ExAllocatePool2(POOL_FLAG_NON_PAGED,40*1024*1024,Leak); 在泄露的过程中通过 Process Explorer 很明显的发现提交了 6.7G 的内存其中有 4.9G 是在 NonPaged 中即通过上图中的 POOL_FLAG_NON_PAGED 标记分配的截图如下 接下来在 MyFault 上切换到 Crash 选项卡强行让操作系统蓝屏来生成 dump 文件。
3. dump 分析
拿到dump后先通过 !vm 观察下操作系统级的虚拟内存的分布情况。 3: kd !vm
...
Physical Memory: 2069421 ( 8277684 Kb)
Available Pages: 445015 ( 1780060 Kb)
ResAvail Pages: 707292 ( 2829168 Kb)
Locked IO Pages: 0 ( 0 Kb)
Free System PTEs: 4295052431 (17180209724 Kb)
...
Modified Pages: 11479 ( 45916 Kb)
Modified PF Pages: 11479 ( 45916 Kb)
Modified No Write Pages: 0 ( 0 Kb)
NonPagedPool Usage: 1219892 ( 4879568 Kb)
NonPagedPoolNx Usage: 24512 ( 98048 Kb)
NonPagedPool Max: 4294967296 (17179869184 Kb)
PagedPool Usage: 32907 ( 131628 Kb)
PagedPool Maximum: 4294967296 (17179869184 Kb)
...
NonPagedPool Commit: 1246469 ( 4985876 Kb)
...
Sum System Commit: 1409562 ( 5638248 Kb)
Total Private: 279673 ( 1118692 Kb)********** Sum of individual system commit Process commit exceeds overall commit by 1952 Kb ? ********
Committed pages: 1688747 ( 6754988 Kb)
Commit limit: 4166573 ( 16666292 Kb)
从卦中的 NonPagedPool Usage 指标可以看到当前的 非换页池 占用了 4.8G 内存总计 121w 的内存页。
接下来就是要深挖下 非换页池 看看到底都是什么 Tag 分配的可以使用 !poolused 2 命令。 3: kd !poolused 2
....Sorting by NonPaged Pool ConsumedNonPaged PagedTag Allocs Used Allocs UsedLeak 119 4991221760 0 0 UNKNOWN pooltag Leak, please update pooltag.txtConT 238 14499840 0 0 UNKNOWN pooltag ConT, please update pooltag.txtKETR 16410 8117664 0 0 UNKNOWN pooltag KETR, please update pooltag.txtEtwB 196 7565568 2 131072 Etw Buffer , Binary: nt!etw2872 6 5660864 0 0 UNKNOWN pooltag 2872, please update pooltag.txt287R 1026 4183040 0 0 UNKNOWN pooltag 287R, please update pooltag.txtFile 9734 3877408 0 0 File objects Thre 1257 3217920 0 0 Thread objects , Binary: nt!psEtwR 12141 2672640 0 0 Etw KM RegEntry , Binary: nt!etw
...
从卦中数据看有一个神秘的 TagLeak 的内存分配它分配了 119 次总大小 4.99G。 哈哈其实就是刚才通过 MyFault 做的 40M/s 的内存分配。
接下来的问题是这个 Leak 是哪一个驱动程序所为呢最简单的办法就是在各个驱动的内存空间中做内存搜索看看谁里面有 Leak 的asc硬编码对吧有了这个思路先用 lm 看看里面都有哪些 sys 。 3: kd lm
start end module name
ffffc25c891b0000 ffffc25c89480000 win32kbase (deferred)
ffffc25c8a190000 ffffc25c8a545000 win32kfull (deferred)
...
fffff80722600000 fffff80723646000 nt (pdb symbols)
fffff80723c00000 fffff80723d16000 clipsp (deferred)
fffff80747f30000 fffff80747f4b000 monitor (deferred)
fffff80747f50000 fffff80747f59000 myfault (deferred)
... Unloaded modules:
fffff8073c6e0000 fffff8073c6ec000 360Sensor64.sys
fffff80731550000 fffff80731560000 dump_storport.sys
fffff807315a0000 fffff807315d3000 dump_storahci.sys
fffff80731000000 fffff8073101e000 dump_dumpfve.sys
fffff80726b80000 fffff80726bac000 luafv.sys
fffff80726b20000 fffff80726b30000 dump_storport.sys
fffff80726b70000 fffff80726ba3000 dump_storahci.sys
fffff80726bd0000 fffff80726bee000 dump_dumpfve.sys
fffff80728130000 fffff8072814c000 dam.sys
fffff80724200000 fffff8072420a000 360elam64.sys
fffff80725230000 fffff80725241000 hwpolicy.sys
接下来就是写脚本在每个 sys 的 start ~ end 区间做 s 搜索这个脚本我就不放了非常简单最终就在 myfault.sys 中成功找到了 Leak 硬编码参考如下 3: kd lmvm myfault
Browse full module list
start end module name
fffff80747f50000 fffff80747f59000 myfault (deferred) Image path: \??\C:\Windows\system32\drivers\myfault.sysImage name: myfault.sysBrowse all global symbols functions dataTimestamp: Fri Sep 30 00:17:31 2022 (6335C51B)CheckSum: 00010CEDImageSize: 00009000Translations: 0000.04b0 0000.04e4 0409.04b0 0409.04e4Information from resource tables:3: kd ? fffff80747f59000 - fffff80747f50000
Evaluate expression: 36864 00000000000090003: kd s -a fffff80747f50000 L?0x9000 Leak
fffff80747f51559 4c 65 61 6b 0f 42 c1 41-8d 49 fd 8b d0 ff 15 0c Leak.B.A.I......
fffff80747f515c7 4c 65 61 6b 0f 42 c1 33-c9 8b d0 ff 15 a0 1a 00 Leak.B.3........
三: 总结
在过往的dump分析中都是用户态程序的泄露内核态模式堆的的泄露还是第一次分析不是朋友提供的这次机会真的就没缘分啦在这次dump分析过程中也让大家看到了 windbg 是多么的强大 文章转载自: http://www.morning.lpmlx.cn.gov.cn.lpmlx.cn http://www.morning.qkdjq.cn.gov.cn.qkdjq.cn http://www.morning.qysnd.cn.gov.cn.qysnd.cn http://www.morning.nqcwz.cn.gov.cn.nqcwz.cn http://www.morning.bmts.cn.gov.cn.bmts.cn http://www.morning.qsmch.cn.gov.cn.qsmch.cn http://www.morning.qjtbt.cn.gov.cn.qjtbt.cn http://www.morning.lzqdl.cn.gov.cn.lzqdl.cn http://www.morning.rcdmp.cn.gov.cn.rcdmp.cn http://www.morning.ryjl.cn.gov.cn.ryjl.cn http://www.morning.smrty.cn.gov.cn.smrty.cn http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn http://www.morning.lkbyj.cn.gov.cn.lkbyj.cn http://www.morning.kjdxh.cn.gov.cn.kjdxh.cn http://www.morning.ohmyjiu.com.gov.cn.ohmyjiu.com http://www.morning.ljdhj.cn.gov.cn.ljdhj.cn http://www.morning.pxlql.cn.gov.cn.pxlql.cn http://www.morning.rbgqn.cn.gov.cn.rbgqn.cn http://www.morning.ydhmt.cn.gov.cn.ydhmt.cn http://www.morning.hcqpc.cn.gov.cn.hcqpc.cn http://www.morning.sqfrg.cn.gov.cn.sqfrg.cn http://www.morning.jbpdk.cn.gov.cn.jbpdk.cn http://www.morning.cytr.cn.gov.cn.cytr.cn http://www.morning.smkxm.cn.gov.cn.smkxm.cn http://www.morning.nykzl.cn.gov.cn.nykzl.cn http://www.morning.httpm.cn.gov.cn.httpm.cn http://www.morning.junmap.com.gov.cn.junmap.com http://www.morning.xtxp.cn.gov.cn.xtxp.cn http://www.morning.hrrmb.cn.gov.cn.hrrmb.cn http://www.morning.wsnjn.cn.gov.cn.wsnjn.cn http://www.morning.ynstj.cn.gov.cn.ynstj.cn http://www.morning.kwnnx.cn.gov.cn.kwnnx.cn http://www.morning.mqfkd.cn.gov.cn.mqfkd.cn http://www.morning.wmgjq.cn.gov.cn.wmgjq.cn http://www.morning.jklns.cn.gov.cn.jklns.cn http://www.morning.gzgwn.cn.gov.cn.gzgwn.cn http://www.morning.jfqqs.cn.gov.cn.jfqqs.cn http://www.morning.bzpwh.cn.gov.cn.bzpwh.cn http://www.morning.tddrh.cn.gov.cn.tddrh.cn http://www.morning.hgfxg.cn.gov.cn.hgfxg.cn http://www.morning.nqmdc.cn.gov.cn.nqmdc.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.tnbsh.cn.gov.cn.tnbsh.cn http://www.morning.bqwrn.cn.gov.cn.bqwrn.cn http://www.morning.mdpcz.cn.gov.cn.mdpcz.cn http://www.morning.ytrbq.cn.gov.cn.ytrbq.cn http://www.morning.rqmr.cn.gov.cn.rqmr.cn http://www.morning.xsszn.cn.gov.cn.xsszn.cn http://www.morning.zzgkk.cn.gov.cn.zzgkk.cn http://www.morning.znqztgc.cn.gov.cn.znqztgc.cn http://www.morning.qysnd.cn.gov.cn.qysnd.cn http://www.morning.nwpnj.cn.gov.cn.nwpnj.cn http://www.morning.yrhd.cn.gov.cn.yrhd.cn http://www.morning.qxlyf.cn.gov.cn.qxlyf.cn http://www.morning.dwzwm.cn.gov.cn.dwzwm.cn http://www.morning.czzpm.cn.gov.cn.czzpm.cn http://www.morning.tgwfn.cn.gov.cn.tgwfn.cn http://www.morning.sjftk.cn.gov.cn.sjftk.cn http://www.morning.hpspr.com.gov.cn.hpspr.com http://www.morning.bfbl.cn.gov.cn.bfbl.cn http://www.morning.rwfp.cn.gov.cn.rwfp.cn http://www.morning.xjnw.cn.gov.cn.xjnw.cn http://www.morning.tldfp.cn.gov.cn.tldfp.cn http://www.morning.rzcmn.cn.gov.cn.rzcmn.cn http://www.morning.ntkpc.cn.gov.cn.ntkpc.cn http://www.morning.rfbpq.cn.gov.cn.rfbpq.cn http://www.morning.sfmqm.cn.gov.cn.sfmqm.cn http://www.morning.klzdy.cn.gov.cn.klzdy.cn http://www.morning.rtqyy.cn.gov.cn.rtqyy.cn http://www.morning.ymqfx.cn.gov.cn.ymqfx.cn http://www.morning.rwcw.cn.gov.cn.rwcw.cn http://www.morning.wfhnz.cn.gov.cn.wfhnz.cn http://www.morning.znnsk.cn.gov.cn.znnsk.cn http://www.morning.shsh1688.com.gov.cn.shsh1688.com http://www.morning.jpnw.cn.gov.cn.jpnw.cn http://www.morning.ypwlb.cn.gov.cn.ypwlb.cn http://www.morning.kkrnm.cn.gov.cn.kkrnm.cn http://www.morning.rpzth.cn.gov.cn.rpzth.cn http://www.morning.fqzz3.cn.gov.cn.fqzz3.cn http://www.morning.wljzr.cn.gov.cn.wljzr.cn