如何让我的程序DEP兼容?

问题描述:

我有一个Windows窗体(.net 3.0)项目,由于DEP错误,无法在我的客户的Vista计算机上运行。它在我的vista机器上运行,并在虚拟机中运行在vista sp1的干净版本中。我无法跟踪使我的程序DEP,数据执行保护兼容的方法。我真的不能为终端用户机器做任何事情,它只需要运行。有没有什么办法摆脱这种最新的Vista开发噩梦?我的程序使用devexpress控件,sql express和.net即web浏览器控件。我已经跳过ie控制,但无济于事。我有其他程序在同一台机器上使用devexpress和sql express,并且它们运行正常。我无法在用户的计算机上进行调试。如何让我的程序DEP兼容?

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

从试图弄清​​楚你的程序在哪里以及如何失败开始。你可以在你的系统上复制这个问题吗?在系统上为应用程序启用DEP?当您可以复制问题并获取错误(访问冲突)时,您可以考虑修复程序。

查看MSDN article for information on DEP

+0

这是一个完全不透明的情况。我没有从Vista获得细节,我没有在系统上调试。该程序在我的开发vista机器和干净的vista虚拟机上运行良好。 – 2008-12-08 21:56:12

老版本的ATL没有感知到DEP,所以如果你使用任何使用ATL构建的ActiveX控件,并且构建在该版本的ATL(版本7.1及以下版本,我认为)上,你会得到DEP错误。

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

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

FWIW,值得明确提及的是,在很多情况下,应用程序并不是“与DEP不兼容”,而是即将崩溃,DEP“为保存一天而努力”。很多时候,一旦你禁用了DEP,你会发现你正在播放一个“普通”的AV。

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

要进行调试,请安装调试器或启用Watson生成.DMP文件,然后将该.DMP文件发送到开发人员的计算机并找出错误。