记一次 .NET某收银软件 非托管泄露分析.docxVIP

  • 1
  • 0
  • 约5.21千字
  • 约 7页
  • 2025-05-16 发布于四川
  • 举报

记一次 .NET某收银软件 非托管泄露分析.docx

记一次.NET某收银软件非托管泄露分析

---LargestRegionbyUsage-----------BaseAddress--------RegionSize----------

Heap38be0000fd0000(15.812MB)

unknowncc60007fd9000(127.848MB)

Freef759000088bf000(136.746MB)

Image5ab2c000e41000(14.254MB)

Other8cee0007fb0000(127.688MB)

Stackfd000(1012.000kB)

TEBffe510001000(4.000kB)

PEBfffde0001000(4.000kB)

从卦中看,3G的提交内存,Heap吃了2.3G,也就表明是NTHEAP的泄露,这是一块非托管内存区域,一般都是C/C++语言用malloc或者new分配的内存,接下来深挖下NTHEAP即可,使用!heap-s命令。

0:000!heap-s

SEGMENTHEAPERROR:fAIledtoinitializetheextention

NtGlobalFlagenablesfollowingdebuggingaidsfornewheaps:

stackbacktraces

LFHKey:0x7c31b93c

Terminationoncorruption:DISABLED

HeapFlagsReservCommitVirtFreeListUCRVirtLockFast

(k)(k)(k)(k)lengthblockscont.heap

-----------------------------------------------------------------------------0800000217830413817217830442165174756034LFH

Externalfragmentation30%(1747freeblocks)

006c000010882241088188200LFH08041002256425621100

006a000031361184313615382300LFH

Externalfragmentation12%(82freeblocks)0800100210882241088188200LFH08001002218515221794322185152442132313900LFH

从卦中信息看了2.18G,也就表明它是吃内存的主力,这里简单说一下默认的进程堆,除了这个之外都是用非托管代码调用Win32API的HeapCreate方法创建出来的,接下来就得看下是什么代码创建的。

2.到底是谁创建的

要想知道是谁创建的,一定要在注册表中开启ust选项,大家可以了解下gflags.exe工具,参考如下:

PSC:\Users\Administrator\Desktopgflags/iExample_17_1_7.exe+ust

CurrentRegistrySettingsforExample_17_1_7.exeexecutableare:ust-Createusermodestacktracedatabase

开启之后win32api的HeapAlloc方法的内部中会到注册表中看一下是否有ust值,如果有就会记录分配的调用栈,这样就知道是谁创建的,抓取dump后可以用windbg的!gflag命令看下是否开启成功,参考输出如下:

0:000!gflag

CurrentNtGlobalFlagcontents:0ust-Createusermodestacktracedatabase

接下来对Heap行一个block分组,看下是否有一些有价值的信息。

0:000!heap-stat

文档评论(0)

1亿VIP精品文档

相关文档