記一次 .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

推薦閱讀