数据执行保护

数据执行保护 (DEP) 是一项系统级内存保护功能,内置于从 Windows XP 和 Windows Server 2003 开始的操作系统。 DEP 允许系统将一页或多页内存标记为不可执行文件。 将内存区域标记为不可执行意味着不能从该内存区域运行代码,这会使对缓冲区溢出的利用变得更困难。

DEP 阻止从数据页(例如默认堆、堆栈和内存池)运行代码。 如果应用程序尝试从受保护的数据页运行代码,则会发生内存访问冲突异常,如果异常未得到处理,则终止调用进程。

DEP 并非旨在全面防御所有攻击;它旨在作为可用于保护应用程序的另一种工具。

数据执行保护的工作原理

如果某个应用程序尝试从受保护的页运行代码,则该应用程序将收到一个异常,并出现状态代码 状态 " _ 访问 _ 冲突"。 如果你的应用程序必须从内存页运行代码,则它必须分配并设置正确的虚拟 内存保护 特性。 分配内存时,分配的内存必须标记为 页 _ 执行页 _ 执行 _ 读取页 _ 执行 _ 读写页 _ 执行 _ WRITECOPY 。 通过调用 mallocHeapAlloc 函数进行的堆分配是不可执行的。

应用程序无法从默认进程堆或堆栈中运行代码。

在系统启动时,将根据启动配置数据中的 "不执行页面保护" 策略设置配置 DEP。 应用程序可以通过调用 GetSystemDEPPolicy 函数获取当前策略设置。 根据策略设置,应用程序可以通过调用 SetProcessDEPPolicy 函数来更改当前进程的 DEP 设置。

编程注意事项

应用程序可以使用 VirtualAlloc 函数通过适当的内存保护选项来分配可执行内存。 建议至少使用 页面 " _ 执行 内存保护" 选项。 生成可执行代码后,建议应用程序设置内存保护,以禁止对分配的内存进行写访问。 应用程序可以通过使用 VirtualProtect 函数来禁止对分配的内存进行写访问。 禁止写入访问权限可确保最大程度地保护进程地址空间的可执行区域。 应尝试创建尽可能使用最小可执行地址空间的应用程序,从而最大程度地减少暴露给内存利用的内存量。

还应尝试控制应用程序虚拟内存的布局,并创建可执行区域。 这些可执行区域的内存空间应小于不可执行区域。 通过在不可执行的区域下面查找可执行区域,可以帮助防止缓冲区溢出溢出到内存的可执行区域。

应用程序兼容性

某些应用程序功能与 DEP 不兼容。 执行动态代码生成的应用程序 (如实时代码生成) ,并不使用 execute 权限显式标记生成的代码,这可能会在使用 DEP 的计算机上出现兼容性问题。 写入活动模板库 (ATL) 版本7.1 及更早版本的应用程序可能会尝试对标记为不可执行的页执行代码,这会触发 NX 错误并终止应用程序;有关详细信息,请参阅 SetProcessDEPPolicy。 大多数执行操作与 DEP 不兼容的操作的应用程序必须更新才能正常运行。

少量的可执行文件和库可能包含图像文件的数据部分中的可执行代码。 在某些情况下,应用程序可能会将少量代码段放置在数据部分中, (通常称为 thunk) 。 但是,DEP 会将在内存中加载的映像文件部分标记为不可执行文件,除非该节应用了可执行属性。

因此,数据节中的可执行代码应迁移到代码部分,或者包含可执行代码的数据节应显式标记为可执行文件。 对于包含可执行代码的节,应将可执行文件属性 " IMAGE _ SCN _ MEM _ EXECUTE" 添加到相应节标头的 " 特征 " 字段。 有关将特性添加到部分的详细信息,请参阅链接器附带的文档。

TechNet) (的数据执行保护

如何配置内存保护

知识库文章875352