2008-12-08 41 views
8

我有一個Windows窗體(.net 3.0)項目,由於DEP錯誤,無法在我的客戶的Vista計算機上運行。它在我的vista機器上運行,並在虛擬機中運行在vista sp1的乾淨版本中。我無法跟蹤使我的程序DEP,數據執行保護兼容的方法。我真的不能爲終端用戶機器做任何事情,它只需要運行。有沒有什麼辦法擺脫這種最新的Vista開發噩夢?我的程序使用devexpress控件,sql express和.net即web瀏覽器控件。我已經跳過ie控制,但無濟於事。我有其他程序在同一臺機器上使用devexpress和sql express,並且它們運行正常。我無法在用戶的計算機上進行調試。如何讓我的程序DEP兼容?

回答

17

DEP

更多信息運行在兩種模式中的一種:

1)硬件DEP是針對能標記內存頁爲不可執行的CPU。這有助於防止某些漏洞,如緩衝區溢出。

2)軟件DEP適用於沒有硬件DEP支持的CPU。它不會阻止在數據頁面中執行代碼,而是停止SEH覆蓋(另一種類型的攻擊)。

在支持CPU的Windows XP上,硬件DEP在默認情況下僅對某些Windows系統二進制文件啓用,對於選擇「選擇加入」的程序也會啓用。

在支持CPU的Vista上,幾乎所有進程都默認啓用硬件DEP。這可能偶爾會出現問題,通常適用於較舊的程序和驅動程序,以及尚未進行Vista測試的ISV。

所以我懷疑第一步是要發現你是否正在處理軟件或硬件DEP。另外,你使用C#/ VB還是託管C++?你是否使用任何本地代碼或組件?如果您的應用程序使用原生組件或使用舊ATL框架構建的ActiveX控件,那麼很可能您的應用程序將因硬件DEP而失敗。

由於.NET Framework 2.0 SP1,我相信C#編譯器會發出DEP兼容的託管代碼。但是,如果您的應用程序正在生成DEP異常,那麼您可以嘗試清除IMAGE_DLLCHARACTERISTICS_NX_COMPAT標誌以查找可執行文件。要做到這一點,你使用EDITBIN.EXE從VC工具集,像這樣:

editbin.exe /NXCOMPAT:NO <your binary> 

如果你使用Visual Studio,您可以添加一個生成後步驟,以您的可執行的項目。您需要設置環境,以便EDITBIN的依賴關係得以解決。當我使用本機代碼作爲我的應用程序的一部分,生成後步驟是這樣的:

call $(DevEnvDir)..\tools\vsvars32.bat 
editbin.exe /NXCOMPAT:NO $(TargetPath) 
+1

我有困難,並專門用於(editbin.exe不在工具,所以我複製它): 調用「C:\ Program Files文件\微軟Visual Studio 9.0 \ Common7 \ Tools \ vsvars32.bat」 editbin.exe/NXCOMPAT :沒有「$(TargetPath)」 TY對於真棒回答,將回到您的客戶結果。 – 2008-12-08 22:55:18

+0

好極了,這就是答案。 – 2008-12-09 00:20:24

+0

在路徑中添加引號,從而阻止VS2010執行 – Ulterior 2013-04-21 09:10:21

0

從試圖弄清​​楚你的程序在哪裏以及如何失敗開始。你可以在你的系統上覆制這個問題嗎?在系統上爲應用程序啓用DEP?當您可以複製問題並獲取錯誤(訪問衝突)時,您可以考慮修復程序。

查看MSDN article for information on DEP

+0

這是一個完全不透明的情況。我沒有從Vista獲得細節,我沒有在系統上調試。該程序在我的開發vista機器和乾淨的vista虛擬機上運行良好。 – 2008-12-08 21:56:12

5

老版本的ATL沒有感知到DEP,所以如果你使用任何使用ATL構建的ActiveX控件,並且構建在該版本的ATL(版本7.1及以下版本,我認爲)上,你會得到DEP錯誤。

作爲最後的手段,您實際上可以通過調用API函數來禁用DEP:SetProcessDEPPolicy。上SetProcessDEPPolicy

5

與在可執行文件標題上NXCOMPAT標誌.NET 2.0 SP1反過來附帶的編譯器。通過使用/ NXCOMPAT:NO選項運行EditBin.exe,您可以在Post Build步驟中關閉該標誌。

3

FWIW,值得明確提及的是,在很多情況下,應用程序並不是「與DEP不兼容」,而是即將崩潰,DEP「爲保存一天而努力」。很多時候,一旦你禁用了DEP,你會發現你正在播放一個「普通」的AV。

如果您的項目完全是在.NET 3.0中編寫的,那幾乎可以肯定是這種情況,因爲.NET不會執行觸發DEP的任何「瘋狂」事情(例如函數thunking等)。

要進行調試,請安裝調試器或啓用Watson生成.DMP文件,然後將該.DMP文件發送到開發人員的計算機並找出錯誤。

相關問題