windbg 计算堆大小
来源:互联网 发布:淘宝优惠券群是真的吗 编辑:程序博客网 时间:2024/05/18 12:33
Summary: heap entries are now encoded, the key is in the heap itself.
Let's say I have a heap at 0x00d60000:
0:000> !heap -a 00d60000 Index Address Name Debugging options enabled 2: 00d60000 Segment at 00d60000 to 00d70000 (00001000 bytes committed) Flags: 40000061 ForceFlags: 40000061 Granularity: 8 bytes Segment Reserve: 00100000 Segment Commit: 00002000 DeCommit Block Thres: 00000200 DeCommit Total Thres: 00002000 Total Free Size: 00000149 Max. Allocation Size: 7ffdefff Lock Variable at: 00000000 Next TagIndex: 0000 Maximum TagIndex: 0000 Tag Entries: 00000000 PsuedoTag Entries: 00000000 Virtual Alloc List: 00d6009c Uncommitted ranges: 00d6008c 00d61000: 0000f000 (61440 bytes) FreeList[ 00 ] at 00d600c0: 00d605a0 . 00d605a0 00d60598: 00118 . 00a48 [104] - free Segment00 at 00d60000: Flags: 00000000 Base: 00d60000 First Entry: 00d60480 Last Entry: 00d70000 Total Pages: 00000010 Total UnCommit: 0000000f Largest UnCommit:00000000 UnCommitted Ranges: (1) Heap entries for Segment00 in Heap 00d60000 address: psize . size flags state (requested size) 00d60000: 00000 . 00480 [101] - busy (47f) 00d60480: 00480 . 00118 [107] - busy (100), tail fill 00d60598: 00118 . 00a48 [104] free fill 00d60fe0: 00a48 . 00020 [111] - busy (1d) 00d61000: 0000f000 - uncommitted bytes.
There's a busy block at 0x00d60480 (allocated size: 0x118), but it's encoded:
0:000> dt _heap_entry 00d60480ntdll!_HEAP_ENTRY +0x000 Size : 0x7387 +0x002 Flags : 0xf5 '' +0x003 SmallTagIndex : 0x64 'd' +0x000 SubSegmentCode : 0x64f57387 +0x004 PreviousSize : 0xb95d +0x006 SegmentOffset : 0 '' +0x006 LFHFlags : 0 '' +0x007 UnusedBytes : 0x18 '' +0x000 FunctionIndex : 0x7387 +0x002 ContextValue : 0x64f5 +0x000 InterceptorValue : 0x64f57387 +0x004 UnusedBytesLength : 0xb95d +0x006 EntryOffset : 0 '' +0x007 ExtendedBlockSignature : 0x18 '' +0x000 Code1 : 0x64f57387 +0x004 Code2 : 0xb95d +0x006 Code3 : 0 '' +0x007 Code4 : 0x18 '' +0x004 Code234 : 0x1800b95d +0x000 AgregateCode : 0x1800b95d`64f57387
Back to the heap, pay a particular attention to the field named "Encoding " (at offset 0x50):
0:000> dt _heap encodingntdll!_HEAP +0x050 Encoding : _HEAP_ENTRY
Dumping the whole _HEAP structure:
0:000> dt _heap 00d60000ntdll!_HEAP +0x000 Entry : _HEAP_ENTRY +0x008 SegmentSignature : 0xffeeffee +0x00c SegmentFlags : 0 +0x010 SegmentListEntry : _LIST_ENTRY [ 0xd600a4 - 0xd600a4 ] +0x018 Heap : 0x00d60000 _HEAP +0x01c BaseAddress : 0x00d60000 Void +0x020 NumberOfPages : 0x10 +0x024 FirstEntry : 0x00d60480 _HEAP_ENTRY +0x028 LastValidEntry : 0x00d70000 _HEAP_ENTRY +0x02c NumberOfUnCommittedPages : 0xf +0x030 NumberOfUnCommittedRanges : 1 +0x034 SegmentAllocatorBackTraceIndex : 0 +0x036 Reserved : 0 +0x038 UCRSegmentList : _LIST_ENTRY [ 0xd60ff0 - 0xd60ff0 ] +0x040 Flags : 0x40000061 +0x044 ForceFlags : 0x40000061 +0x048 CompatibilityFlags : 0 +0x04c EncodeFlagMask : 0x100000 +0x050 Encoding : _HEAP_ENTRY +0x058 Interceptor : 0 +0x05c VirtualMemoryThreshold : 0xfe00 +0x060 Signature : 0xeeffeeff +0x064 SegmentReserve : 0x100000 +0x068 SegmentCommit : 0x2000 +0x06c DeCommitFreeBlockThreshold : 0x200 +0x070 DeCommitTotalFreeThreshold : 0x2000 +0x074 TotalFreeSize : 0x149 +0x078 MaximumAllocationSize : 0x7ffdefff +0x07c ProcessHeapsListIndex : 2 +0x07e HeaderValidateLength : 0x248 +0x080 HeaderValidateCopy : (null) +0x084 NextAvailableTagIndex : 0 +0x086 MaximumTagIndex : 0 +0x088 TagEntries : (null) +0x08c UCRList : _LIST_ENTRY [ 0xd60fe8 - 0xd60fe8 ] +0x094 AlignRound : 0x17 +0x098 AlignMask : 0xfffffff8 +0x09c VirtualAllocdBlocks : _LIST_ENTRY [ 0xd6009c - 0xd6009c ] +0x0a4 SegmentList : _LIST_ENTRY [ 0xd60010 - 0xd60010 ] +0x0ac AllocatorBackTraceIndex : 0 +0x0b0 NonDedicatedListLength : 0 +0x0b4 BlocksIndex : 0x00d60248 Void +0x0b8 UCRIndex : (null) +0x0bc PseudoTagEntries : (null) +0x0c0 FreeLists : _LIST_ENTRY [ 0xd605a0 - 0xd605a0 ] +0x0c8 LockVariable : (null) +0x0cc CommitRoutine : 0x7944d754 long +7944d754 +0x0d0 FrontEndHeap : (null) +0x0d4 FrontHeapLockCount : 0 +0x0d6 FrontEndHeapType : 0 '' +0x0d7 RequestedFrontEndHeapType : 0 '' +0x0d8 FrontEndHeapUsageData : (null) +0x0dc FrontEndHeapMaximumIndex : 0 +0x0de FrontEndHeapStatusBitmap : [257] "" +0x1e0 Counters : _HEAP_COUNTERS +0x23c TuningParameters : _HEAP_TUNING_PARAMETERS
Dumping the encoding field as two DWORDs:
0:000> dd 00d60000 + 0x50 L200d60050 40f273a4 0000b9cd
Now dumping the heap entry as two DWORDs:
0:000> dd 00d60480 L200d60480 64f57387 1800b95d
Let's XOR them:
0:000> ? 40f273a4 ^ 64f57387 Evaluate expression: 604438563 = 240700230:000> ? 0000b9cd ^ 1800b95d Evaluate expression: 402653328 = 18000090
Now just writing a fake _HEAP_ENTRY so we can 'dt' it:
0:000> ed 00d604b000d604b0 00000000 240700232407002300d604b4 00000000 180000901800009000d604b8 00000000 0:000> dt _HEAP_ENTRY 00d604b0ntdll!_HEAP_ENTRY +0x000 Size : 0x23 +0x002 Flags : 0x7 '' +0x003 SmallTagIndex : 0x24 '$' +0x000 SubSegmentCode : 0x24070023 +0x004 PreviousSize : 0x90 +0x006 SegmentOffset : 0 '' +0x006 LFHFlags : 0 '' +0x007 UnusedBytes : 0x18 '' +0x000 FunctionIndex : 0x23 +0x002 ContextValue : 0x2407 +0x000 InterceptorValue : 0x24070023 +0x004 UnusedBytesLength : 0x90 +0x006 EntryOffset : 0 '' +0x007 ExtendedBlockSignature : 0x18 '' +0x000 Code1 : 0x24070023 +0x004 Code2 : 0x90 +0x006 Code3 : 0 '' +0x007 Code4 : 0x18 '' +0x004 Code234 : 0x18000090 +0x000 AgregateCode : 0x18000090`24070023
Size field is 0x23, granularity is 8 bytes, so:
0:000> ? 23 * 8Evaluate expression: 280 = 00000118
We found the same size.
https://stackoverflow.com/questions/28483473/windows-heap-chunk-header-parsing-and-size-calculation
http://advdbg.org/blogs/advdbg_system/articles/5152.aspx
阅读全文
0 0
- windbg 计算堆大小
- windbg调试堆破坏
- windbg调试堆
- 29.windbg-!heap(堆状态)
- windbg获取结构体大小
- 大小堆之堆排序
- Java栈中保存引用变量、堆中保存Object对象的空间大小计算
- 28.windbg-堆的手工分析
- 堆大小的最大值
- 估计堆的大小
- 堆大小设置
- 堆 栈 大小端
- 栈堆大小端
- 数据结构--大小堆
- 堆大小设置
- 大小堆的建立
- 大小堆 排序
- 大小堆实现
- 欢迎使用CSDN-markdown编辑器
- Ubuntu14.04用户配置Python与tensorflow
- D. An overnight dance in discotheque
- RecyclerView封装--添加下拉刷新和上拉加载更多
- 设计模式六大原则(1):单一职责原则
- windbg 计算堆大小
- SICP 2.54 符号列表equal?
- 有客远来
- 搭建个人博客-hexo+github
- Java NIO 之阻塞与非阻塞
- PAT (Advanced Level) Practise 1109 Group Photo (25)
- 排序算法
- Updating a Dictionary
- nodejs学习(一)读文件,写文件,文件信息