如何使我的程序DEP兼容?

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

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标志。 为此,您可以使用VC工具集中的EDITBIN.EXE,如下所示:

editbin.exe /NXCOMPAT:NO <your binary> 

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

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

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

作为最后的手段,你可以通过调用一个API函数SetProcessDEPPolicy来实际上禁用该进程的DEP。

有关SetProcessDEPPolicy的更多信息

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

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

如果你的项目完全是在.NET 3.0中编写的,那几乎可以肯定是这样,因为.NET不会做任何触发DEP的“疯狂”的东西(例如函数thunking等)。

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

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

有关DEP的信息,请参阅MSDN文章 。