本文整理自《0day安全:软件漏洞分析技术》
1 堆
2 代码
#include "stdafx.h"
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
//HANDLE和HLOCAL 是 void*
HLOCAL h1,h2,h3,h4,h5,h6;
HANDLE hp;
hp=HeapCreate(0,0x1000,0x10000);//返回创建堆的HANDLE
//因为调试态堆和常态堆差异很大,所以在这里设置了一个int 3断点,方便调试器附加,调试常态堆。
__asm int 3
h1=HeapAlloc(hp,HEAP_ZERO_MEMORY,3);//HEAP_ZERO_MEMORY 代表分配的内存用0来进行初始化,第三个参数是分配的字节数
h2=HeapAlloc(hp,HEAP_ZERO_MEMORY,5);
h3=HeapAlloc(hp,HEAP_ZERO_MEMORY,6);
h4=HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
h5=HeapAlloc(hp,HEAP_ZERO_MEMORY,19);
h6=HeapAlloc(hp,HEAP_ZERO_MEMORY,24);
HeapFree(hp,0,h1);
HeapFree(hp,0,h3);
HeapFree(hp,0,h5);
HeapFree(hp,0,h4);
return 0;
}
3 堆块的分配
用VC++ 2010 Express ,Release版本编译的。
断点断下来之后,内存映射状态如图所示。
图:内存映射状态
HeapCreate创建的堆起始地址是0x3B0000