我正在尝试将 CSCRIPT.exe 添加为 Windows Server 2008 R2 中 DEP(数据执行保护)的例外。CSCRIPT.exe 位于两个位置:C:\Windows\System32 和 C:\Windows\SysWOW64。System32 位置是应用程序的 64 位版本,根据 Microsoft 的说法,64 位应用程序无法添加到 DEP(以及我尝试将其添加到 DEP 时收到的警告消息)。尝试添加 SysWOW64 版本会给出完全不同的错误/警告消息。“此程序必须在启用 DEP 的情况下运行,您无法将其关闭”。
我尝试重命名 CSCRIPT.exe 并将其移动到其他位置和/或重命名它,没有任何区别。对于此用例,必须启用 DEP,并且出于此特定问题的目的 - 我需要仅为此应用程序禁用 DEP。
我尝试过使用 Windows Server 2003 中的 CSCRIPT.exe。我能够成功将此文件添加到 DEP。但是,使用旧版本确实让我感到困扰。我觉得我可能会引入安全风险或版本问题。
是否有其他方法可以将 SysWOW64 版本的 CSCRIPT.exe 放入 DEP 列表?或者 Windows Server 2003 版本解决方法是否是合适的解决方案?
编辑:我明白,对于这个特定问题,可能需要“做出让步”。我可能无法达成共识。如果是这样,那就这样吧。如果没有必要,我不想花时间和精力去重新发明轮子。谢谢!
答案1
非常有趣的问题。我以前见过 cscript.exe 的一些 DEP 错误。这很烦人。
VBScript 早于 Windows 中的 DEP,因此最初开发时并未考虑 DEP。此外,当您开始在脚本中与旧的第三方 COM 和 OLE 接口交互时,它们可能会导致 NX 错误,而 cscript.exe 会为此负责。后者通常是这种情况。
但是,使用旧版本确实让我有些困扰。我感觉可能会带来安全风险或版本问题。
我觉得你这么说有点好笑,因为禁用 cscript.exe 等程序的 DEP 将会方式比使用 2003 版本存在更大的安全风险。
您不能禁用 64 位进程的 DEP,就是这样。
当 DEP 设置为 OptOut 策略级别时,为了实现应用程序兼容性,可以选择性地为单个 32 位应用程序禁用 DEP。但是,对于 64 位应用程序,DEP 始终处于启用状态。
http://technet.microsoft.com/en-us/library/cc738483(v=WS.10).aspx
因此,您只能使用 32 位、“SysWOW64”版本的 cscript.exe... 但是,现代可执行文件通常都会带有“你不能关闭我的 DEP,”标志。与可执行文件可以被标记为具有大地址空间感知等方式非常相似。
从技术上讲,它是/NXCOMPAT
编译可执行文件时使用的标志。它是一个链接器开关。旧版 2003 版可执行文件未使用该开关进行编译,这就是为什么您可以将其放入 DEP 豁免列表中,但 2008 版却不能。
但等等,还有更多!如果您仍想使用 2008 版 SysWoW64\cscript.exe,您需要做的就是复制可执行文件,然后运行:
editbin /NXCOMPAT:NO C:\cscript.exe
现在您可以将其添加到 DEP 豁免列表中。Editbin.exe 随 Visual Studio、Windows SDK 等一起提供。
在堆栈或堆内存中注入代码并分支指令指针来执行它,很有趣!