- 1、本文档共18页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
WINDBG的堆调试.
WINDBG的堆调试HEAP的概念堆栈堆栈,在操作系统内存中有两种存储空间,一个是堆,一个是栈。堆主要用于存储用户动态分配的变量,而栈呢,则是存储我们程序过程中的临时变量。当然栈的作用远不止用作存储变量,但这不是我们这篇文章的讨论内容。堆(HEAP)的分配,使用,回收都是通过微软的API来管理的,最常见的API是malloc和new。在往底层走一点呢,这两个函数都会调用HeapAlloc(RtlAllocateHeap)。同样的相关函数还有HeapFree用来释放堆,HeapCreate用来创建自己的私有堆。下面是这些函数的调用链:HeapCreate-RtlCreateHeap-ZwAllocateVirtualMemory (这里会直接申请一大片内存,至于申请多大内存,由进程PEB结构中的字段觉得,HeapSegmentReserve字段指出要申请多大的虚拟内存,HeapSegmentCommit指明要提交多大内存,对虚拟内存的申请和提交概念不清楚的童鞋,请参见windows核心编程相关内容~)HeapAlloc-RtlAllocateHeap(至于这里申请的内存,由于HeapCreate已经申请了一大片内存,堆管理器这片内存中划分一块出来以满足申请的需要。这一步申请操作是堆管理器自己维护的,仅当申请内存不够的时候才会再次调用ZwAllocateVirtualMemory)HeapFree-RtlFreeHeap(对于释放的内存,堆管理器只是简单的把这块内存标志位已释放让后加入到空闲列表中,仅当空闲的内存达到一定阀值的时候会调用ZwFreeVirtualMeMory)HeapDestroy-RtlDestroyHeap-ZwFreeVirtualMeMory(销毁我们申请的堆)如何找到我们的HEAP信息?WINDBG观察堆源码: #include windows.hint main(){HANDLE heap_handle = HeapCreate( NULL , 0x1000 , 0x2000 ) ;char *buffer = (char*)HeapAlloc(heap_handle , NULL , 128) ;char *buffer1 = (char*)HeapAlloc(heap_handle , NULL , 121) ;HeapFree(heap_handle, 0 , buffer ) ;HeapFree(heap_handle, 0 , buffer1 ) ;HeapDestroy(heap_handle) ;return 0 ;}该源码生成编译生成heap.exe,然后用windbg调试这个程序,在main函数下断,紧接着执行第五行语句,执行结果如下0:000 peax=002e1ca0 ebxecx=6d29b6f0 edxesiediipesp=0022fe8c ebp=0022feac iopl=0 nv up ei pl nznaponccs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efleap!main+0x12ff150c200301 call dwordptr [heap!_imp__HeapCreate (0103200c)] ds:0023:0103200c={kernel32!HeapCreateStub (769a29d7)}0:000 peax=002c0000 ebxecxedxesiediipesp=0022fe98 ebp=0022feac iopl=0 nv up ei pl nznapenccs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efleap!main+0x188945fc movdwordptr [ebp-4],eax ss:0023:0022fea8=6d2222010:000 !heap Index Address Name Debugging options enabled 1: 2: 3: 0002
文档评论(0)