我去,卦中出现了不愿看到的 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要想人肉挖,需要一些底层知识,比如下面三点 。
- VirtualAllocdBlocks 是什么?
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 的双向链表结构 。
- _HEAP_VIRTUAL_ALLOC_ENTRY 是什么?
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
经验总结扩展阅读
- Bing 广告平台迁移到 .net6
- 冬奥会多久举行一次
- 第一次办信用卡哪个银行最好申请
- 抖音怎么一次性删掉赞
- 长城电子借记卡1类和2类的区别
- 微信怎么删除好友,微信好友怎么快速删除(微信怎么一次性删除所有的好友)
- 木偶奇遇记主要内容
- 二次供水指什么意思 二次供水和一次供水的区别
- 邮箱密码忘记了怎么找回
- 地球史上的第一次生物大灭绝