记一次 .NET 某工控视觉软件 非托管泄漏分析( 三 )

我去,卦中出现了不愿看到的 Unable to read nt!_HEAP_VIRTUAL_ALLOC_ENTRY structure at 0000000043500000,也就是说显示不出 _HEAP_VIRTUAL_ALLOC_ENTRY 结构,可以用 dt 验证一下 。
0:000> dt nt!_HEAP_VIRTUAL_ALLOC_ENTRYSymbol nt!_HEAP_VIRTUAL_ALLOC_ENTRY not found.为什么在他的机器上没记录到,可能和它生产服务器的 Windows 系统有关 , 这里就不细究原因,接下来的问题是: !heap 命令失效,该怎么把 VirtualAllocdBlocks 给挖出来呢?只能纯人肉了...
3. 如何人肉挖 VirtualAllocdBlocks要想人肉挖,需要一些底层知识 , 比如下面三点 。

  1. VirtualAllocdBlocks 是什么?
VirtualAllocdBlocks 是一个记录大块内存的双向链表结构 , 可以用 dt nt!_HEAP 0000000029fb0000 命令从 HEAP 中找出来 。
0:000> dt nt!_HEAP 0000000029fb0000ntdll!_HEAP   +0x118 VirtualAllocdBlocks : _LIST_ENTRY [ 0x00000000`43500000 - 0x00000000`32970000 ]   +0x128 SegmentList      : _LIST_ENTRY [ 0x00000000`29fb0018 - 0x00000000`5c380018 ]   ...0:000> dt _LIST_ENTRY 0000000029fb0000+0x118ntdll!_LIST_ENTRY [ 0x00000000`43500000 - 0x00000000`32970000 ]   +0x000 Flink            : 0x00000000`43500000 _LIST_ENTRY [ 0x00000000`47240000 - 0x00000000`29fb0118 ]   +0x008 Blink            : 0x00000000`32970000 _LIST_ENTRY [ 0x00000000`29fb0118 - 0x00000000`4ee90000 ]从卦中可以看到 ,  VirtualAllocdBlocks 是一个拥有 Flink 和 Blink 的双向链表结构 。
  1. _HEAP_VIRTUAL_ALLOC_ENTRY  是什么?
我们都知道 heap 的 block <512k 是 _HEAP_ENTRY 结构,那 block >512k 的块就是 _HEAP_VIRTUAL_ALLOC_ENTRY 结构,不信的话可以用 dt 导出来 。
0:016> dt nt!_HEAP_VIRTUAL_ALLOC_ENTRYntdll!_HEAP_VIRTUAL_ALLOC_ENTRY   +0x000 Entry            : _LIST_ENTRY   +0x010 ExtraStuff       : _HEAP_ENTRY_EXTRA   +0x020 CommitSize       : Uint8B   +0x028 ReserveSize      : Uint8B   +0x030 BusyBlock        : _HEAP_ENTRY从卦中可以看到,除了真正的分配 BusyBlock 之外还有一些附属信息 , 比如 CommitSize , ReserveSize 等等,接下来就可以抽取 第一个节点地址 加上 +0x30 来找到这个真正的内存分配块 , 即 0x0000000043500000 + 0x30,然后使用 !heap -p -a  就可以看到这个分配块的源头在哪里了 。
0:000> !heap -p -a 0x0000000043500000 + 0x30    address 0000000043500030 found in    _HEAP @ 29fb0000              HEAP_ENTRY Size Prev Flags            UserPtr UserSize - state        0000000043500030 100100 0000  [00]   0000000043500060    1000040 - (busy VirtualAlloc)        775bc35b ntdll! ?? ::FNODOBFM::`string'+0x00000000000153eb        7fed230483b halcon!HXmalloc+0x000000000000008b        7fed22dd81d halcon!HXAllocRLTmp+0x000000000000265d        7fed22d6bd0 halcon!HXAllocTmp+0x0000000000000a80        7fed44a346a halcon!HCancelWait+0x000000000000007a        7fed2386b8f halcon!CCallHProc+0x000000000000073f        7fe83e3bcf6 +0x000007fe83e3bcf60:000> !ip2md 0x000007fe83e3bcf6MethodDesc:   000007fe83c39138Method Name:  HalconDotNet.xxxClass:        000007fe83c6b890MethodTable:  000007fe83c3f300mdToken:      0000000006000df5Module:       000007fe83a7f498IsJitted:     yesCodeAddr:     000007fe83e3bb90Transparency: Safe critical

推荐阅读