Extenedi/DeleteShadowCopies
GitHub: Extenedi/DeleteShadowCopies
一个通过直接调用Windows VSS API删除系统影副本的C++概念验证工具,用于研究勒索软件如何阻止受害者恢复数据。
Stars: 0 | Forks: 0
# VSS 影副本删除工具
## ⚠️ 严重警告:勒索软件组件
这是一个**影副本删除工具**,常用于勒索软件攻击以阻止受害者恢复数据。此代码**绝不应该**在隔离的研究环境之外执行,此处记录仅用于防御性安全目的。
## 概述
一个 C++ 程序,用于删除 Windows 影副本(Volume Shadow Service 快照),且无需使用 `wmic` 或 `vssadmin` 等传统的命令行工具。该工具直接与 Windows VSS API 交互,以枚举和删除系统上的所有影副本。
**作者**: ORCA (@ORCx41)
**日期**: 10/31/2022
**测试环境**: Windows 10 v10.0.19044 x64
## 技术细节
## 演示(创建):

## 演示(删除):  ### 核心功能 该程序执行以下操作: 1. **COM 初始化** - 初始化组件对象模型 (COM) - 使用 `RPC_C_AUTHN_LEVEL_PKT_PRIVACY` 设置安全上下文 - 启用动态伪装以增强安全性 2. **VSS 组件创建** - 创建 `IVssBackupComponents` 接口 - 初始化 VSS 备份基础设施 - 将上下文设置为 `VSS_CTX_ALL`(所有影副本类型) 3. **影副本枚举** - 查询所有现有的影副本 - 使用 `IVssEnumObject` 遍历快照 - 检索元数据:SnapshotID, OriginalVolume, ProviderID 4. **影副本删除** - 单独删除每个快照 - 使用带有 `VSS_OBJECT_SNAPSHOT` 标志的 `DeleteSnapshots()` - 持续运行直到不存在更多影副本 ### 使用的主要 Windows API | API 函数 | 用途 | |--------------|---------| | `CoInitialize()` | 初始化 COM 库 | | `CoInitializeSecurity()` | 设置 COM 安全设置 | | `CreateVssBackupComponents()` | 创建 VSS 备份接口 | | `InitializeForBackup()` | 准备 VSS 进行备份操作 | | `SetContext()` | 定义 VSS 上下文范围 | | `SetBackupState()` | 配置备份状态 | | `Query()` | 枚举影副本 | | `DeleteSnapshots()` | 通过 ID 删除影副本 | | `VssFreeSnapshotPropertiesInternal()` | 释放快照属性内存 | ### 依赖项 ``` #include // VSS core definitions
#include // VSS writer interface
#include // VSS backup interface
#include // VSS management
#include // ATL COM smart pointers
#pragma comment (lib, "VssApi.lib")
#pragma comment (lib, "ResUtils.lib")
```
## 工作原理
### 执行流程
```
1. Initialize COM & Security
↓
2. Create VSS Backup Components
↓
3. Set VSS Context (VSS_CTX_ALL)
↓
4. Set Backup State (Full Backup)
↓
5. Query All Shadow Copies (GUID_NULL filter)
↓
6. Enumerate Shadow Copies (IVssEnumObject)
↓
7. For Each Shadow Copy:
│
├─ Display: SnapshotID, VolumeName, ProviderID
│
└─ Call DeleteSnapshots(SnapshotID)
↓
8. Repeat Until No More Copies
↓
9. Exit
```
### 输出示例
```
[i] Deleting shadow copy: {a1b2c3d4-e5f6-7890-abcd-ef1234567890} on C:\ from the provider: {b5946137-7b9f-4925-af80-51abd60b20d5}
[+] No More Shadow Copies Were Detected
```
### 错误处理
| 错误代码 | 消息 | 含义 |
|------------|---------|---------|
| `E_ACCESSDENIED` | Please Run As Admin | 权限不足 |
| `VSS_E_OBJECT_NOT_FOUND` | No Shadow Copies | 不存在快照 |
| Generic HRESULT | Failed: 0x[code] | VSS API 错误 |
## 为什么这被用于勒索软件
### 恢复阻止策略
勒索软件操作者删除影副本是为了:
1. **消除还原点**
- 受害者无法使用系统还原
- 以前的文件版本被销毁
- Windows 恢复选项变得无用
2. **增加勒索压力**
- 没有免费的恢复方法可用
- 受害者必须付款或永久丢失数据
- 备份删除对勒索软件的成功至关重要
3. **逃避检测**(为什么这个工具很重要)
- 传统方法(`vssadmin delete shadows /all`)会触发警报
- `wmic shadowcopy delete` 受到严格监控
- 直接使用 API 可以绕过命令行检测
### 使用此技术的勒索软件家族
- **Ryuk** - 在加密前删除 VSS
- **Conti** - 复杂的 VSS 删除例程
- **Maze** - 多阶段影副本移除
- **REvil/Sodinokibi** - VSS 删除 + 引导程序攻击
- **LockBit** - 快速 VSS 移除以提高速度
- **BlackCat/ALPHV** - 基于 Rust 并使用 VSS API
## 检测与预防
### 行为指标
**进程行为:**
- 异常的 COM 对象创建 (`IVssBackupComponents`)
- 来自非备份软件的 VSS API 调用
- 枚举所有影副本
- 大量影副本删除
**所需权限:**
- 必须以管理员权限运行
- 需要 `SeBackupPrivilege` 和 `SeRestorePrivilege`
- 如果未提升权限则触发 UAC
### 检测规则
**Sysmon 事件 ID:**
- Event 1 (Process Creation) - 监控 VSS API 加载
- Event 7 (Image Loaded) - 可疑进程加载了 `VssApi.dll`, `ResUtils.dll`
- Event 19/20/21 (WMI Events) - 与 VSS 相关的 WMI 活动
**Windows 事件日志:**
- Event ID 8222 (VSS) - 影副本删除
- Event ID 536 (VSS) - 影副本卷服务错误
**EDR 遥测:**
```
Process: unknown.exe
Loaded Modules: VssApi.dll, VSSAPI.DLL
API Calls:
- IVssBackupComponents::Query()
- IVssBackupComponents::DeleteSnapshots()
Network: None (local operation)
```
### YARA 规则示例
```
rule Ransomware_VSS_Deletion_API {
meta:
description = "Detects VSS shadow copy deletion via API"
author = "Security Researcher"
date = "2025-01-01"
strings:
$api1 = "CreateVssBackupComponents" ascii
$api2 = "DeleteSnapshots" ascii
$api3 = "IVssBackupComponents" ascii
$api4 = "VSS_CTX_ALL" ascii
$lib1 = "VssApi.lib" ascii
$lib2 = "ResUtils.lib" ascii
condition:
uint16(0) == 0x5A4D and
3 of ($api*) and 1 of ($lib*)
}
```
### 缓解策略
**1. 权限限制**
- 限制管理员帐户的使用
- 日常工作使用标准用户帐户
- 实施即时 (JIT) 管理员访问
**2. 应用程序白名单**
- 仅允许授权的备份软件访问 VSS API
- 阻止未知可执行文件加载 VssApi.dll
**3. VSS 保护**
- 通过组策略启用 VSS 访问限制
- 监控 VSS 服务 完整性
- 创建系统外备份 (3-2-1 规则)
**4. 端点检测**
- 部署具有勒索软件检测模块的 EDR
- 对非标准进程使用 VSS API 发出警报
- 监控 COM 对象创建模式
**5. 网络分段**
- 隔离具有离线备份的关键系统
- 防止横向移动到备份服务器
## MITRE ATT&CK 映射
| 技术 ID | 技术名称 | 描述 |
|-------------|----------------|-------------|
| **T1490** | **Inhibit System Recovery** | 主要技术 - 删除影副本 |
| T1106 | Native API | 直接使用 Windows VSS API |
| T1059 | Command and Scripting Interpreter | 命令行工具的替代方案 |
| T1486 | Data Encrypted for Impact | 通常与加密配对使用 |
| T1529 | System Shutdown/Reboot | 通常在 VSS 删除之后进行 |
**战术**: Impact
**子技术**: T1490 (Inhibit System Recovery)
## 代码分析
### 关键代码部分
**1. 管理员检查:**
```
hr = CreateVssBackupComponents(&m_pVssObject);
if (hr == E_ACCESSDENIED){
printf("[!] Please Run As Admin To Delete Shadow Copies \n");
return -1;
}
```
**2. 影副本查询:**
```
hr = m_pVssObject->Query(GUID_NULL, VSS_OBJECT_NONE, VSS_OBJECT_SNAPSHOT, &pIEnumSnapshots);
if (hr == VSS_E_OBJECT_NOT_FOUND) {
printf("[i] There Is No Shadow Copies On This Machine \n");
return -1;
}
```
**3. 删除循环:**
```
while (TRUE){
ULONG ulFetched;
hr = pIEnumSnapshots->Next(1, &Prop, &ulFetched);
if (ulFetched == 0) {
printf("[+] No More Shadow Copies Were Detected \n");
break;
}
hr = m_pVssObject->DeleteSnapshots(Snap.m_SnapshotId,
VSS_OBJECT_SNAPSHOT,
FALSE,
&lSnapshots,
&idNonDeletedSnapshotID);
}
```
### 比较:传统方法 vs API 方法
| 方法 | 命令 | 检测难度 |
|--------|---------|---------------------|
| **传统** | `vssadmin delete shadows /all /quiet` | 容易 (命令行监控) |
| **传统** | `wmic shadowcopy delete` | 容易 (WMI 事件日志) |
| **本工具** | 直接 VSS API 调用 | 困难 (需要 API 监控) |
## 取证痕迹
### 遗留的痕迹
**1. Windows 事件日志:**
- **Event 8222** (VSS Provider) - "Shadow copy deleted"
- **Event 536** (VSS) - "Volume Shadow Copy Service error"
**2. 注册表键:**
- `HKLM\SYSTEM\CurrentControlSet\Services\VSS\Diag` - VSS 诊断信息
- 可能包含上次影副本操作的时间戳
**3. VSS 日志:**
- `C:\Windows\Logs\Vss\` - VSS 错误日志
- 检查带有时间戳的删除事件
**4. 预取文件:**
- `C:\Windows\Prefetch\[PROGRAM_NAME].pf`
- 显示程序执行历史
**5. 内存痕迹:**
- 进程内存中的 COM 对象创建
- VSS API 调用堆栈跟踪
- 已加载的 DLL 痕迹 (VssApi.dll)
## 事件响应
### 如果检测到此工具
**立即行动:**
1. **隔离系统**
- 立即断开网络连接
- 如果加密正在进行则关闭电源
- 不要重启(保留内存证据)
2. **捕获易失性数据**
- 内存转储 (使用 WinPMEM, DumpIt, Magnet RAM)
- 正在运行的进程 (`tasklist /v`)
- 网络连接 (`netstat -ano`)
3. **检查影副本状态**
```
vssadmin list shadows
wmic shadowcopy list brief
```
4. **保留日志**
- 导出 VSS 事件日志 (Event ID 8222, 536)
- 如果已部署,保存 Sysmon 日志
- 备份 Security 和 System 日志
5. **评估损害**
- 检查加密是否已开始
- 在独立系统上验证备份完整性
- 识别入口点 (钓鱼邮件、RDP、漏洞)
### 恢复选项
**如果影副本仍然存在:**
```
# 列出可用的 shadow copies
vssadmin list shadows
# 从 shadow copy 还原
mklink /d C:\ShadowCopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy[X]\
# 从 shadow copy 复制文件
robocopy C:\ShadowCopy\Users\[User]\Documents C:\Recovery\Documents /E
```
**如果所有副本已被删除:**
- 从系统外备份恢复(磁带、云、物理隔离)
- 在加密之前使用文件恢复工具 (recuva, photorec)
- 联系专业数据恢复服务
- **不要支付赎金**(不保证解密)
### ⚖️ 法律警告
- **未经授权的使用是非法的**: 未经授权使用此工具违反计算机欺诈法律(CFAA, Computer Misuse Act 等)。
## 与其他工具的比较
| 工具 | 方法 | 隐蔽性 | 速度 | 复杂度 |
|------|--------|---------|-------|-----------|
| **vssadmin** | Command-line | 低 | 快 | 简单 |
| **wmic** | WMI | 低 | 快 | 简单 |
| **PowerShell** | Scripting | 中 | 快 | 中等 |
| **本工具** | Native API | 高 | 快 | 高 |
| **Direct Driver** | Kernel-mode | 极高 | 极快 | 极高 |
## 技术规格
**编译要求:**
- Visual Studio 2015+ 并支持 C++
- Windows SDK 10.0+
- ATL (Active Template Library)
- VSS SDK 组件
**运行时要求:**
- Windows Vista+ (VSS 2.0+)
- 管理员权限
- Volume Shadow Copy Service 正在运行
**二进制特征:**
- 语言: C++
- 架构: x86/x64
- 导入: VssApi.dll, ResUtils.dll, Ole32.dll
- 子系统: Console
- 典型大小: 50-100 KB (编译后)
## 演示(删除):  ### 核心功能 该程序执行以下操作: 1. **COM 初始化** - 初始化组件对象模型 (COM) - 使用 `RPC_C_AUTHN_LEVEL_PKT_PRIVACY` 设置安全上下文 - 启用动态伪装以增强安全性 2. **VSS 组件创建** - 创建 `IVssBackupComponents` 接口 - 初始化 VSS 备份基础设施 - 将上下文设置为 `VSS_CTX_ALL`(所有影副本类型) 3. **影副本枚举** - 查询所有现有的影副本 - 使用 `IVssEnumObject` 遍历快照 - 检索元数据:SnapshotID, OriginalVolume, ProviderID 4. **影副本删除** - 单独删除每个快照 - 使用带有 `VSS_OBJECT_SNAPSHOT` 标志的 `DeleteSnapshots()` - 持续运行直到不存在更多影副本 ### 使用的主要 Windows API | API 函数 | 用途 | |--------------|---------| | `CoInitialize()` | 初始化 COM 库 | | `CoInitializeSecurity()` | 设置 COM 安全设置 | | `CreateVssBackupComponents()` | 创建 VSS 备份接口 | | `InitializeForBackup()` | 准备 VSS 进行备份操作 | | `SetContext()` | 定义 VSS 上下文范围 | | `SetBackupState()` | 配置备份状态 | | `Query()` | 枚举影副本 | | `DeleteSnapshots()` | 通过 ID 删除影副本 | | `VssFreeSnapshotPropertiesInternal()` | 释放快照属性内存 | ### 依赖项 ``` #include
标签:C++, COM接口操作, Windows VSS API, 中高交互蜜罐, 勒索软件, 备份恢复, 影子副本删除, 恶意软件开发, 情报收集, 数据擦除, 数据破坏, 漏洞研究, 私有化部署, 网络安全, 防御规避, 隐私保护