终极解析:BlueHammer 的 VSS 卷影复制技巧——FreezeVSS 如何用 HarddiskVolumeShadowCopy 冻结 Defender
终极解析BlueHammer 的 VSS 卷影复制技巧——FreezeVSS 如何用 HarddiskVolumeShadowCopy 冻结 Defender【免费下载链接】BlueHammerRepository hosting the bluehammer vulnerability项目地址: https://gitcode.com/gh_mirrors/bl/BlueHammerBlueHammer 是一款研究 Windows Defender 防御机制的开源漏洞 PoC 项目。它的核心看点是FreezeVSS函数通过监听HarddiskVolumeShadowCopy卷影复制对象配合云文件同步根与批量 oplock 锁在 Defender 更新签名前将其冻结从而劫持其签名更新流程。本文将用小白也能懂的方式完整拆解这套 VSS 卷影复制技巧的实现思路。一、BlueHammer 是什么30 秒看懂项目背景BlueHammer 仓库见 README.md自述为 Repository hosting the bluehammer vulnerability托管 bluehammer 漏洞的仓库。作者以一种调侃的语气写道Im just really wondering what was the math behind their decision...这说明它针对的是 Windows Defender 签名更新流程中的一个设计缺陷Defender 在应用新引擎签名前会创建卷影副本VSS而这个环节可以被攻击者卡住使 Defender 长时间处于半冻结状态并被迫从攻击者指定的目录加载签名。仓库结构非常精简核心文件一览文件作用FunnyApp.cppPoC 主程序包含全部核心技巧windefend.idl逆向出的 Defender 私有 RPC 接口定义windefend_h.h / windefend_c.c / windefend_s.c由 IDL 生成的 RPC 存根代码offreg.h / offreg.lib离线注册表操作库用于离线攻击场景FunnyApp.sln / FunnyApp.vcxprojVisual Studio 工程文件FunnyApp.rc / resource.h资源脚本与资源定义 下文聚焦主角VSS 卷影复制相关的四段代码全部位于 FunnyApp.cpp 中标注为 Volume shadow copy functions 的区块。二、核心概念VSS 卷影复制与 HarddiskVolumeShadowCopy 速成在深入代码前先补齐两个必备知识点 1️⃣ 什么是 VSS 卷影复制Windows 的 Volume Shadow Copy Service卷影复制服务能在不中断系统运行的前提下为卷上的文件拍一张快照。Defender 更新引擎签名时会先做快照确保更新失败可以回滚。2️⃣ HarddiskVolumeShadowCopy 又是什么每个 VSS 快照在 Windows 内核的设备命名空间中都会注册一个设备对象名字固定形如\Device\HarddiskVolumeShadowCopy0、\Device\HarddiskVolumeShadowCopy1……也就是说只要枚举\Device目录就能实时发现系统里新出现的卷影副本——这正是 BlueHammer 抓住 Defender 更新时机的雷达。三、整体链路从检查更新到冻结 Defender 的 4 步流程BlueHammer 的主流程可以概括为一条流水线CheckForWDUpdates → GetUpdateFiles → TriggerWDForVS → RPC 调用 ServerMpUpdateEngineSignature (发现新签名) (下载解包) (冻结等快照) (骗 Defender 加载假签名)第 1 步检查更新— CheckForWDUpdates() 调用 Windows Update 组件查询是否存在 Microsoft Defender Antivirus 分类的 Definition Updates没有就每 30 秒轮询一次。第 2 步下载解包— GetUpdateFiles() 通过 WinInet 下载 Defender 官方更新包解析 PE 的.rsrc资源段抽出update.cab再用 FDI 库解包成签名文件列表。第 3 步冻结 捕获快照— TriggerWDForVS() 是本文主角内部调度下面两个线程。第 4 步RPC 劫持— 通过逆向出的私有接口windefend.idlUUIDc503f532-443a-4c69-8300-ccd1fbdb3839接口名IMpService77BDAF73调用Proc42_ServerMpUpdateEngineSignature把签名目录指向攻击者构造的路径Defender 便会加载伪造签名。下面逐个拆解 VSS 相关的两大技巧。四、技巧一用 NtQueryDirectoryObject 监听新的 HarddiskVolumeShadowCopy 目标一旦 Defender 为更新创建了新快照立刻拿到它的设备路径。实现位于 ShadowCopyFinderThread()思路分三层1. 快照基线枚举辅助函数 RetrieveCurrentVSSList() 先用NtOpenDirectoryObject打开\Device对象目录再用NtQueryDirectoryObject遍历其中所有对象筛选出TypeName为Device且名字以HarddiskVolumeShadowCopy开头见 第 1093-1098 行的条目形成一份运行前已有快照的基线链表LLShadowVolumeNames。2. 轮询发现新面孔主循环反复枚举\Device目录把当前枚举到的HarddiskVolumeShadowCopy*与基线对比第 1272-1296 行名字在基线里出现过 →continue跳过出现了基线之外的新名字→ 判定为新创建的快照拼出完整路径\Device\HarddiskVolumeShadowCopyN跳出循环。3. 验证快照可用拿到新路径后追加\Windows子路径用NtCreateFile尝试打开第 1323-1336 行如果返回STATUS_NO_SUCH_DEVICE就重试直到能成功打开——这说明快照已完成挂载可以安全使用。为什么用 NT 原生 API 而不是 Win32因为HarddiskVolumeShadowCopy对象位于内核对象命名空间Win32 的卷影 API如IVssCreateSnapshot无法直接枚举谁刚生成了新快照只能靠对象目录轮询这种硬桥硬上的方式。五、技巧二FreezeVSS 如何用云文件同步根冻结 Defender⭐ 这是 BlueHammer 最精妙的部分——FreezeVSS() 线程由 第 1723 行 创建。它的武器不是杀进程而是让 Defender 主动卡死在文件操作上。5.1 布下陷阱注册 Cloud Files 同步根Defender 引擎MsMpEng.exe即 WinDefend 服务进程在扫描和更新时会对临时目录做目录级访问而 Windows 的云文件Cloud Files / CF框架允许任何程序把目录注册为同步根并在有进程访问时收到回调。FreezeVSS做了如下准备以 PoC 自身所在目录为同步根调用CfRegisterSyncRootProviderName填了句大实话LIHATEMICROSOFT第 1473 行创建带FILE_FLAG_DELETE_ON_CLOSE的 GUID 命名锁文件通过CfConnectSyncRoot注册CF_CALLBACK_TYPE_FETCH_PLACEHOLDERS回调第 1533 行。5.2 精准识别只冻结 Defender 进程回调函数 CfCallbackFetchPlaceHolders() 里有一处关键判断先用 GetWDPID() 打开服务控制管理器查出WinDefend服务的进程 ID再与回调上下文里的ProcessInfo-ProcessId比对第 1388 行。是 Defender 在访问→ 打印 Defender flagged.先等一个锁文件就绪事件见下再回复一个占位文件placeholder并故意挂起回调让 Defender 的文件操作阻塞在半路是其他进程→ 回复空占位数组快速放行避免误伤系统。5.3 双锁齐下批量 oplock 完成冻结在回调等待期间FreezeVSS主线程对锁文件发起FSCTL_REQUEST_BATCH_OPLOCK异步请求第 1556 行拿到ERROR_IO_PENDING后才SetEvent(hnotifylockcreated)唤醒回调。此时形成一道双重死锁Defender 的目录访问被 CF 回调卡住回调又在等 oplock 建立一旦 Defender或其更新流程触碰锁文件批量 oplock 请求会被打破。等到GetOverlappedResult返回FreezeVSS打印出标志性语句第 1570 行WD is frozen and the new VSS can be used.随后置位hvssready事件主线程就知道Defender 已被冻结新卷影快照可以安全利用了。六、技巧三EICAR 诱饵文件——如何让 Defender 乖乖创建快照光有雷达和锁还不够得让 Defender主动开始一次签名更新它会为更新创建 VSS 快照。TriggerWDForVS() 用了一个经典诱饵写 EICAR 测试文件第 1620-1665 行代码里把标准 EICAR 字符串反着存储用 rev() 函数运行时还原——既保证功能又避免静态字符串被扫描器直接命中抢占 RstrtMgr.dll 的批量 oplock第 1668-1693 行对%windir%\System32\RstrtMgr.dll独占打开并发起FSCTL_REQUEST_BATCH_OPLOCK把 oplock 当作Defender 动了的信号量再开一次 EICAR 文件第 1696-1698 行触发 Defender 检测行为oplock 随之打破PoC 确认 Defender 已上钩确认新快照等ShadowCopyFinderThread线程返回拿到新HarddiskVolumeShadowCopy路径启动 FreezeVSS用WaitForMultipleObjects同时等待线程退出和hvssready事件确保冻结成功才继续第 1732-1740 行。至此诱饵 → 快照 → 冻结三件套闭环完成。七、配套能力私有 RPC 接口与离线注册表VSS 技巧只是前半程冻结 Defender 后的后半程依赖两个配套模块 私有 RPC 接口windefend.idl 是逆向出的 Defender 内部 RPC 接口定义windefend_h.h 等由 MIDL 生成。PoC 在 CallWD() 中用RpcStringBindingComposeW以ncalrpc方式绑定接口IMpService77BDAF73调用Proc42_ServerMpUpdateEngineSignature把签名目录替换为\??\GLOBALROOT\Sessions\N\BaseNamedObjects\{GUID}\WDUpdateDirectory这类命名对象符号链接由 NtCreateSymbolicLinkObject 创建从而让 Defender 加载攻击者投放的新签名。 离线注册表工具offreg.h offreg.lib 提供离线注册表访问能力配合 FunnyApp.cpp 中的 SAM 解析逻辑bootkey 重排、AES-CBC 解密 LSA 密钥、SAM 库偏移解析可在获取 VSS 快照后直接对离线系统画像做密码哈希提取——这也是 BlueHammer 选择 VSS 路线的终极目的卷影副本 一个不受内存保护机制约束的离线系统镜像。八、安全启示普通用户与运维该如何防范虽然 BlueHammer 只是研究 PoCREADME 中作者还承认 There are few bugs in the PoC但它暴露的弱点值得警惕✅监控 VSS 异常活动定期用vssadmin list shadows或审计日志关注非系统组件创建的卷影副本✅保护 WinDefend 服务与关键 DLL利用 WDAC/AppLocker 限制对RstrtMgr.dll等系统文件的独占打开与 oplock 抢占✅审计云文件同步根注册CfRegisterSyncRoot是合法 API但恶意进程注册同步根并长期阻塞回调属于异常行为可通过进程回调检测✅及时更新 Defender 与系统本漏洞依赖Defender 会响应更新并创建快照这一行为链路官方修复后链路即失效。九、相关文件索引模块路径PoC 主程序全部核心逻辑FunnyApp.cppVSS 快照监听线程FunnyApp.cpp#L1169-L1350FreezeVSS 冻结线程FunnyApp.cpp#L1463-L1598TriggerWDForVS 总调度FunnyApp.cpp#L1601-L1762Defender RPC 接口定义windefend.idlRPC 客户端/服务器存根windefend_c.c · windefend_s.c离线注册表库offreg.h · offreg.lib项目说明README.md工程与资源FunnyApp.sln · FunnyApp.rc · resource.h⚠️ 本文为安全研究科普所有技术细节仅供理解 Windows Defender 防御机制与 VSS 卷影复制原理之用请勿将相关技术用于非法用途。【免费下载链接】BlueHammerRepository hosting the bluehammer vulnerability项目地址: https://gitcode.com/gh_mirrors/bl/BlueHammer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

VS Code 设置 JSON 文件怎么改到 TaoToken:统一 Key 与 API 通道配置大纲

VS Code 设置 JSON 文件怎么改到 TaoToken:统一 Key 与 API 通道配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 2:46:58 阅读更多 →
AI工具WorkBuddy篇:8_换电脑后,数据如何迁移

AI工具WorkBuddy篇:8_换电脑后,数据如何迁移

本教程面向完全没接触过文件迁移的新手,手把手教你把旧电脑上的 WorkBuddy(含全部记忆、人格、技能、项目数据)完整搬到新电脑,做到“换电脑不换魂”。请按顺序从头读到尾,再动手操作。一句话总览迁移 复制 3 个隐藏文…

2026/10/10 1:27:37 阅读更多 →
context-mode:一套统一上下文管理方案的设计与实战

context-mode:一套统一上下文管理方案的设计与实战

1. 项目概述与核心痛点1.1 什么是context-mode第一次接触“context-mode”这个词,是在一个多智能体协作项目的调试现场。当时系统里几十个服务互相调用,每个服务都带着一堆散落的参数、状态标记、会话快照,日志乱成一锅粥。你根本分不清某个字…

2026/10/10 2:46:12 阅读更多 →

最新新闻

红外目标检测数据集:格式转换与YOLO训练避坑指南

红外目标检测数据集:格式转换与YOLO训练避坑指南

简介:YOLO红外多目标检测数据集面向目标检测学习与算法验证场景,提供1000张真实场景高质量红外图片,经LabelImg标注后附带voc(xml)、coco(json)、yolo(txt)三种格式标签,分别存放于独立文件夹,并确保标注框质量较高&am…

2026/10/10 23:28:02 阅读更多 →
监控场景员工玩手机检测:YOLOv9训练实战与避坑指南

监控场景员工玩手机检测:YOLOv9训练实战与避坑指南

简介:面向监控场景下的员工玩手机识别需求,这份基于YOLOv9的深度学习目标检测项目提供了完整可运行的Python源码、训练好的模型权重与指标曲线,适合计算机相关专业学生用于毕业设计、课程实践或企业安防场景的算法验证。压缩包内共192个文件&…

2026/10/10 23:28:02 阅读更多 →
凯恩斯革命与宏观经济学:从IS-LM模型到Python代码模拟

凯恩斯革命与宏观经济学:从IS-LM模型到Python代码模拟

简介:这份PPT课件聚焦凯恩斯革命与宏观经济学的诞生,面向经济学专业学生、考研备考者及对经济思想史感兴趣的读者,帮助梳理凯恩斯理论体系的来龙去脉与核心命题。资源包内含1个ppt文件,约165KB,以幻灯片形式呈现&#…

2026/10/10 23:28:01 阅读更多 →
初学者必知:llm.txt是干什么用的?TaoToken 统一 Key 接入 AI 编程助手实操

初学者必知:llm.txt是干什么用的?TaoToken 统一 Key 接入 AI 编程助手实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 23:27:01 阅读更多 →
子序列动态规划四题详解:LCS、不相交的线、最大子序和、判断子序列

子序列动态规划四题详解:LCS、不相交的线、最大子序和、判断子序列

刷动态规划刷到第四十三天,说实话到这个阶段很多人已经有点晕了。前面的背包问题刚消化完,今天又上来四道子序列相关的题——1143.最长公共子序列、1035.不相交的线、53.最大子序和、392.判断子序列。如果你正在跟代码随想录的算法营,或者自己…

2026/10/10 23:27:01 阅读更多 →
拆解OpenClaw on Android的平台插件架构:L1/L2/L3三层依赖设计完全解读(开发者向)

拆解OpenClaw on Android的平台插件架构:L1/L2/L3三层依赖设计完全解读(开发者向)

移动开发AI 应用CLI开发工具 【免费下载链接】openclaw-android Run OpenClaw on Android with a single command — no proot, no Linux 项目地址: https://gitcode.com/gh_mirrors/op/openclaw-android 点击查看 免费下载 OpenClaw on Android 是一个在 Android&…

2026/10/10 23:27:01 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →