Windows代码heap内存分析实战
知识这东西有时候很奇怪,每次当你重新审视他的时候可能都会有新的收获。最近为了研究一个内存相关的问题,把windows heap相关的内容又复习了一遍,收获不小,记录一下,希望有朋友使用的时候少走些弯路。
老话说的好,知己知彼方可百战不殆,没准备就去打仗无异于以卵击石,后果可想而知,那分析heap的问题需要什么基础知识呢:
1. Windows 基础知识,内存模型,什么是堆,堆内存是如何管理的,不了解的,建议学习<windows internals>。
2. 如何调试相关的问题,如何选择工具,建议学习windbg相关的命令。
3. 如何配置系统,如何启动页堆,如何使用gflag。
4. 相关的反汇编知识。
5. 知道如何能找到有用的信息。
好吧,以一个例子来说明:
void CTestPHeapDlg::OnBnClickedOk()
{
char * p;
HANDLE hHeap;
hHeap = HeapCreate(0, 1024, 0);
p=(char*)HeapAlloc(hHeap, 0, 9);
}
假设代码如上,点击一下,分配一次内存,同时假设代码很长,无法通过代码审查发现在那分配额的内存,如下的步骤可以帮你找到在哪分配的内存:
1. 对这个程序配置gflag开启完全页堆。
2. windbg调试器下运行程序。
3. 执行如下步骤:
0:001> !heap -p
Active GlobalFlag bits:
hpa - Place heap allocations at ends of pages
StackTraceDataBase @ 00430000 of size 01000000 with 00000378 traces
PageHeap enabled with options:
ENABLE_PAGE_HEAP
COLLECT_STACK_TRACES
active heaps:
+ 170000
ENABLE_PAGE_HEAP COLLECT_STACK_TRACES
NormalHeap - 270000
HEAP_GROWABLE
0:001> !heap -p -h 170000
_DPH_HEAP_ROOT @ 171000
Freed and decommitted blocks
DPH_HEAP_BLOCK : VirtAddr VirtSize
00174a3c : 0284f000 00002000
00174ba4 : 02851000 00002000
00174b7c : 02853000 00002000
00174b04 : 02855000 00002000
001749ec : 02857000 00002000
00174ab4 : 02859000 00002000
001749c4 : 0285b000 00002000
00173d1c : 0285d000 00002000
0017494c : 0285f000 00002000
00173d94 : 02861000 00002000
0017499c : 027e4000 00002000
Busy allocations
DPH_HEAP_BLOCK : UserAddr UserSize - VirtAddr VirtSize
001744ec : 0282ffe0 00000020 - 0282f000 00002000
001741a4 : 0282dfe0 00000020 - 0282d000 00002000
00174a14 : 028b1ff0 00000010 - 028b1000 00002000
001726ec : 025e8fd8 00000024 - 025e8000 00002000
MSCTF!CSharedBlockNT::`vftable'
00172714 : 025e4ff8 00000008 - 025e4000 00002000
00174a64 : 0289bfe0 00000020 - 0289b000 00002000
00174a8c : 02899fe0 00000020 - 02899000 00002000
001743ac : 0284bff0 0000000c - 0284b000 00002000
00174384 : 02849f88 00000074 - 02849000 00002000
00174334 : 02845f88 00000074 - 02845000 00002000
001742e4 : 02841f88 00000074 - 02841000 00002000
0017124c : 00186ce8 00000314 - 00186000 00002000
00171224 : 00184ce8 00000314 - 00184000 00002000
001711fc : 00182d28 000002d8 - 00182000 00002000
001711ac : 0017efd0 0000002d - 0017e000 00002000
0017115c : 0017afd8 00000022 - 0017a000 00002000
_HEAP @ 270000
_HEAP_LOOKASIDE @ 270688
_HEAP_SEGMENT @ 270640
CommittedRange @ 270680
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
* 00270680 0301 0000 [01] 00270688 01800 - (busy)
00271e88 022f 0301 [10] 00271e90 01170 - (free)
VirtualAllocdBlocks @ 270050
0:001> dt _DPH_BLOCK_INFORMATION 0282ffe0-0x20
ntdll!_DPH_BLOCK_INFORMATION
+0x000 StartStamp : 0xabcdbbbb
+0x004 Heap : 0x00171000
+0x008 RequestedSize : 0x20
+0x00c ActualSize : 0x1000
+0x010 FreeQueue : _LIST_ENTRY [ 0x359 - 0x0 ]
+0x010 TraceIndex : 0x359
+0x018 StackTrace : 0x028c271c
+0x01c EndStamp : 0xdcbabbbb
0:001> dds 0x028c271c
028c271c abcdaaaa
028c273c 7c94b244 ntdll!RtlAllocateHeapSlowly+0x44
028c2740 7c919c0c ntdll!RtlAllocateHeap+0xe64
028c2744 7c9114d6 ntdll!RtlpAllocateDebugInfo+0x49
028c2748 7c911566 ntdll!RtlInitializeCriticalSectionAndSpinCount+0xa9
028c274c 7c91162c ntdll!RtlInitializeCriticalSection+0xf
028c2750 7c96b97c ntdll!RtlpDebugPageHeapCreate+0x191
028c2754 7c93bd16 ntdll!RtlCreateHeap+0x41
028c2758 7c812c9f kernel32!HeapCreate+0x55
028c275c 004136d4 TestPHeap!CTestPHeapDlg::OnBnClickedOk+0x34 [f:\democode\testpheap\testpheap\testpheapdlg.cpp @ 158]
028c2760 78aad602 mfc90ud!_AfxDispatchCmdMsg+0xb2 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp @ 82]
028c2764 78aadd4a mfc90ud!CCmdTarget::OnCmdMsg+0x2ea [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp @ 381]
028c2768 78a83a13 mfc90ud!CDialog::OnCmdMsg+0x23 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp @ 85]
028c276c 78a45994 mfc90ud!CWnd::OnCommand+0x174 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 2364]
028c2770 78a44609 mfc90ud!CWnd::OnWndMsg+0x79 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 1769]
028c2774 78a44552 mfc90ud!CWnd::WindowProc+0x32 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 1755]
028c2778 78a41970 mfc90ud!AfxCallWndProc+0xf0 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 240]
028c277c abcdaaaa
看到结果了吧?如下的callstack正是内存分配时的栈,希望对大家有所帮助。
028c271c abcdaaaa
028c273c 7c94b244 ntdll!RtlAllocateHeapSlowly+0x44
028c2740 7c919c0c ntdll!RtlAllocateHeap+0xe64
028c2744 7c9114d6 ntdll!RtlpAllocateDebugInfo+0x49
028c2748 7c911566 ntdll!RtlInitializeCriticalSectionAndSpinCount+0xa9
028c274c 7c91162c ntdll!RtlInitializeCriticalSection+0xf
028c2750 7c96b97c ntdll!RtlpDebugPageHeapCreate+0x191
028c2754 7c93bd16 ntdll!RtlCreateHeap+0x41
028c2758 7c812c9f kernel32!HeapCreate+0x55
028c275c 004136d4 TestPHeap!CTestPHeapDlg::OnBnClickedOk+0x34
Windows代码heap内存分析实战的更多相关文章
- android--------Eclipse中ddms heap内存分析工具
无 论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方. Android tools中的DDMS就带有一个很不错的内存监测工具Heap ...
- Eclipse CDT Linux下内存分析 实战历险
C++产品开发,上线集成时,都需要内存泄露.覆盖率等检测,这些在Windows下都有很好的工具,如 Visual Studio: 这个内置了很多的工具 Devpartner: VC6时BoundChe ...
- iOS开发——高级篇——内存分析,Instruments
一.内存分析 1.静态内存分析(Analyze)不运行程序,直接对代码进行内存分析,查看代码是否有内存泄露优点:分析速度快,并且可以对所有的代码进行内存分析缺点:分析结果不一定准确(没有运行程序,根据 ...
- Ruby入门--Linux/Windows下的安装、代码开发及Rails实战
Ruby入门--Linux/Windows下的安装.代码开发及Rails实战 http://www.linuxidc.com/Linux/2014-04/100242.htm Ubuntu 13.04 ...
- [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...
- Windows系统内存分析工具的介绍
Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任 ...
- Android内存泄漏分析实战
内存泄漏简单介绍 java能够保证当没有引用指向对象的时候,对象会被垃圾回收器回收.与c语言自己申请的内存自己释放相比,java程序猿轻松了非常多.可是并不代表java程序猿不用操心内存泄漏.当jav ...
- 恶意代码分析实战五:OllyDebug动态结合
目录 恶意代码分析实战五:OllyDebug动态结合 OllyDebug界面介绍 OllyDebug载入程序方法 OllyDebug地址跳转 OllyDebug下断点 OllyDebug单步执行 Ol ...
- Android内存分析工具DDMS heap + MAT 安装和使用
一 Java内存分析工具扫盲 如果像我一样一点都不了解,可以先进行内存分析工具扫盲 MAT介绍: Eclipse Memory Analyzer(MAT)一个功能丰富的 JAVA 堆转储 ...
随机推荐
- POJ 1386 单词接龙问题
题目大意: 给一堆字母,让它们进行接龙,要头对尾能够接的上,问有没有一种方法让所有成语都完成接龙 这道题实际上是在考虑是否存在一条欧拉通路,每个单词产生一条有向线段,由第一个字母指向最后一个字母 这道 ...
- ZOJ 3811 Untrusted Patrol【并查集】
题目大意:给一个无向图,有些点有装监视器记录第一次到达该点的位置,问是否存在一条路径使得监视器以给定的顺序响起,并且经过所有点 思路:牡丹江网络赛的题,当时想了种并查集的做法,通神写完程序WA了几发, ...
- POJ1201:Intervals【差分约束】
题目大意:给出N个闭区间,每个区间给出一个ci值,让你找出最小的数集Z使得每个闭区间都有不少于ci个Z中的元素,求card(Z) 思路:06年集训队论文<浅析差分约束系统>有详细的解题,设 ...
- 【01背包变形】Robberies HDU 2955
http://acm.hdu.edu.cn/showproblem.php?pid=2955 [题意] 有一个强盗要去几个银行偷盗,他既想多抢点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率 ...
- 没有上司的舞会(hdu 1520)
题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现在有个周年庆宴会 ...
- 【收藏】下载Chrome商店插件的方法,万恶的gwd
以下是下载离线插件包的方法: 第一步: 每个Google Chrome扩展都有一个固定的ID,例如https://chrome.google.com/webstore/detail/bfbmjmiod ...
- POJ 1741 树上 点的 分治
题意就是求树上距离小于等于K的点对有多少个 n2的算法肯定不行,因为1W个点 这就需要分治.可以看09年漆子超的论文 本题用到的是关于点的分治. 一个重要的问题是,为了防止退化,所以每次都要找到树的重 ...
- CodeForces 570D 【dfs序】
题意: 给一颗树,根节点深度为1,每一个节点都代表一个子母. 数据输入: 节点数 询问数 从编号为2的节点开始依次输入其父节点的编号(共有节点数减1个数字输入) 字符串有节点数个小写字母 接下来询问 ...
- vs npm设置淘宝npm
VS2017自带的npm会去国外的镜像下载文件, 奇慢无比, 还是马云家淘宝的镜像适合国内用户. 淘宝npm镜像地址: https://registry.npm.taobao.org VS中使用淘宝 ...
- 配置activeMQ
一.加入以下的库 并配置好路径 ws2_32.lib;Mswsock.lib;cppunit.lib;libapr-1.lib;libapriconv-1.lib;libaprutil-1.lib;l ...