Heap Corruption
Posted on 2007-04-13 20:33 Shuffy 閱讀(581) 評(píng)論(0) 編輯 收藏 引用 所屬分類: VC++/C/C++/C#瀏覽集合本文源自:http://m.shnenglu.com/kerlw/services/trackbacks/21700.aspx
首先說(shuō)明一下什么是Heap Corruption。當(dāng)輸入超出了預(yù)分配的空間大小,就會(huì)覆蓋該空間之后的一段存儲(chǔ)區(qū)域,這就叫Heap Corruption。這通常也被用作黑客攻擊的一種手段,因?yàn)槿绻谠摽臻g之后的那段存儲(chǔ)區(qū)域如果是比較重要的數(shù)據(jù),就可以利用Heap Corruption來(lái)把這些數(shù)據(jù)修改掉了,后果當(dāng)然可想而知了。
在VC里面,用release模式編譯運(yùn)行程序的時(shí)候,堆分配(Heap allocation)的時(shí)候調(diào)用的是malloc,如果你要分配10byte的空間,那么就會(huì)只分配10byte空間,而用debug模式的時(shí)候,堆分配調(diào)用的是_malloc_dbg,如果你只要分配10byte的空間,那么它會(huì)分配出除了你要的10byte之外,還要多出約36byte空間,用于存儲(chǔ)一些薄記信息,debug堆分配出來(lái)之后就會(huì)按順序連成一個(gè)鏈。
那么我們?cè)賮?lái)看看薄記信息中有些什么。還是上面10byte分配空間的例子,那么分配出的10byte空間的前面會(huì)有一個(gè)32byte的附加信息,存儲(chǔ)的是一個(gè)_CrtMemBlockHeader結(jié)構(gòu),可以在DBGINT.H中找到該結(jié)構(gòu)的定義:
typedef struct _CrtMemBlockHeader
{
// Pointer to the block allocated just before this one:
struct _CrtMemBlockHeader *pBlockHeaderNext;
// Pointer to the block allocated just after this one:
struct _CrtMemBlockHeader *pBlockHeaderPrev;
char *szFileName; // File name
int nLine; // Line number
size_t nDataSize; // Size of user block
int nBlockUse; // Type of block
long lRequest; // Allocation number
// Buffer just before (lower than) the user's memory:
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;
/* In an actual memory block in the debug heap,
* this structure is followed by:
* unsigned char data[nDataSize];
* unsigned char anotherGap[nNoMansLandSize];
*/


