我有一个windows窗体(.net 3.0)项目,由于DEP错误而无法在客户的vista计算机上运行。它在我的vista计算机上运行,并在虚拟机中以vista sp1的干净版本运行。我无法找到使我的程序DEP(数据执行保护)兼容的方法。我真的无法对最终用户计算机执行任何操作,它只需要运行。有什么办法摆脱这个最新的vista开发噩梦吗?我的程序使用devexpress控件、sql express和.net ie web浏览器控件。我已经跳出了ie控件,但是没有用。我有其他程序在同一台计算机上使用devexpress和sql express,它们运行正常。我不知道如何在用户计算机上调试它。
5条答案
按热度按时间zphenhs41#
DEP以以下两种模式之一运行:
1)硬件DEP用于可以将内存页标记为不可执行的CPU。这有助于防止某些漏洞利用,如缓冲区溢出。
2)软件DEP适用于没有硬件DEP支持的CPU。它不会阻止数据页中代码的执行,而是阻止SEH覆盖(另一种类型的攻击)。
在具有支持硬件DEP的CPU的Windows XP上,默认情况下,硬件DEP仅对某些Windows系统二进制文件以及选择“选择加入”的程序启用。
在具有支持硬件DEP的CPU的Vista上,默认情况下几乎所有进程都启用硬件DEP。这有时可能会出现问题,通常是对于较旧的程序和驱动程序,以及对于尚未进行任何Vista测试的ISV。
因此,我怀疑第一步是要确定您处理的是软件DEP还是硬件DEP。另外,您使用的是C#/VB还是托管C++?您使用的是任何本机代码或组件吗?如果您的应用程序使用的是使用旧ATL框架构建的本机组件或ActiveX控件,那么您的应用程序很可能会因硬件DEP而失败。
从.NET Framework 2.0 SP1开始,我相信C#编译器会发出与DEP兼容的托管代码。但是,如果您的应用程序正在生成DEP异常,则可以尝试清除可执行文件的IMAGE_DLLCHARTERICARS_NX_COMPAT标志。为此,您可以使用VC工具集中的EDITBIN.EXE,如下所示:
如果您使用的是Visual Studio,则可以向可执行文件的项目添加生成后步骤。您需要设置环境,以便可以解析EDITBIN的依赖项。当我使用本机代码作为应用的一部分时,生成后步骤如下所示:
zaq34kh62#
.NET 2.0 SP1随附的编译器会在可可执行信头中开启NXCOMPAT旗标。您可以执行EditBin.exe搭配/NXCOMPAT:NO选项,在建置后步骤中关闭该旗标。
mec1mxoz3#
旧版本的ATL不支持DEP,因此,如果您使用任何使用ATL构建的ActiveX控件,并且这些控件是在该版本的ATL(我认为是7.1及更低版本)上构建的,则会出现DEP错误。
作为最后的手段,您可以通过调用API函数来禁用进程的DEP:
SetProcessDEPPolicy
.有关SetProcessDEPPolicy的更多信息
uttx8gqw4#
FWIW,值得明确提到的是,在许多情况下,应用程序并不是“与DEP不兼容”,而是无论如何都要崩溃,DEP“潜入以保存这一天”。
如果您的项目完全是用.NET3.0编写的,几乎可以肯定是这样,因为.NET不会做任何触发DEP的“疯狂”事情(例如函数thunking等)。
要进行调试,请安装一个调试器或启用沃森生成一个.DMP文件,然后将该.DMP文件带到开发人员的计算机上,找出错误所在。
bnlyeluc5#
首先,试着找出程序出现故障的位置和方式。您能在系统上重现该问题吗?通过在系统上为应用程序启用DEP?当您能重现该问题并得到错误(访问冲突)时,您就可以着手修复程序了。
请参阅MSDN article for information on DEP。