标题：DEP
简介
DEP - 数据执行保护的缩写，Data Execution Prevention。
数据执行保护 (DEP) 是一套软硬件技术，能够在内存上执行额外检查以帮助防止在系统上运行恶意代码。在 Microsoft Windows XP Service Pack 2、 Microsoft Windows Server 2003 Service Pack 1 、Microsoft Windows XP Tablet PC Edition 2005 、 Microsoft Windows Vista 和 Microsoft windows7 中，由硬件和软件一起强制实施 DEP。[1]
DEP 的主要优点
是可以帮助防止数据页执行代码。通常情况下，不从默认堆和堆栈执行代码。硬件实施 DEP 检测从这些位置运行的代码，并在发现执行情况时引发异常。软件实施 DEP 可帮助阻止恶意代码利用 Windows 中的异常处理机制进行破坏。
硬件实施 DEP 是某些 DEP 兼容处理器的功能，可以防止在已标记为数据存储区的内存区域中执行代码。 此功能也称为非执行和执行保护。 Windows XP SP2 还包括软件实施 DEP，其目的在于减少利用 Windows 中的例外处理机制的情况。 
与防病毒程序不同，硬件和软件实施 DEP 技术的目的并不是防止在计算机上安装有害程序。 而是监视您的已安装程序，帮助确定它们是否正在安全地使用系统内存。 为监视您的程序，硬件实施 DEP 将跟踪已指定为“不可执行”的内存区域。 如果已将内存指定为“不可执行”，但是某个程序试图通过内存执行代码，Windows 将关闭该程序以防止恶意代码。 无论代码是不是恶意，都会执行此操作。[1]
注意事项
注:基于软件的 DEP 是 Windows XP SP2 的一部分并默认启用，不考虑处理器的硬件实施 DEP 功能。 默认情况下，软件实施 DEP 应用于核心操作系统组件和服务。
DEP 默认配置的目的在于保护您的计算机，并尽量减小对应用程序兼容性的影响。 但是某些程序也可能无法正确运行，视您的 DEP 配置而定。
在运行 Microsoft Windows XP 64 位版本并附带 DEP 兼容处理器的计算机上，硬件实施 DEP 已默认启用。 64 位应用程序将不会通过内存的“不可执行”区域来运行。不能禁用硬件启用的 DEP。
Windows XP SP2 上的软件启用 DEP 以及在任何处理器上运行的 32 位应用程序可以配置为使用内存的“可执行”或“不可执行”区域。
为了配合微软的DEP功能，Intel为自己的CPU开发了“Execute Disable Bit”(EDB)内存保护技术。目前Intel P4 Prescott(mPGA478与LGA775封装)为C0或D0步进核心，最新的J系列P4 Prescott采用E0步进核心。其中只有J系列P4 Prescott具备防病毒功能，只有它才真正支持EDP技术，能够配合SP2的DEP防毒功能，让针对缓冲区溢出(buffer overrun)漏洞设计的病毒失效，预防它们复制并散播到其他系统。
AMD 64位处理器最先支持微软的DEP技术。为了配合DEP，AMD与微软一起设计研发了AMD的新芯片功能“Enhanced Virus Protection”(EVP增强病毒保护)。AMD 64位处理器(包括Athlon 64/Athlon 64 FX/Athlon 64移动版本/Sempron移动版本等)都将具有EVP功能。EVP功能可以和SP2的DEP技术配合，防范“缓存溢出”这一常见攻击手段，打击一些病毒和蠕虫，对收发电子邮件、下载文件等日常工作进行更好的保护。[1]
DEP的安全机制
DEP(Data Execution Prevention)即“数据执行保护”，这是Windows的一项安全机制，主要用来防止病毒和其他安全威胁对系统造成破坏。微软从Windows XP SP2引入了该技术，并一直延续到此后的Windows Server 2003、Windows Server 2008中。毫无例外，在Windows 7中DEP也作为一项安全机制被引入进来。本文将对Windows 7下的DEP进行一番解析。
1、DEP的安全机制可以说，溢出是操作系统(应用软件)永远的痛，Windows 7自然也不例外。所谓溢出主要指缓冲区溢出，就是利用系统(应用软件)漏洞从只有Windows和其他程序可以使用的内存位置执行恶意代码从而达到控制系统的目的。如前所述，缓冲区溢出攻击经常在其它程序的内存缓冲区写入可执行的恶意代码，然后诱骗程序执行恶意代码。使用DEP的目的是阻止恶意插入代码的执行，其运行机制是，Windows利用DEP标记只包含数据的内存位置为非可执行(NX)，当应用程序试图从标记为NX的内存位置执行代码时，Windows的DEP逻辑将阻止应用程序这样做，从而达到保护系统防止溢出。
2、DEP的实现方式微软DEP实现采用了两种方式，即硬件强制DEP和软件强制DEP。硬件强制DEP，这需要处理器的支持，不过现在大多数处理器是支持DEP的。软件强制DEP，这是由Windows操作系统在系统内存中为保存的数据对象自动添加的一组特殊指针提供。如何知道自己的处理器是否支持DEP呢？右键单击桌面上的“计算机”图标，选择“属性”，在打开的“系统”窗口中点击“高级系统设置”链接打开“系统属性”面板。在“高级”选项卡页面中的“性能”下点击“设置”打开“性能选项”面板。点击“数据执行保护”选项卡，在该页面中我们可确认自己计算机的处理器是否支持DEP。如果支持会在底部的一行显示“你的计算机处理器支持基于硬件的DEP。”，反之会显示“你的计算机处理器不支持基于硬件的DEP，不过，Windows能使用DEP软件防止一些类型的攻击。”(图1)
  [1]
3、DEP的运行级别根据启动参数的不同，DEP工作状态可以分为四种。
（1）Optin：默认仅将DEP保护应用于Windows系统组件和服务，对于其他程序不予保护，但用户可以通过应用程序兼容性工具(ACT，Application Compatibility Toolkit)为选定的程序启用DEP，在Vista下边经过/NXcompat选项编译过的程序将自动应用DEP。这种模式可以被应用程序动态关闭，它多用于普通用户版的操作系统，如Windows XP、Windows Vista、Windows7。
（2）Optout：为排除列表程序外的所有程序和服务启用DEP，用户可以手动在排除列表中指定不启用DEP保护的程序和服务。这种模式可以被应用程序动态关闭，它多用于服务器版的操作系统，如 Windows 2003、Windows 2008。
（3）AlwaysOn：对所有进程启用DEP 的保护，不存在排序列表，在这种模式下，DEP不可以被关闭，目前只有在64位的操作系统上才工作在AlwaysOn模式。
（4）AlwaysOff：对所有进程都禁用DEP，这种模式下，DEP也不能被动态开启，这种模式一般只有在某种特定场合才使用，如DEP干扰到程序的正常运行。[1]
在Windows 7中，DEP默认是激活的。不过，DEP不能保护系统中所有运行的应用程序，实际DEP能够保护的程序列表由DEP的保护级别定义。DEP支持两种保护级别：级别1，只保护Windows系统代码和可执行文件，不保护系统中运行的其它微软或第三方应用程序；级别2，保护系统中运行的所有可执行代码，包括Windows系统代码和微软或第三方应用程序。默认情况下，Windows 7的DEP运行在级别1的保护状态下。在“数据执行保护”配置面板中，我们能够设置DEP的保护级别。如图所示笔者的Windows 7默认“只为基本的Windows程序和服务激活了DEP”，即DEP保护级别为1。当然，我们也可选择“除了以下所选择的，为所有程序和服务打开DEP” 切换到DEP保护级别2。
在保护级别Level 2可以选择特定的应用程序不受DEP保护。在实际应用中，这个功能非常重要，因为一些老的应用程序在激活DEP时无法正常运行。 例如，我我们在使用Word进行文本编辑时，它会自动被排除在DEP保护之外。需要注意的是，在将DEP保护切换到级别2之前，必须运行应用程序兼容性测试，确保所有的应用程序在DEP激活时能正常运行。从DEP中排除应用程序， 需要在DEP配置页面使用“添加”按钮，将应用程序的可执行文件加入到排除列表中。
4、如何关闭DEP保护需要提醒的是，当DEP运行在保护级别为2时，由于需要在处理器和系统内存运行所有的DEP检查，会影响系统性能，使得系统运行将会变慢一些，所以在某些情况下我们可以考虑完全关闭DEP保护。我们知道在DEP设置面板中是不提供关闭DEP选项的，那如何关闭呢？如果是Vista以前的系统，我们可以通过修改Boot.ini文件，在其中添加NoExecute=Always0ff语句来关闭。而在Windows Vista、Windows Server 2008和Windows 7中，boot.ini文件已经被启动配置数据(Boot Configuration Data)即BCD文件所代替，不过我们可以使用微软提供的命令行工具bcdedit.exe来编辑BCD文件。
我们在命令提示符下运行不带有任何参数的bcedit命令，可以看到当前的启动配置，如图所示显示了在Windows 7下运行bcdedit的结果，其中最后一行显示nx OptIn，表示当前的DEP保护级别为1，如果显示为OptOut则表示当前的EDP保护级别为2。如果我们要关闭DEP，只需将nx设置为Always0ff即可。在命令行下执行命令“bcdedit /set nx alwaysoff”，重启系统后Windows 7的DEP就关闭了。反之，如果要开启所有服务和应用程序的DEP，执行命令“bcdedit /set nx alwayson”就可以了。
DEP的局限性
如同前面介绍的安全机制一样，DEP也有着自身的局限性。
首先，硬件DEP需要CPU的支持，但并不是所有的CPU都提供了硬件DEP的支持，在一些比较老的CPU上边DEP是无法发挥作用的。
其次，由于兼容性的原因Windows不能对所有进程开启DEP保护，否则可能会出现异常。例如一些第三方的插件DLL，由于无法确认其是否支持DEP，对涉及这些DLL的程序不敢贸然开启DEP保护。再有就是使用ATL 7.1或者以前版本的程序需要在数据页面上产生可以执行代码，这种情况就不能开启DEP保护，否则程序会出现异常。
再次，/NXCOMPAT编译选项，或者是IMAGE_DLLCHARACTERISTICS_NX_COMPAT的设置，只对Windows Vista 以上的系统有效。在以前的系统上，如Windows XP SP3等，这个设置会被忽略。也就是说，即使采用了该链接选项的程序在一些操作系统上也不会自动启用DEP保护。
最后，当DEP工作在最主要的两种状态Optin和Optout下时，DEP是可以被动态关闭和开启的，这就说明操作系统提供了某些API函数来控制DEP的状态。同样很不幸的是早期的操作系统中对这些API函数的调用没有任何限制，所有的进程都可以调用这些API函数，这就埋下了很大的安全隐患，也为我们突破DEP提供了一条道路。[1]