代码完整性检查

内存完整性一种基于虚拟化的安全 (VBS) 功能,可在 Windows 10、Windows 11 和 Windows Server 2016 及更高版本中使用。 内存完整性和 VBS 改进了 Windows 的威胁模型,并针对试图利用 Windows 内核的恶意软件提供更强大的保护。 VBS 使用 Windows 虚拟机监控程序创建独立的虚拟环境,该环境成为假定内核可能遭到入侵的 OS 的信任根。 内存完整性是一个关键组件,它通过在 VBS 的隔离虚拟环境中运行内核模式代码完整性来保护和强化 Windows。 内存完整性还限制可用于破坏系统的内核内存分配,确保内核内存页仅在安全运行时环境中通过代码完整性检查后才成为可执行的,并且可执行页本身永远不会可写。

注意

内存完整性有时称为 虚拟机监控程序保护的代码完整性 (HVCI) 虚拟机监控程序强制实施的代码完整性,最初作为 Device Guard 的一部分发布。 除了在 组策略 或 Windows 注册表中查找内存完整性和 VBS 设置外,不再使用 Device Guard。

代码完整性检查可确保与内存完整性的内核内存使用要求兼容,并检测以下冲突:

错误代码 代码完整性问题
0x2000:
  • 2 - 驱动程序代码中检测到错误的地址。
  • 3 - 池类型。
  • 4 - 池标记 ((如果) 提供)。

调用方指定了一个可执行池类型。 预期 (:NonPagedPoolNx)
0x2001:
  • 2 - 驱动程序代码中检测到错误的地址。
  • 3 - 页面保护 (WIN32_PROTECTION_MASK) 。
调用方指定了一个可执行页面保护。 预期 (:清除PAGE_EXECUTE位)
0x2002:
  • 2 - 驱动程序代码中检测到错误的地址。
  • 3 - 使用 MdlMapping*) 在逻辑上 (MM_PAGE_PRIORITY 页面优先级。
调用方指定了可执行的 MDL 映射。 (预期:MdlMappingNoExecute) 。
0x2003:
  • 2 - 图像文件名 (Unicode 字符串) 。
  • 3 - 节标头的地址。
  • 4 - 节名称 (UTF-8 编码字符串) 。
映像包含可执行和可写节。
0x2004:
  • 2 - 图像文件名 (Unicode 字符串) 。
  • 3 - 节标头的地址。
  • 4 - 节名称 (UTF-8 编码字符串) 。
映像包含未对齐页面的节。
0x2005:
  • 2 - 图像文件名 (Unicode 字符串) 。
  • 3 - IAT 目录。
  • 4 - 节名称 (UTF-8 编码字符串) 。
该映像包含位于可执行部分中的 IAT。

激活此选项:

可以使用驱动程序验证程序管理器或 Verifier.exe 命令行为一个或多个驱动程序激活代码完整性检查。 有关详细信息,请参阅 选择驱动程序验证程序选项。 必须重新启动计算机才能激活或停用代码完整性检查选项。

  • 在命令行

    在命令行中,代码完整性检查由 0x02000000 (位 25) 表示。 例如:

    verifier /flags 0x02000000 /driver MyDriver.sys

    下次启动后,该功能将处于活动状态。

  • 使用驱动程序验证程序管理器

  1. 启动驱动程序验证程序管理器。 在命令提示符窗口中键入验证程序。
  2. 选择“为代码开发人员创建自定义设置 () ,然后单击”下一步”。
  3. 选择“ (检查) 代码完整性检查”。
  4. 重新启动计算机。

实现内存完整性兼容代码