jw4n6/yscanfs
GitHub: jw4n6/yscanfs
YScanFS 是一款面向取证磁盘镜像的 YARA 扫描工具,可直接解析 E01/Raw 等镜像格式,遍历 NTFS(含 ADS)、EXT4 文件系统及 VSS 卷影快照,结合社区规则集实现高效的恶意文件检测。
Stars: 0 | Forks: 0
# YScanFS
YScanFS 以只读模式读取取证磁盘镜像,遍历其文件系统,并将 YARA 规则应用于每个文件——包括卷影副本 (VSS) 快照。
```
__ __ ____ ____ _ _ _ _____ ____
\ \ / // ___| / ___| / \ | \ | || ___|/ ___|
\ V / \___ \ | | / _ \ | \| || |_ \___ \
| | ___) || |___ / ___ \ | |\ || _| ___) |
|_| |____/ \____|/_/ \_\|_| \_||_| |____/
YARA scanner for forensic disk images | https://github.com/jw4n6/yscanfs
Loading YARA rules…
✓ Loaded 11655 rule(s) in 0.8s [cache hit]
Discovering disk images…
✓ Found 'evidence.E01' (EWF)
Scanning: evidence.E01
⠴ 83186 files • 1247/s • 1m 7s
✓ Results → 'yscanfs_20260424_143022.csv'
✓ Scan log → 'logs/yscanfs_20260424_143022.log'
─────────────────────────────────────────
• Files scanned : 83186 (1247/s)
• Rules matched : 2
• Total hits : 3
• Time elapsed : 1m 7s
─────────────────────────────────────────
┌──────────────────────────────────────────┬──────┬───────┐
│ Rule │ Hits │ Files │
╞══════════════════════════════════════════╪══════╪═══════╡
│ Windows_Trojan_CobaltStrike_7f8da98a │ 2 │ 2 │
│ SUSP_PowerShell_Encoded_Exec │ 1 │ 1 │
└──────────────────────────────────────────┴──────┴───────┘
```
## 免责声明
YScanFS 由 Anthropic 的 AI 助手 Claude 开发。开发过程是迭代式的——涵盖了多次会话中的架构决策、功能实现、错误修复和代码审查。
我提供了取证领域的专业知识、对实际磁盘镜像的真机测试、产品方向,以及关于工具功能和行为方式的所有最终决策。Claude 在整个过程中协助了 Rust 实现和代码审查。
## 支持的磁盘镜像格式
| 格式 | 扩展名 | 说明 |
|--------|------------|-------|
| EWF | `.E01`–`.E99`, `.EAA`–`.EZZ` | 单段和分段 Expert Witness Format |
| Raw / DD | `.raw`, `.dd`, `.img`, `.bin` | 扁平未压缩镜像 |
| 拆分 Raw | `.001`, `.002`… | 编号段镜像 |
## 支持的文件系统
| 文件系统 | 说明 |
|------------|-------|
| NTFS | 完全支持,包括备用数据流 (ADS) |
| EXT4 | 完全支持,包括 EXT2/EXT3;时间戳显示为 epoch (ext4-view 限制) |
## 功能
- **多格式镜像支持** — EWF、raw/DD、拆分 raw
- **多文件系统支持** — NTFS (包括 ADS) 和 EXT4/EXT2/EXT3
- **VSS 快照扫描** — 枚举并扫描 NTFS 卷上的所有卷影副本快照
- **YARA-X 引擎** — 快速、现代的 YARA 实现,支持跨平台兼容
- **YARA Forge 集成** — 一键同步精选的社区规则 (~11k+ 条规则)
- **Elastic Security 规则** — 可选同步 Elastic Security YARA 规则 (~1k 条规则,Elastic License 2.0)
- **规则编译缓存** — 编译后的规则缓存到磁盘;重复运行加载时间不到 1 秒
- **并行扫描** — YARA 匹配在所有可用的 CPU 核心上运行 (最多 8 个 worker)
- **递归目录扫描** — `-d` 遍历所有支持镜像格式的子目录
- **哈希允许列表** — 通过 SHA-256 跳过已知安全文件 (例如 NSRL 哈希集)
- **规则过滤** — `--include-rule` 和 `--exclude-rule` 支持 glob 模式匹配
- **去重模式** — `--unique-files` 将每个规则下重复的路径合并为一行
- **CSV 和 JSON 输出** — 结构化结果,可直接用于 SIEM、Excel 或脚本管道
- **PE 元数据扩充** — 输出中包含 PE 编译时间戳、导入的 DLL 和 PDB 路径
- **规则来源跟踪** — CSV/JSON 可识别每次匹配是来自 YARA Forge、Elastic Security 还是自定义规则
- **跨规则集去重** — 在加载时对跨规则集的重复规则名称进行去重
- **SHA-256 哈希** — 为每个匹配的文件生成指纹
- **文件类型检测** — 通过 magic 字节识别并辅以扩展名回退机制;能正确区分 `.dll` 和 `.exe`
- **安静模式** — 除结果路径外禁止所有输出,适用于脚本和自动化
- **自动日志记录** — 每次运行都会将扫描日志写入 `logs/` 目录
- **调试模式** — 详细日志记录,用于排查规则兼容性问题
## 下载
请从 [Releases](https://github.com/jw4n6/yscanfs/releases) 页面下载最新版本的 YScanFS。
提供以下架构的二进制文件:
- Windows Intel 64 位 (`yscanfs-x.x.x.exe`)
- Linux Intel 64 位 (`yscanfs-x.x.x`)
### 从源码构建
```
git clone https://github.com/jw4n6/yscanfs
cd yscanfs
cargo build --release
```
二进制文件:`target/release/yscanfs` (Linux/macOS) 或 `target\release\yscanfs.exe` (Windows)
要在 Windows 上编译,请参考 [Rust 官方网站](https://rust-lang.github.io/rustup/installation/windows-msvc.html)获取更多说明。
## 快速开始
```
# 1. 下载 YARA Forge core、Elastic Security 规则并扫描磁盘镜像
./yscanfs -s core --accept-elastic-license -f /mnt/labs/disk-images/DC01.E01 --vss --unique-files -o /mnt/labs/DC01.csv
```
## 使用方法
```
yscanfs [OPTIONS]
```
### 选项
| 标志 | 说明 |
|------|-------------|
| `-f FILE` | 单个磁盘镜像的路径 |
| `-d DIR` | 要扫描的磁盘镜像目录 (递归) |
| `-s [RULESET]` | 同步 YARA 规则 (见下文的规则集) |
| `--accept-elastic-license` | 接受 Elastic License 2.0 并下载 Elastic Security 规则 |
| `-r DIR` | 自定义规则目录 (默认: `./rules/`) |
| `-m MB` | 要扫描的最大文件大小,单位为 MB (默认: 50) |
| `--allowlist FILE` | 跳过 SHA-256 出现在此文件中的文件 (每行一个哈希,`#` 用于注释) |
| `-o FILE` | 输出文件路径 (默认: `yscanfs_.csv`) |
| `-F FORMAT` | 输出格式: `csv` (默认) 或 `json` |
| `--unique-files` | 根据 (规则, SHA-256) 对结果去重——将每个规则下重复的路径合并 |
| `--vss` | 除了活动卷之外,还扫描 VSS 快照 |
| `--list-vss` | 列出在镜像中找到的 VSS 快照并退出 |
| `--include-rule PATTERN` | 仅运行匹配此 glob 模式的规则 (可重复使用) |
| `--exclude-rule PATTERN` | 跳过匹配此 glob 模式的规则 (可重复使用) |
| `-q` | 安静模式——成功时仅打印输出文件路径 |
| `-D` | 启用详细的调试日志 |
| `-V` | 打印版本号 |
| `-h` / `--help` | 打印帮助信息 |
### 规则集
| 值 | 来源 | 规则数 | 说明 |
|-------|--------|-------|-------|
| `core` | YARA Forge | ~5k | 高准确率,低误报率 |
| `extended` | YARA Forge | ~10k | 更广泛的覆盖范围 |
| `full` | YARA Forge | ~11k | 所有操作规则 (默认) |
| `elastic` | Elastic Security | ~1k | 需要 `--accept-elastic-license` |
```
yscanfs -s # YARA Forge full (default)
yscanfs -s core # YARA Forge core only
yscanfs -s elastic --accept-elastic-license # Elastic Security only
yscanfs -s --accept-elastic-license # YARA Forge full + Elastic
```
## 示例
```
# 扫描单个 EWF 镜像
yscanfs -f evidence.E01
# 扫描案例目录中的所有镜像(递归)
yscanfs -d /cases/2026-001/
# 扫描活动卷及所有 VSS 快照
yscanfs -f evidence.E01 --vss
# 列出 VSS 快照而不进行扫描
yscanfs -f evidence.E01 --list-vss
# 使用 NSRL hash set 跳过已知的良好系统文件
yscanfs -f evidence.E01 --allowlist nsrl.txt
# 仅运行 Cobalt Strike 和 Mimikatz 规则
yscanfs -f evidence.E01 --include-rule "*CobaltStrike*" --include-rule "*Mimikatz*"
# 跳过 PUP 和 adware 规则
yscanfs -f evidence.E01 --exclude-rule "PUP_*" --exclude-rule "*Adware*"
# 去重:每个 (rule, file hash) 对应一行,而不是每个路径对应一行
yscanfs -f evidence.E01 --unique-files
# 用于 SIEM 或脚本的 JSON 输出
yscanfs -f evidence.E01 -F json -o results.json
# 全面扫描:VSS + 去重 + JSON 输出
yscanfs -f evidence.E01 --vss --unique-files -F json
```
## 输出
### CSV 列
| 列名 | 说明 |
|--------|-------------|
| `Source Image` | 镜像文件名 |
| `Timestamp` | 文件创建/修改时间 (UTC) |
| `PE Compile Time` | 来自 COFF 头的 PE `TimeDateStamp` (如果适用) |
| `Rule Title` | 匹配的 YARA 规则名称 |
| `Rule Source` | `YARA Forge`、`Elastic Security` 或 `Custom` |
| `File Path` | 文件系统内的完整路径。NTFS ADS 条目显示为 `\path\file:StreamName`。VSS 条目以 `[VSS#N YYYY-MM-DD]` 为前缀 |
| `SHA256` | 匹配文件的 SHA-256 哈希值 |
| `Type` | 检测到的文件类型 (如 `.exe`、`.dll`、`.pdf`) |
| `PE Imports` | 逗号分隔的导入 DLL 名称 (仅限 PE 文件) |
| `PDB Path` | 来自 PE 调试目录的 PDB 调试符号路径 (如果存在) |
使用 `--unique-files` 时,`File Path` 列包含所有匹配的路径,以 `"; "` 分隔。
### JSON 输出
```
{
"scan_time": "2026-04-24T14:30:22Z",
"total_files_scanned": 83186,
"total_hits": 3,
"results": [
{
"source_image": "evidence.E01",
"timestamp": "2024-03-15T09:41:22Z",
"pe_compile_time": "2023-11-02T14:22:11Z",
"rule_title": "Windows_Trojan_CobaltStrike_7f8da98a",
"rule_source": "YARA Forge",
"file_path": "\\Windows\\Temp\\svch0st.exe",
"sha256": "a3f8c2d1e9b4f607...",
"file_type": ".exe",
"pe_imports": "kernel32.dll,ntdll.dll,wininet.dll",
"pdb_path": "C:\\Users\\operator\\cs\\implant.pdb"
}
]
}
```
### 日志文件
```
logs/
yscanfs_20260424_143022.log # warnings and errors
yscanfs_20260424_143022_debug.log # verbose output (only with -D)
```
## 规则编译缓存
在同步或更新规则后的首次运行时,YScanFS 会编译所有 `.yar` 文件并将结果保存到 `rules/.cache/`。随后的运行会直接加载编译后的二进制文件——将规则加载时间从约 20 秒减少到不足 1 秒。
只要规则发生更改,缓存就会自动失效并重新构建 (通过比较文件路径、大小和修改时间戳来检测)。
## VSS 快照扫描
```
# 查看可用的快照
yscanfs -f evidence.E01 --list-vss
[+] Partition 1 Snapshot #01 2024-11-15 03:00:21 UTC (119 GB)
[+] Partition 1 Snapshot #02 2024-11-22 03:00:18 UTC (119 GB)
[+] Partition 1 Snapshot #03 2024-11-29 03:00:31 UTC (119 GB)
3 total snapshot(s)
# 扫描所有快照
yscanfs -f evidence.E01 --vss
```
VSS 命中结果会以 `[VSS#N YYYY-MM-DD]` 作为前缀显示在结果的 `File Path` 中,从而可以立即清楚地看到命中结果来自哪个快照:
```
[VSS#1 2024-11-15] \Windows\Temp\svch0st.exe
```
VSS 扫描仅适用于 NTFS 分区。实时卷总是会先被扫描。
## YARA 规则兼容性
YScanFS 使用 [YARA-X](https://github.com/VirusTotal/yara-x) 引擎 (与 YARA 4.x 99% 兼容)。当规则文件编译失败时,YScanFS 会自动仅移除失败的规则并重试——保留规则集的其余部分。被移除的规则将记录在扫描日志中。
## YARA Forge
规则来源于 [YARA Forge](https://yarahq.github.io/)——这是一个每周更新的社区仓库聚合,包括 ReversingLabs、ESET、Malpedia、Signature Base、Volexity、GCTI、CAPE、BinaryAlert、FireEye-RT、McAfee ATR、JPCERTCC、Telekom Security、SecuInfra 及其他来源。
## Elastic Security 规则
Elastic Security YARA 规则来源于 [protections-artifacts](https://github.com/elastic/protections-artifacts) 仓库,并在 **Elastic License 2.0** 下授权。传递 `--accept-elastic-license` 即表示您接受 [https://www.elastic.co/licensing/elastic-license](https://www.elastic.co/licensing/elastic-license) 上的许可条款。
## 局限性
- **EXT4 时间戳** — `ext4-view` v0.9.3 不暴露 inode 时间戳;EXT4 文件的 `Timestamp` 列显示为 `1970-01-01T00:00:00Z`
- **VMDK** — 仅支持扁平 VMDK;稀疏/压缩的 VMDK 需要转换:`vmware-vdiskmanager -r input.vmdk -t 0 flat.vmdk`
- **VSS** — 仅限 NTFS 卷;EXT4 没有等效机制
- **动态磁盘 (LDM)** — 不支持 Windows 动态卷
- **BitLocker** — 无法扫描加密卷
- **EWF v2 (Ex01)** — 底层的 `ewf` crate 尚不支持
- **单线程 I/O** — 文件系统遍历是顺序进行的;YARA 匹配并行运行 (最多 8 个 worker)
## 许可证
MIT — 详见 [LICENSE](LICENSE)
### 依赖许可证
| Crate | 许可证 | 说明 |
|-------|---------|-------|
| vshadow | AGPL-3.0 | VSS 解析。在 GitHub 上发布的源码满足 AGPL 要求 |
| colored | MPL-2.0 | 终端颜色。文件级左版 (copyleft);不影响 yscanfs |
| yara-x | BSD-3-Clause | YARA 引擎 |
| 所有其他 crate | MIT 或 Apache-2.0 | 宽松许可证 |
## 致谢
- [YARA-X](https://github.com/VirusTotal/yara-x)
- [YARA Forge](https://yarahq.github.io/)
- [Elastic Security](https://github.com/elastic/protections-artifacts)
- [ntfs](https://github.com/ColinFinck/ntfs)
- [ewf](https://crates.io/crates/ewf)
- [ext4-view](https://github.com/nicholasbishop/ext4-view-rs)
- [vshadow](https://crates.io/crates/vshadow)
标签:CobaltStrike, E01, ETW劫持, EWF, IPv6, PowerShell, VSS, YARA, 云资产可视化, 卷影复制, 只读模式, 可视化界面, 域渗透, 库, 应急响应, 扫描器, 数字取证, 数字证据, 文件系统遍历, 日志记录, 电子数据取证, 磁盘镜像扫描, 自动化脚本, 通知系统