天天看點

函數中堆記憶體寫越界問題

在一個函數調用時候,配置設定一個堆,在堆的最底層應該是這個函數的傳回指針(就是調用的如口,執行完這個函數後要往下執行的位址)如後才是函數參數的入棧過程,C和C++的在函數前的修飾符決定了參數的入棧順序。

在一個函數中定義一個常量數組。

 WCHAR pwText[16];

 WCHAR *pc = L"11111222222222222222222111111111111111111111111222222222222222222111111111111111111111111222222222222222222111111111111111111111";

lstrcpyn(pwText,pc, 10000);

執行到這裡的時候沒有錯誤。當不保證後面就正确了。這個時候應該已經把這個堆棧寫亂了。

當函數傳回後,在Debug版中将報告。而在release版本中将報告一個緩沖區溢出。應用的可能寫到了堆棧外面,破話了自己或其他程式執行,嚴重可能導緻系統奔潰。

因為函數的傳回位址被寫成了其他值。在一些病毒或者是木馬中常常使用這個原理進行程式運作攔截,插入執行惡意代碼。

在寫程式的時候對這類操作一定要檢查好你的數組的長度。

在程式中調用new的時候,如果new的記憶體太大,也将導緻程式的異常。

 WCHAR *ps = new WCHAR [10000000000];

在debug的時候,導緻out of memory 錯誤。