DEP(也称“数据执行保护”)是一种软件+硬件的机制,用来阻止从未被显式标记为可执行的内存页执行代码。Windows XP SP2、Windows Server 2003 SP1及其之后的操作系统将会检查CPU是否支持内存页的“不可执行”或“执行禁用”位。
在Windows XP SP2之前,利用代码(exp)会在分配的内存页执行,不需要检查内存保护常量(Memory Protection Constants)。例如,如果使用指定分配权限为PAGE_READWRITE 的VirtualAlloc ()函数分配了内存页, 则仍然可以从该内存页执行代码。从 windows XP SP2 和 windows Server 2003 SP1 开始, 如果 CPU 支持执行禁用 (XD) (针对Intel CPU)或不可执行 (NX)(针对AMD CPU) 位,则任何从被标记为PAGE_READWRITE(例)的内存页执行代码的行为,都将触发 STATUS_ACCESS_VIOLATION (0xC0000005) 访问冲突异常。有关硬件强制 DEP 工作原理的详细信息, 请参阅以下文章: http://technet.microsoft.com/en-us/library/bb457155.aspx。
DEP 在64bit 版本的 Windows 上为64位进程 "always on(始终开启)"状态, 无法禁用。Windows DEP 策略可以在系统范围内和进程层面进行管理, 下面将讨论这两种方法。这篇文章适用于在32位或64位版本的 Windows 上运行的32位进程。
如果您的硬件支持 DEP, 并且您正在运行 Windows XP SP2 或较新的操作系统, 则您已经在某种程度上使用了DEP。硬件强制 DEP 可以配置为系统范围 (适用于所有进程) 或为单个进程配置策略。在支持DEP的平台上执行系统范围的DEP 策略有四种不同的方法。
windows XP SP2 和 windows Server 2003 SP1
这篇文章(https://technet.microsoft.com/en-us/library/cc700810.aspx)在解释了如何使用 boot.ini 或 GUI 配置 windows XP SP2 和 windows Server 2003 SP1 上的内存保护设置。请注意, 配置 "系统范围" DEP 策略需要管理员权限。
windows Vista 和 windows Server 2008
要在 Windows Vista 和服务器2008上配置系统范围的 DEP 策略, 请从高权限的命令提示符处使用 bcdedit.exe 控制台应用程序修改启动配置数据库。如何执行此操作的更多信息: https://docs.microsoft.com/zh-cn/windows-hardware/drivers/devtest/boot-parameters-to-configure-dep-and-pae
将 DEP 设置为始终为所有进程启用, 可能会增加应用程序问题的风险,这一风险是因版本7.1 之前的 ATL 版本中的某些行为而导致的。旧版本的 ATL 在运行时生成了机器码,然后试图从未标记为可执行的内存页执行此代码, 从而在开启DEP时导致冲突。如果系统范围的设置是 "选择启用", 则使用名为"ATL thunk emulation" 的进程来避免与ATL相关的 DEP 崩溃。如果 DEP "始终开启", 则不使用 “ATL thunk emulation”。注意: 当DEP设置为"始终开启" , 在打开包含 VBA (Visual Basic应用程序) 的宏 (可能导致 DEP 相关崩溃) 的文档时,Microsoft Office 应用程序存在已知的兼容性问题。
判断进程当前是否使用 DEP 的最简单方法是使用"进程管理器"并将其配置为显示进程DEP状态 (视图->选择列->进程DEP状态), 如下所示:
要确定进程使用 (或不使用) DEP 的原因, 需要进行更多的调查工作。下面是系统决定进程的 DEP 状态的方法。在以后的文章中, 将对每个细节进行详细的探讨。
Windows XP SP2和Windows Server 2003 SP1十分强调安全性。因此许多Windows默认程序通过应用程序兼容性数据库将DEP设置为“选择开启”。要了解哪些程序在 windows XP SP2 或 windows Server 2003 SP1 上 选择启用DEP, 您可以下载并安装最新的应用程序兼容性工具包(Application Compatibility Toolkit)并在该程序 "Windows 组件" 下查看主系统数据库。
如果在 "windows 组件" 类别中应用了兼容性修补标志 "AddProcessParametersFlags", 则所有 Windows XP SP2 应用程序被设置为”选择开启“。
Windows Server 2003 SP1 默认系统策略为 "选择不开启"。这意味着所有未显式指定不开启进程都将启用 DEP。如果更改了系统范围的策略, 则应用程序仍可以使用 EnableDEP 兼容性修复程序启用DEP, 如下所示:
这些兼容性修复程序将PEB 的 ProcessParameters值设置为 0x00020000, 使windows XP SP2 和 windows Server 2003 SP1 可以选择进程是否开启 DEP 。我们在 windows XP SP2 和 windows Server 2003 SP1 中找到了305个进程, 这些进程通过主应用程序兼容性数据库 (%windir%\AppPatch\sysmain.sdb) 使用此特定的兼容性修复程序将DEP设置为“选择开启”。我们在此附上这些进程的列表:点击下载。