关于物理地址扩展

博客转移:http://vivianke.blog.163.com/blog/static/29715271200762343752387/

(转载地址不详)

 

关于物理地址扩展

数据执行保护
数据执行保护的作用是什么?
    数据执行保护 (DEP) 是一组硬件和软件技术,用来对内存执行附加检查以帮助防止恶意代码的入侵。在 Windows XP SP2 中,由硬件和软件强制执行 DEP。
硬件强制的 DEP
        硬件强制的 DEP 将一个进程中所有内存位置均标记为非可执行,除非该位置明确包含可执行代码。有一类攻击程序企图在非可执行的内存位置中插入代码并执行代码。通过截取这些代码并产生一个异常,数据执行保护有助于防范这些攻击。
    硬件强制的 DEP 依靠处理器硬件标记内存,使内存带有一个属性,表明不应该执行此处的代码。数据执行保护以每个虚拟内存页面为基础发挥作用,通常会修改页表项 (page table entry - PTE) 中的一个数据位,对内存加以标记。
    具体的 DEP 硬件实现和虚拟内存页的标记方式会根据处理器架构的不同而有所变化。但是,从一个使用相应属性集标记的页面上执行代码,支持硬件强制 DEP 功能的处理器将会产生一个异常。
Advanced Micro Devices? (AMD) 和 Intel? Corporation 都已定义并推出了针对数据执行保护的 Windows-compatible(兼容)架构。
    从 Windows XP Service Pack 2 开始,32 位版本的 Windows 开始使用由 AMD 定义的非执行页面保护 (NX) 处理器功能或由 Intel 定义的执行禁用位 (Execute Disable bit) 功能。要使用这些处理器功能,处理器必须以“物理地址扩展”(PAE) 模式运行。64 位版本的 Windows XP 使用 64 位扩展上的 NX 处理器功能,以及 IPF 处理器上访问权限页表项 (PTE) 字段中的某些值。
    可以期望,所有未来的 32 位和 64 位处理器都支持硬件强制实施的数据执行保护功能。Microsoft 将继续与处理器制造商合作促进 DEP 技术的应用和发展。
软件强制的 DEP
        Windows XP SP2 中已经添加了另一组数据执行保护的安全检查。这些检查功能也称为软件强制的 DEP,旨在降低 Windows 异常处理机制的使用。软件强制的 DEP 能够在可运行 Windows XP SP2 的任何处理器上运行。默认情况下,软件强制的 DEP 仅保护有限的系统二进制文件,而不管处理器的硬件强制 DEP 功能如何。
此功能适用于哪些用户?
    应用程序和驱动程序开发人员应该了解数据执行保护以及在一个支持平台上运行软件所应具备的条件。执行实时 (just-in-time - JIT) 代码生成,或从默认进程堆栈或堆执行内存的应用程序应对 DEP 的要求加以认真对待。
    我们鼓励驱动程序开发人员重视支持硬件强制数据执行保护的平台上的 PAE 模式。在 Windows XP Service Pack 2 系统中 PAE 模式的行为已发生变更,以便改善驱动程序的兼容性。
Windows XP Service Pack 2 中对此功能添加了哪些新功能?
32 位版本的 Windows 和应用程序中的数据执行保护

详细说明
硬件强制的 DEP
        尽管有几点不同,数据执行保护的整体行为在 Windows 的 32 位版本和 64 位版本上完全相同。为了向应用程序和驱动程序的开发人员提供一致性,内存保护模型(包括数据执行保护)被设计为在 32 位和 64 位版本的 Windows 上具有相同的行为。
    应用程序开发人员应了解用户模式中的 DEP 行为。用户模式下的一个 DEP 异常会导致 Windows 系统上的一个 STATUS_ACCESS_VIOLATION (0xc0000005)。ExceptionInformation 的第一个参数(位于 EXCEPTION_RECORD 结构中)包含了所发生的访问违例的类型。如果 ExceptionInformation[0] 中值为 8,说明访问违例是一个执行违例。
    在大多数进程中,STATUS_ACCESS_VIOLATION 异常将是一个无法处理的异常,会导致进程终止。
    DEP 也适用于内核模式的驱动程序。内核模式中内存区域的 DEP 不能有选择地启用或禁用。在 32 位版本的 Windows 中,数据执行保护默认情况下应用于堆栈。这和 Windows 64 位版本中的内核模式 DEP 不同,在 64 位版本中,堆栈、页面缓冲池以及会话池已经采用了数据执行保护。
    如果启用了 DEP,不允许设备驱动程序从堆栈中执行代码。内核模式中的 DEP 访问违例会导致一个检测错误 0xFC:ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY
软件强制的 DEP
        软件强制的 DEP 对 Windows 中的异常处理机制执行额外的检查。如果程序的图像文件是使用安全结构异常处理 (SafeSEH) 功能建立的,则软件强制的 DEP 将确保在调度异常之前,在图像文件中的函数表中注册了异常处理程序。
    如果程序的图像文件不是使用 SafeSEH 建立的,则软件强制的 DEP 将确保在调度异常之前,位于内存区域中的异常处理程序已经标记为可执行。
为什么此更改非常重要?它有助于缓解哪些威胁?
    数据执行保护的主要好处在于:它有助于防止代码从数据页(如默认堆、各种堆栈以及内存池)中被执行。在系统正常的操作中,代码通常不会从默认的堆或堆栈中执行。硬件强制的 DEP 将检测从这些位置运行的代码,并在代码被执行时产生一个异常。如果异常没有被处理,进程将终止。在内核模式下执行受保护内存中的代码会导致一个检测错误。
    检测错误会导致进程终止或系统失败,这似乎不是理想的用户体验,但这有助于防止恶意代码的执行。防止恶意代码在系统内被执行可以阻止系统受损或恶意代码的传播,这些恶意代码产生的有害影响远远大于由检测错误导致的进程终止的影响。
    DEP 有助于缓解某类安全性入侵。尤其是,如果病毒或其他攻击将额外的代码插入到进程中并试图执行所插入的代码,则数据执行保护可以防止这种行为。在支持 DEP 的系统中,执行被插入的代码会导致一个异常。软件强制的 DEP 有助于降低 Windows 异常处理机制的使用。
    DEP 的另一个好处与应用程序和驱动程序开发人员的良好的软件工程经验以及最佳实践相关。在没有明确地将页标记为可执行的情况下,数据执行保护可以强制开发人员避免执行页面以外的代码。
哪些功能发生了变化?
应用程序兼容性
    某些应用程序行为可能和数据执行保护不兼容。执行动态代码生成(例如实时代码生成)的应用程序,以及不能将生成的代码明确标记为可执行代码的应用程序可能会出现与数据执行保护不兼容的问题。对于不是使用 SafeSEH 建立的应用程序而言,其异常处理程序必须位于可执行的内存区域中。
    试图违反 DEP 的应用程序会收到一个异常,状态代码为 STATUS_ACCESS_VIOLATION (0xC0000005)。如果某应用程序需要可执行内存,那么它必须在相应的内存上明确设置该属性,方法是:在 Virtual* 内存分配函数的内存保护参数中指定 PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE 或 PAGE_EXECUTE_WRITECOPY。使用 malloc() 和 HeapAlloc() 函数分配的堆是不可执行的。
驱动程序兼容性
    驱动程序与数据执行保护的兼容性问题主要集中在 PAE 模式引发的兼容性问题上。
注意 仅在具有支持硬件强制 DEP 的处理器的系统上才需要 PAE。
    DEP 自身可能会与执行代码生成的驱动程序或使用其他技术实时生成可执行代码的驱动程序产生兼容性问题。DEP 对于在 Windows 64 位版本上加载的驱动程序来说是“始终启用”的,所以具有上述行为的许多驱动程序都应该进行修正,但是并不能保证所有这些驱动程序都已经进行了更新。不过,只有很少的驱动程序使用了这些技术,而且我们也不希望 DEP 本身引起大量的驱动程序兼容问题。
    对驱动程序兼容性的主要担心是在 32 位系统下运行物理地址扩展 (PAE) 模式。PAE 模式允许处理器寻址 4GB 以上的内存空间。PAE 内存分页和非 PAE 内存分页模式的主要区别是 PAE 模式要求的额外分页级别(3 级而非 2 级)。
    如果启用 PAE,那么有些驱动程序可能无法加载,因为设备可能无法执行 64 位寻址或驱动程序可能认为 PAE 模式要求多于 4GB 的 RAM。此类驱动程序在 PAE 模式下应该始终接收 64 位地址,而且它们(或它们的设备)不能解释这种地址。
    在 PAE 模式下,通过直接修改系统页表项 (PTE),可以加载其他驱动程序,但会引起系统不稳定。这些驱动程序希望使用 32 位 PTE,但在 PAE 模式下却收到了 64 位 PTE。
    最大的驱动程序 PAE 兼容性问题涉及直接内存访问 (DMA) 传输和映射寄存器分配。许多支持 DMA 的设备(通常为 32 位适配器)都不能执行 64 位物理寻址。当在 32 位模式中运行时,设备可以在所有物理地址空间中进行寻址。在 PAE 模式下,数据的物理地址可能大于 4GB 空间。在这种情况下,为了允许设备在这些限制条件下运行,Windows 2000 Server 家族产品(及后续产品)通过提供由一个映射寄存器指示的 32 位地址,为 DMA 事务提供了双倍缓冲。设备可以对 32 位地址执行 DMA 事务,而且内核会将内存复制到提供给驱动程序的 64 位地址。
    当系统在禁用 PAE 的情况下运行时,32 位设备的驱动程序永远不会要求真实内存支持它们的映射寄存器。这意味着双倍缓冲是不必要的,因为在 32 位地址空间中包含了所有的设备和驱动程序。根据在配备 64 位处理器的计算机上对 32 位设备展开的驱动程序测试,可以认为,大多数接受测试和支持 DMA 的客户端驱动程序都期待获得无限制的映射寄存器。
    为了减少兼容性问题,Windows XP Service Pack 2 中包括对硬件抽象层 (HAL) 的修改,模仿了 32 位 HAL 的 DMA 行为。当系统在 PAE 模式中运行时,更改后的 HAL 允许存在无限制的映射寄存器。此外,内核内存管理器会忽略所有大于 4GB 的物理地址。任何超出 4GB 范围的系统 RAM 在 Windows 中均变为不可寻址,并且在系统中不可用。通过将地址空间限制为 4GB,具有 32 位 DMA 总线管理能力的设备将不会看到地址大于 4GB 的事务。因为这些修改去除了对事务进行双倍缓冲的需要,所以,它们可以避免某些驱动程序中与正确实现双倍缓冲支持有关的一类错误。
对 HAL 和内存管理器进行这些修改之后,可将设备驱动程序兼容性在系统(运行 Windows XP Service Pack 2 且启用数据执行保护功能)中造成的影响降至最低。
系统兼容性
    最后一个对 DEP 兼容性的担心来自于支持 PAE 模式的系统,即便是它们可能并不是针对大于 4GB 的物理内存所设计的。Microsoft 已经在测试中注意到,某些使用支持硬件强制 DEP 处理器的系统在 PAE 模式下运行,有时系统无法顺利引导或者出现其他稳定性问题。
    PAE 模式是利用 NX 处理器功能所必需的。因此,系统设计人员和固件工程师应该意识到,即使系统芯片组和固件可能没有设计为支持大于 4GB 的物理 RAM,但是系统可能运行在 PAE 模式下。
特别值得关注的一项是系统固件,它可以解释页表项以确定由操作系统执行的指令。当处理器在 PAE 模式下运行时,页表项的长度会扩展到 64 位。系统设计人员和固件开发人员应该与处理器和芯片组制造商联系,以了解有关如何安全确定由操作系统执行的指令的详细信息。
    使用 AMD 处理器的系统设计人员可以在“AMD Athlon? 64 和 AMD Opteron 处理器的 BIOS 和内核开发人员指南”中获取更多信息。要获取该白皮书,请访问 AMD Athlon? 64 网站 http://go.microsoft.com/fwlink/?LinkId=28165,并单击“BIOS and Kernel Developer’s Guide for AMD Athlon? 64 and AMD Opteron Processors”(AMD Athlon? 64 和 AMD Opteron 处理器的 BIOS 和内核开发人员指南)。
    Intel 未公开提供有关系统管理模式 (System Management Mode - SMM) 的详细信息。使用 Intel 处理器的系统设计人员可以直接与 Intel 联系,以获取更多信息。
    有关 Windows 对 PAE 模式支持的详细信息,请参阅 Microsoft 网站上的“Physical Address Extension - PAE Memory and Windows”(物理地址扩展 - PAE 内存和 Windows)。
如何解决这些问题?
    当分配内存时,需要可执行内存区域的应用程序必须使用 PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE 或 PAGE_EXECUTE_WRITECOPY 属性。此外,应用程序不能从默认进程堆或堆栈执行。执行的操作与 DEP 功能不兼容的多数应用程序都需要进行更新,以实现兼容。此外,应用程序还必须是使用 SafeSEH 建立的,或者要确保它们的异常处理程序位于明确标记为可执行的内存中。
    应用程序可以使用 VirtualAlloc() 应用程序编程接口 (API),以通过相应的内存保护选项来分配可执行内存。至少应该使用 PAGE_EXECUTE 内存保护选项。生成可执行代码后,建议的做法是,应用程序应将内存保护设置为不允许对已分配内存进行写访问。应用程序可以使用 VirtualProtect() API 来拒绝对已分配内存进行写访问。不允许写访问可确保对进程地址空间的可执行区域提供最大限度的保护。
    如果一个恶意进程企图在可执行区域插入代码,那么这种访问将会导致 STATUS_ACCESS_VIOLATION 写入异常。应用程序应该使其地址空间的可执行区域尽可能小。通过决定哪些可执行内存能够被插入到进程地址空间并执行,可以减小攻击面。
    此外,成熟的应用程序还可以控制其虚拟内存的布局并创建可执行区域。这些应用程序应该尝试在比非可执行区域更低的内存空间定位可执行区域。在非可执行区域以下定位可执行区域旨在避免缓冲区溢出到可执行内存中。
    少量可执行文件和库可能会在图像文件的数据部分包含可执行代码。某些情况下,应用程序可能会在数据部分放置若干小代码段(通常称为 thunk)。然而,数据执行保护会将内存中加载的图像文件部分标记为不可执行,除非该部分已应用可执行属性。
    因此,数据部分内的可执行代码应该迁移至代码部分,或者包含可执行代码的数据部分应该明确标记为可执行。可执行属性 IMAGE_SCN_MEM_EXECUTE (0x20000000) 应被添加到包含可执行代码的相应段的头部的 Characteristics 字段中。
    随 Microsoft VisualStudio 产品一起分发的 Microsoft 链接程序可以使用 /SECTION 链接程序选项来将可执行属性添加到段中。/SECTION 链接程序选项的格式如下:
/SECTION:名称,[E][R][W][S][D][K][L][P][X][,ALIGN=#]
E 值表示可执行属性 (0x20000000)。有关 /SECTION 和其他 Microsoft 链接程序选项的详细信,请访问 MSDN 网站 http://go.microsoft.com/fwlink/?LinkId=28167
    此外,Microsoft COFF 二进制文件编辑器 (Editbin.exe) 实用程序可用于修改现有图像的段属性。Editbin 实用程序具有 /SECTION 选项,格式如下:
/SECTION:名称[=newname][,[[!]{CDEIKOMPRSUW}][A{1248PTSX}]]
E 和 C 值分别表示代码和可执行属性。有关 Editbin 实用程序和 /SECTION 选项的详细信息,请参阅 MSDN 网站 http://go.microsoft.com/fwlink/?LinkId=28168
    Microsoft 计划更新 Microsoft .NET Framework v1.0 和 v1.1 以利用 Windows XP SP2 中的 DEP。依赖于 Microsoft .NET Framework 的应用程序将继续正常工作,但不会从 DEP 功能中获得任何益处(即使启用该功能也是如此)。
    Microsoft 鼓励应用程序开发人员重新分发 Microsoft .NET Framework 以便更新为 Microsoft .NET Framework v1.0 Service Pack 3 或 v1.1 Service Pack 1,从而在 DEP 可用时对其加以利用。
Windows XP Service Pack 2 中添加或更改了哪些设置?
系统级的 DEP 配置
    系统级的数据执行保护配置是通过 Boot.ini 开关控制的。此外,对“控制面板”中“系统”所做的修改可以使最终用户非常方便地配置 DEP 设置(假设最终用户以管理员身份登录系统)。
对于硬件强制和软件强制 DEP,Windows 支持四种系统级配置。
       配置                                   说明
OptIn(选择使用)
(默认配置)        如果系统中具备能够实现硬件强制 DEP 功能的处理器,则默认情况下
                      将对限定的系统二进制文件和“选择使用”的应用程序启用 DEP。
                      使用此选项时,默认情况下,DEP 仅覆盖 Windows 系统二进制文件。

OptOut(选择排除)        默认情况下,将对所有的进程启用 DEP。用户可以使用“控制面板”中的“系统”手
                     动创建不应用数据执行保护的特定应用程序列表。IT 专业人员和独立软件供应商 (ISV)  
                                          可以使用应用程序兼容性工具包选择不受 DEP 保护的一个或多个应用程序。用于 DEP
                                          的系统兼容性修复程序 (shims) 将会生效。
AlwaysOn(总是使用)        将整个系统置于 DEP 保护范围以内。所有的进程将始终在应用 DEP 的情况下运行。使
                     特定应用程序不受 DEP 保护的例外列表不可用。用于 DEP 的系统兼容性修复程序
                      (shims) 不会生效。使用应用程序兼容性工具包选出的应用程序也将在应用 DEP 的情况
                     下运行。

AlwaysOff(总是关闭)        不会将系统的任何部分置于 DEP 保护范围以内,无论是否支持硬件 DEP。处理器不会
                      在 PAE 模式下运行,除非启动项中选中 /PAE 选项。

    硬件强制和软件强制的 DEP 采用相同的方式进行配置。如果将系统级的 DEP 策略设置为 Opt-In(选择使用),Windows 核心二进制文件和应用程序将同时受到硬件和软件强制 DEP 的保护。如果系统无法进行硬件强制 DEP,则 Windows 核心二进制文件和应用程序将仅受到软件强制 DEP 的保护。
    同样,如果将系统级 DEP 策略设置为 Opt-Out(选择排除),排除在 DEP 保护范围内的应用程序会同时免受硬件和软件强制 DEP 的保护。
四个系统级 DEP 配置都是通过 boot.ini 开关控制的。Boot.ini 的设置如下所示:
/noexecute=策略级别
其中,策略级别被定义为 AlwaysOn、AlwaysOff、OptIn 或 OptOut
    安装 Windows XP SP2 或在支持和不支持硬件强制 DEP 功能的计算机之间移动 Windows 操作系统映像时,Boot.ini 文件中的任何现有 /noexecute 设置都不会发生改变。
    安装 Windows XP SP2 期间,默认情况下,将启用 OptIn 策略级别,除非在无人参与安装中指定不同的策略级别。如果在支持 DEP 的 Windows 版本的启动项中没有显示 /noexecute=策略级别设置,其行为与包含 /noexecute=OptIn 选项时相同。
    以管理员身份登录的最终用户可以使用“系统属性”对话框中的“数据执行保护”选项卡在“OptIn”和“OptOut”策略之间手动配置 DEP。以下过程描述如何在计算机上手动配置 DEP:
1.        依次单击“开始”、“控制面板”,然后双击“系统”。
2.        单击“高级”选项卡。然后,在“性能”下,单击“设置”。
3.        单击“数据执行保护”选项卡。
4.        单击“仅对基本 Windows 程序和服务启用 DEP”选择“OptIn”策略。
5.        单击“对所有程序和服务启用 DEP(选定的程序和服务除外)”选择“OptOut”策略。
6.        如果已选择“OptOut”策略,请单击“添加”并添加不想对其使用 DEP 的应用程序。
    IT 专家可以采用多种方法控制系统级的 DEP 配置。可以按脚本编写机制或使用 Windows XP SP2 中包含的 Bootcfg.exe 工具来直接修改 Boot.ini 文件。
    以无人参与模式安装 Windows XP SP2 时,您可以使用 Unattend.txt 文件来预先设定特定的 DEP 配置。您可以使用 Unattend.txt 文件的“[Data]”部分中的“OSLoadOptionsVar”项来指定系统级 DEP 配置。
预先配置应用程序 DEP
        为了在将 DEP 设置为“OptOut”策略级别的情况下实现应用程序的兼容,可以有选择性地对个别 32 位应用程序禁用 DEP。
    对于最终用户,可以使用“系统属性”中的“数据执行保护”选项卡对应用程序有选择性地禁用 DEP。
    对于 IT 专家,Windows XP Service Pack 2 中包含了一个名为 DisableNX 的全新应用程序兼容性修复程序。DisableNX 兼容性修复程序可以针对它所适用的程序禁用数据执行保护。
    DisableNX 兼容性修复程序可以通过“应用程序兼容性工具包”应用到应用程序中。有关 Windows 应用程序兼容性的详细信息,请参阅 Microsoft 网站 http://go.microsoft.com/fwlink/?LinkId=23302 中的“Windows Application Compatibility”(Windows 应用程序兼容性)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值