監測記憶體越界

2021-10-23 08:33:05 字數 1744 閱讀 8285

#ifndef _checkmemoverflow_h_

#define _checkmemoverflow_h_

#define check_mem_overflow

#ifdef check_mem_overflow

//作業系統記憶體分配粒度為頁面(4k)

#define page_size 4096

#define platform_win32

#ifdef platform_win32

#include

#include

/** ooooooooooooo | *******

* (*)acture memory pages | protect page

*/inline

void

*operator

new(size_t size)

void

*p =

virtualalloc

(null

,page_num*page_size+

1,mem_commit,page_readwrite)

;void

*pchecker =

(char

*)p + page_num*page_size;

dword old_value;

virtualprotect

(pchecker,page_size,page_noaccess,

&old_value)

;return

(char

*)p + offset;

}inline

void

operator

delete

(void

*p)#else

#include

#include

#include

/** ********* |ooooooooooooooooooooo | ***********

* size page |(*)acture memory pages | protect page

*///gcc : connot be inline

void

*operator

new(size_t size)

void

operator

delete

(void

*p)#endif

#endif

//#define test_overflow

#ifdef test_overflow

#include

intmain

(int argc,

char

*ar**)

#endif

#endif

原理:

1,過載全域性new/delete,接管記憶體申請/釋放;

2.a,在windows下,頁面最小分配單位為4k,呼叫virtualalloc分配記憶體,並在最後乙個頁面後面新增乙個「哨兵」頁面,頁面屬性為noaccess,讀寫該頁面均crash;

2.b,在linux下,原理同上,但必須在申請的記憶體前面多申請乙個頁面儲存申請的頁面數;

注意:只能在c++中使用,windows/mac下測試通過。

使用方法:

只要include這個標頭檔案即可,且記憶體必須是new出來的,而非malloc的。

參考:1,

2,

mysql 記憶體越界 strncpy越界

strncpy dest,src,n 似乎是安全的函式 原型 char strncpy char restrict s1,const char restrict s2,size t n 今天碰到了問題,是由於對strncpy理解不夠造成的 man裡 事實上s2往往不如n那麼長,於是s1剩餘部分會全填...

記憶體訪問越界

1.記憶體越界分配的原理 何謂記憶體訪問越界,簡單的說,你向系統申請了一塊記憶體,在使用這塊記憶體的時候,超出了你申請的範圍。例如,你明明申請的是100位元組的空間,但是你由於某種原因寫入了120位元組,這就是記憶體訪問越界。記憶體訪問越界的後果是 你的寫入破壞了本不屬於你的空間。如下所示的 輸出 ...

char陣列記憶體越界

在c語言中,將字串作為字元陣列來處理 c 中不是 為了測定字串的實際長度,c語言規定了乙個 字串結束標誌 以字元 0 代表。如果有乙個字串,其中第10個字元為 0 則此字串的有效字元為9個。也就是說,在遇到第乙個字元 0 時,表示字串結束,由它前面的字元組成字串。系統對字串常量也自動加乙個 0 作為...