DEP引起的DLL庫函式呼叫失敗
1 什麼是DEP(資料執行保護)
根據微軟官方定義:資料執行保護 (DEP) 是一種有助於防止您的計算機免受病毒和其他安全威脅破壞的安全功能。有害的程式可能會通過試圖執行(也稱為“執行”)計算機記憶體中為 Windows 和其他已授權程式保留的程式碼來攻擊 Windows。這些型別的攻擊可能會損害您的程式和檔案。
DEP 可以通過監視程式以確保它們安全使用計算機記憶體,幫助保護您的計算機。如果 DEP 注意到計算機上的某個程式使用的記憶體不正確,則它將關閉該程式並通知您。
2
DEP被WIN2003及之後的系統引入,是系統性能選項的一部分。“在計算機屬性”配置頁面中的“高階系統設定項”的“效能選項”,開啟後介面如下。預設系統是不為其他應用程式啟用DEP的,當然如果您系統安裝時不小心選擇了第二個選項,則所有的應用程式均在DEP保護範圍內。
在VS2010的VC連結器配置裡,我們也可以發現數據執行保護項,預設是被選擇的,這樣您寫的小程式也就被DEP保護了。
3 DEP導致的不相容問題現象
一般情況下,保護給人的感覺總是不錯的,然而,就是這預設的DEP
TestSmt.exe 中的 0x7fc0c5f1 處最可能的異常: 0xC0000005: Access violation TestSmt.exe 中的 0x7fc0c5f1 處有未經處理的異常: 0xC0000005: Access violation |
跟蹤到彙編,顯然是DLL函式入口就錯了。
這下難了,我們沒有smt庫的原始碼,不可能知道到底發生了什麼,但是專案總得交,問題總得解決。折騰啊折騰,在無盡的折騰中,終於看到了一絲曙光…
4 解決之道
為了徹底查詢問題,我在WIN7系統上使用VS2010編寫了如下的測試程式碼:
程式編譯後,與上述問題現象一摸一樣,這下我徹底傻了,難道SMT庫在WIN7下也是不能執行的,在反覆思考覺得沒有這樣的道理的同時,我對VC的編譯連結選項作了部分改動,再次帶著一顆充滿期望的心情編譯嘗試時,奇蹟終於發生了,一切都是那麼的OK,如下圖所示的介面簡直就是我的美味佳餚啊!
原來都是DEP搞的鬼,知道了問題所在,就非常好辦了,按照前面介紹的知識檢查後,發現新系統DEP的配置選項竟然是第二項,這狗日的騰訊,是誰動了我的配置!!!
修改DEP,一切OK!