Windows sfc 的粗浅思路分享
字数 2465 2025-08-25 22:59:15

Windows SFC 工具深入分析与利用思路

1. SFC 工具概述

System File Checker (SFC) 是 Windows 系统自带的用于扫描和修复系统关键文件的工具,其核心功能基于 Windows Resource Protection (WRP) 机制。

WRP 是 Windows 的系统保护机制,主要功能:

  • 防止替换重启操作系统所必须的关键基础文件、注册表和文件夹
  • 保护系统完整性
  • 允许管理员扫描所有受保护的资源,验证版本并进行修复

2. IsFileProtected 函数执行流程分析

IsFileProtected 是 sfc_os.dll 的导出函数,用于判断文件是否受 WRP 保护,其逻辑分为两部分:

第一部分:纯文件名检测(不打开文件)

  1. 获取文件名前面的路径,计算一个类似于 hash 的值(基于文件名)
  2. 检查该文件是否存在于 C:\Windows\WinSxS\FileMaps 中:
    • 如果不存在 → 进入第二部分验证
    • 如果存在 → 获取要检查的文件名部分,查看对应 hash 文件内是否存在该文件名
      • 存在 → 受保护
      • 不存在 → 不受保护

第二部分:注册表检查(即插即用文件验证)

  1. 根据注册表检查是否是即插即用文件
  2. 判断依据:对应注册表中 class 字段值是否为 1
    • 为 1 → 受 WRP 保护
    • 不为 1 → 不受保护

3. Windows XP 源码分析参考

虽然 Windows 10 实现有所不同,但核心逻辑相似:

  • sfc.dll 指向 sfc_os.dll,主要功能在 sfc_os.dll 中
  • IsFileProtected 函数最终调用 SfcSrv_IsFileProtected
  • Windows XP 中通过 sfcInitializeDllLists 函数加载保护列表
    • 受保护文件列表静态存储在 x86_wks.h 文件中
    • 不同国家/地区有不同版本
    • Windows XP 使用 sfcfiles.dll 加载资源文件(Windows 10 已弃用)

4. 分析方法论

行为分析方法

  1. 使用 Process Monitor 捕获读取行为:

    • 受保护文件列表可能存储在单独文件或嵌入 dll 中
    • 必定存在读取行为(从文件或自身数据解密)
  2. 第二部分分析技巧:

    • 注册表读取行为明显
    • 定位到 setupapi.dll 的 PnpIsFilePnpDriver 函数
    • 通过注册表相关字符串检索锁定代码块
  3. 第一部分分析技巧:

    • 使用 CreateFileMapping 映射文件操作(相当于读取)
    • 通过字符串列表定位代码块
    • 使用 xdbg 跟踪 kernel.dll 字符串下的硬件断点

SFC /VERIFYFILE=PATH 流程分析

sfc /VERIFYFILE=c:\windows\system32\kernel32.dll 为例:

  1. 首先执行 IsFileProtected 判断文件名是否在 WRP 列表中
  2. 从注册表获取系统版本号、架构、地区等属性
  3. 计算唯一 hash 值(格式示例):x86_microsoft-windows-kernel32_31bf3856ad364e35_10.0.19041.1202_none_ac5f76a753246f13
  4. 定位注册表位置:HKEY_LOCAL_MACHINE\COMPONENTS\DerivedData\Components
    • 关键值:S256(自定义 hash 算法计算,非标准 sha256)
  5. TiWorker.exe 调用 Windows::Cms::Rtl::FileHashAlgorithmToDigest 进行 hash 计算
  6. 其他验证:
    • 定位 C:\Windows\WinSxS\Manifests 获取 .manifest 清单文件
    • 计算并比对 sha256 值

5. TiWorker.exe 分析技巧

  1. 进程关系:

    • TiWorker.exe 由 svchost.exe 通过 CreateProcess 启动
    • 是 Windows 模块安装程序的一部分
  2. 调试方法:

    • 附加 svchost.exe 并在 CreateProcess 函数下断点
    • 或直接附加 TiWorker.exe(需快速操作,进程存在时间短)
  3. COM 接口分析:

    • sfc.exe 调用 CoCreateInstance
    • 参数:
      • rclsid: {8F5DF053-3013-4dd8-B5F4-88214E81C0CF}
      • riid: {90ED9FAA-A6E5-4671-8E50-1C060F8B9C47}
    • 对应接口类:ISFPIntergrityCheckAndRepair(未公开文档)

6. 实际利用思路

文件保护绕过

  1. 修改注册表 S256 值可以使文件验证失败
  2. 但需注意多文件校验机制(如 .manifest 文件校验)

开发自定义组件

  1. 逆向 sfc_os.dll 关键函数
  2. 提取文件验证逻辑
  3. 集成到自定义程序中

7. 官方参考信息

  1. 替换受 WRP 保护的文件方法:

    • 参考 Microsoft 官方文档:Use the System File Checker tool to repair missing or corrupted system files
  2. 注册表访问:

    • HKLM_COMPONENTS 需要手动导入

8. 总结

关键知识点:

  1. SFC 基于 WRP 机制保护系统文件
  2. 文件验证分为文件名检测和注册表验证两部分
  3. 实际验证由 TiWorker.exe 执行,使用自定义 hash 算法
  4. 注册表 HKEY_LOCAL_MACHINE\COMPONENTS\DerivedData\Components 存储关键验证信息
  5. 可通过修改 S256 值影响验证结果

注意事项:

  • 本文仅提供技术分析思路
  • 修改系统关键文件可能导致系统不稳定
  • 实际应用中需谨慎操作
Windows SFC 工具深入分析与利用思路 1. SFC 工具概述 System File Checker (SFC) 是 Windows 系统自带的用于扫描和修复系统关键文件的工具,其核心功能基于 Windows Resource Protection (WRP) 机制。 WRP 是 Windows 的系统保护机制,主要功能: 防止替换重启操作系统所必须的关键基础文件、注册表和文件夹 保护系统完整性 允许管理员扫描所有受保护的资源,验证版本并进行修复 2. IsFileProtected 函数执行流程分析 IsFileProtected 是 sfc_ os.dll 的导出函数,用于判断文件是否受 WRP 保护,其逻辑分为两部分: 第一部分:纯文件名检测(不打开文件) 获取文件名前面的路径,计算一个类似于 hash 的值(基于文件名) 检查该文件是否存在于 C:\Windows\WinSxS\FileMaps 中: 如果不存在 → 进入第二部分验证 如果存在 → 获取要检查的文件名部分,查看对应 hash 文件内是否存在该文件名 存在 → 受保护 不存在 → 不受保护 第二部分:注册表检查(即插即用文件验证) 根据注册表检查是否是即插即用文件 判断依据:对应注册表中 class 字段值是否为 1 为 1 → 受 WRP 保护 不为 1 → 不受保护 3. Windows XP 源码分析参考 虽然 Windows 10 实现有所不同,但核心逻辑相似: sfc.dll 指向 sfc_ os.dll,主要功能在 sfc_ os.dll 中 IsFileProtected 函数最终调用 SfcSrv_IsFileProtected Windows XP 中通过 sfcInitializeDllLists 函数加载保护列表 受保护文件列表静态存储在 x86_ wks.h 文件中 不同国家/地区有不同版本 Windows XP 使用 sfcfiles.dll 加载资源文件(Windows 10 已弃用) 4. 分析方法论 行为分析方法 使用 Process Monitor 捕获读取行为: 受保护文件列表可能存储在单独文件或嵌入 dll 中 必定存在读取行为(从文件或自身数据解密) 第二部分分析技巧: 注册表读取行为明显 定位到 setupapi.dll 的 PnpIsFilePnpDriver 函数 通过注册表相关字符串检索锁定代码块 第一部分分析技巧: 使用 CreateFileMapping 映射文件操作(相当于读取) 通过字符串列表定位代码块 使用 xdbg 跟踪 kernel.dll 字符串下的硬件断点 SFC /VERIFYFILE=PATH 流程分析 以 sfc /VERIFYFILE=c:\windows\system32\kernel32.dll 为例: 首先执行 IsFileProtected 判断文件名是否在 WRP 列表中 从注册表获取系统版本号、架构、地区等属性 计算唯一 hash 值(格式示例): x86_microsoft-windows-kernel32_31bf3856ad364e35_10.0.19041.1202_none_ac5f76a753246f13 定位注册表位置: HKEY_LOCAL_MACHINE\COMPONENTS\DerivedData\Components 关键值:S256(自定义 hash 算法计算,非标准 sha256) TiWorker.exe 调用 Windows::Cms::Rtl::FileHashAlgorithmToDigest 进行 hash 计算 其他验证: 定位 C:\Windows\WinSxS\Manifests 获取 .manifest 清单文件 计算并比对 sha256 值 5. TiWorker.exe 分析技巧 进程关系: TiWorker.exe 由 svchost.exe 通过 CreateProcess 启动 是 Windows 模块安装程序的一部分 调试方法: 附加 svchost.exe 并在 CreateProcess 函数下断点 或直接附加 TiWorker.exe(需快速操作,进程存在时间短) COM 接口分析: sfc.exe 调用 CoCreateInstance 参数: rclsid: {8F5DF053-3013-4dd8-B5F4-88214E81C0CF} riid: {90ED9FAA-A6E5-4671-8E50-1C060F8B9C47} 对应接口类:ISFPIntergrityCheckAndRepair(未公开文档) 6. 实际利用思路 文件保护绕过 修改注册表 S256 值可以使文件验证失败 但需注意多文件校验机制(如 .manifest 文件校验) 开发自定义组件 逆向 sfc_ os.dll 关键函数 提取文件验证逻辑 集成到自定义程序中 7. 官方参考信息 替换受 WRP 保护的文件方法: 参考 Microsoft 官方文档:Use the System File Checker tool to repair missing or corrupted system files 注册表访问: HKLM_ COMPONENTS 需要手动导入 8. 总结 关键知识点: SFC 基于 WRP 机制保护系统文件 文件验证分为文件名检测和注册表验证两部分 实际验证由 TiWorker.exe 执行,使用自定义 hash 算法 注册表 HKEY_LOCAL_MACHINE\COMPONENTS\DerivedData\Components 存储关键验证信息 可通过修改 S256 值影响验证结果 注意事项: 本文仅提供技术分析思路 修改系统关键文件可能导致系统不稳定 实际应用中需谨慎操作