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 保护,其逻辑分为两部分:
第一部分:纯文件名检测(不打开文件)
- 获取文件名前面的路径,计算一个类似于 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 值影响验证结果
注意事项:
- 本文仅提供技术分析思路
- 修改系统关键文件可能导致系统不稳定
- 实际应用中需谨慎操作