查找谁申请了这块内存
我们有时候得某块内存地址,但不知道他是谁申请的。
通过AppVerifier,我们可以得到stack trace。
1. 设置Normal page heap。
2. 在windbg里运行程序。
3. 得到某个内存地址
4. 查找Heap Block
0:000> !heap -x 01b4b4a0
Entry User Heap Segment Size PrevSize Unused Flags
-----------------------------------------------------------------------------
01b4b478 01b4b480 01b40000 01b40640 40 160 16 busy extra
5. User address是我们所感兴趣的。
0:000> dt _DPH_BLOCK_INFORMATION 01b4b480
ntdll!_DPH_BLOCK_INFORMATION
+0x000 StartStamp : 0xabcdaaaa
+0x004 Heap : 0x81a41000
+0x008 RequestedSize : 2
+0x00c ActualSize : 0x2a
+0x010 FreeQueue : _LIST_ENTRY [ 0x27 - 0x0 ]
+0x010 TraceIndex : 0x27
+0x018 StackTrace : 0x00357288
+0x01c EndStamp : 0xdcbaaaaa
6. 验证是否正确。RequestedSize == 2。
7. 我们所感兴趣的是offset在0x18处的Stack Trace.
8. 运行dds,得到strack trace
0:000> dds 0x00357288
00357288 abcdaaaa
0035728c 00000001
00357290 00000007
00357294 00000001
00357298 00000002
0035729c 01a41000
003572a0 00000000
003572a4 003572a8
003572a8 7c94b394 ntdll!RtlAllocateHeapSlowly+0x44
003572ac 7c918f21 ntdll!RtlAllocateHeap+0xe64
003572b0 0037fd2c vfbasics!AVrfpRtlAllocateHeap+0xb1
003572b4 78583db8 MSVCR90!malloc+0x79 [f:\dd\vctools\crt_bld\self_x86\crt\src\malloc.c @ 163]
003572b8 78583eb8 MSVCR90!operator new+0x1f [f:\dd\vctools\crt_bld\self_x86\crt\src\new.cpp @ 59]
003572bc 00401007 HeapAllocation!wmain+0x7 [d:\codebase\cpp_demos\heapallocation\heapallocation.cpp @ 17]
003572c0 7c817067 kernel32!BaseProcessStart+0x23