問題描述:
一直以來,引擎都啟動並執行很穩定。而且在所有電腦上都很穩定。
但是,唯獨一個筆記本不行。引擎在其上一運行就崩掉。
問題分析:
根據產生的dump檔案,windbg的分析結果為:
The stored exception information can be accessed via .ecxr.
(c98.da0): Stack buffer overflow - code c0000409 (first/second chance not available)
還有 frame IP 被破壞, (IP是什麼來著? 指令地址?忘了,權當作當前frame的基地址吧)可見, 可能是堆棧的基地址被破壞了
查看呼叫堆疊:
。。。一些系統的dll內建函式
xeyez!funxEyeLoadAllDll( ),
。。。。
問題應該出在funxEyeLoadAllDll這裡,
根據windbg提示的出錯行,定位到該函數的最後一行!! 可見就是函數返回時,返回失敗!
查看該函數的實現:
int funxEyeLoadAllDll( )
{
char * strOldEnv;
strOldEnv = getenv("Path");
// 把外掛程式目錄加入到環境變數,以便可以讓系統載入DLL時找到外掛程式間依賴的DLL
char newEnv[1024] = {0};
sprintf(newEnv,"Path=%s;.//External;.//USB",strOldEnv);
TCHAR buf[MAX_PATH] = {0};
TCHAR *psz;
GetModuleFileName(NULL, buf, MAX_PATH);
。。。。。。
。。。。。。
} // windbg提示該行出錯 <-------------
經分析,可能問題出在 下面代碼處,下面代碼的意思是,把當前系統的PATH環境變數讀入到newEnv中。
由於使用sprintf非安全版,就可能破壞堆棧!
char newEnv[1024] = {0};
sprintf(newEnv,"Path=%s;.//External;.//USB",strOldEnv);
果然, 查看那個筆記本的path變數,居然有10幾行,每行有100多個字母!
看來,防禦性編程是很有必要的!
不要假設客戶的電腦的情況!
還好,現在可以使用windbg+pdb檔案調試,要是不能,這樣的bug不知會調到什麼時候!更要命的是,可能會被駭客攻擊