如何使我的程序DEP兼容?

时间:2008-12-08 21:30:36

标签: windows winforms

我有一个Windows窗体(.net 3.0)项目,由于DEP错误而无法在我客户的vista计算机上运行。它在我的vista机器上运行,并在虚拟机中的vista sp1的干净版本中运行。我无法找到使我的程序DEP,数据执行保护兼容的方法。我真的无法做任何事情来结束用户机器,它只需要运行。这个最新的vista开发噩梦有什么办法吗?我的程序使用devexpress控件,sql express和.net即web浏览器控件。我已经跳出了ie控件,但无济于事。我有其他程序在同一台机器上使用devexpress和sql express,它们运行正常。我无法在用户的计算机上进行调试。

5 个答案:

答案 0 :(得分:17)

DEP以两种模式之一运行:

1)硬件DEP用于可以将内存页标记为不可执行的CPU。这有助于防止某些漏洞利用,例如缓冲区溢出。

2)软件DEP适用于没有硬件DEP支持的CPU。它不会阻止在数据页中执行代码,而是阻止SEH覆盖(另一种类型的攻击)。

在具有支持它的CPU的Windows XP上,默认情况下仅为某些Windows系统二进制文件以及选择“选择加入”的程序启用硬件DEP。

在具有支持它的CPU的Vista上,默认情况下几乎所有进程都启用硬件DEP。这有时可能会出现问题,通常是针对较旧的程序和驱动程序,以及未进行任何Vista测试的ISV。

所以我怀疑第一步是发现你是在处理软件还是硬件DEP。另外,您使用的是C#/ VB还是托管C ++?你使用任何本机代码或组件?如果您的应用程序使用本机组件或使用旧ATL框架构建的ActiveX控件,那么您的应用程序很可能会因硬件DEP而失败。

从.NET Framework 2.0 SP1开始,我相信C#编译器会发出与DEP兼容的托管代码。但是,如果您的应用程序正在生成DEP异常,那么您可以尝试清除可执行文件的IMAGE_DLLCHARACTERISTICS_NX_COMPAT标志。为此,您可以使用VC工具集中的EDITBIN.EXE,如下所示:

editbin.exe /NXCOMPAT:NO <your binary>

如果您使用的是Visual Studio,则可以在可执行文件的项目中添加一个生成后步骤。您需要设置环境,以便可以解析EDITBIN的依赖关系。当我使用本机代码作为我的应用程序的一部分时,后构建步骤如下所示:

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

答案 1 :(得分:5)

旧版本的ATL不支持DEP,所以如果您使用任何使用ATL构建的ActiveX控件,并且构建在该版本的ATL(我认为版本7.1及更低版本)上,您将获得DEP错误。

作为最后的手段,您实际上可以通过调用API函数来禁用该流程的DEP:SetProcessDEPPolicy

有关SetProcessDEPPolicy

的更多信息

答案 2 :(得分:5)

.NET 2.0 SP1附带的编译器打开可执行文件头中的NXCOMPAT标志。您可以通过使用/ NXCOMPAT:NO选项运行EditBin.exe来在Post Build步骤中关闭该标志。

答案 3 :(得分:3)

FWIW,值得明确提到的是,在许多情况下,应用程序并非“与DEP不兼容”,而是即将崩溃,DEP“潜入拯救日”。很多时候,一旦你禁用了DEP,你就会发现你正在打一个“普通的”AV。

如果您的项目仅使用.NET 3.0编写,那几乎可以肯定,因为.NET不会执行触发DEP的任何“疯狂”事情(例如函数thunking等)。

要调试,安装调试器或启用Watson以生成.DMP文件,然后将该.DMP文件带到开发人员的计算机并找出问题所在。

答案 4 :(得分:0)

首先尝试找出程序失败的位置和方式。你能在你的系统上复制这个问题吗?在系统上为应用程序启用DEP?当您可以复制问题并获得错误(访问冲突)时,您可以查看修复程序。

请参阅MSDN article for information on DEP