Liuchijang/FIR
GitHub: Liuchijang/FIR
一款用于 Windows 取证与事件响应的模块化收集工具,专注于最小影响与可扩展性。
Stars: 0 | Forks: 0
# FIR — 自由事件响应
使用 Go 编写的生产级 Windows DFIR(数字取证与事件响应)工件收集工具。专为首次响应分类场景设计,重点关注最小系统影响、取证完整性和可扩展性。
## 功能
- **双 CLI 模式**:交互式菜单驱动选择或标志驱动批处理收集
- **10 个内置收集器**:内存、NTFS、注册表、事件日志、执行工件、系统活动
- **取证安全**:只读访问、SHA-256 完整性哈希、不修改工件
- **Windows 权限处理**:自动检测管理员状态,启用 SeBackupPrivilege/SeDebugPrivilege
- **锁定文件支持**:VSS 快照副本、`reg save`、`esentutl` 用于锁定文件的回退
- **并发收集**:可配置并行度以及每个收集器的超时
- **结构化输出**:带 JSON 元数据和结构化日志的有序目录树
- **可扩展架构**:通过实现单个接口即可添加收集器——无需更改核心逻辑
## 构建
```
# 构建二进制文件
go build -ldflags "-s -w" -o fir.exe .
# 或带有版本信息
go build -ldflags "-s -w -X github.com/fir/fir/internal/output.Version=1.2.0" -o fir.exe .
```
**要求**:Go 1.21+ 以及 Windows 目标平台。
## 用法
### 交互模式(默认)
```
# 以管理员身份运行以获得完全访问权限
.\fir.exe
```
这将启动一个菜单驱动界面,您可以在其中:
- 按类别浏览收集器
- 按编号、名称或类别选择
- 在收集开始前确认
### 标志模式
```
# 收集特定工件
.\fir.exe collect --artifact registry,eventlog,prefetch
# 按类别收集
.\fir.exe collect --artifact ntfs,execution
# 收集所有内容
.\fir.exe collect --artifact all
# 自定义输出目录和超时
.\fir.exe collect --artifact registry,eventlog --output C:\triage --timeout 10m
# 高并发下的详细模式
.\fir.exe collect --artifact all --output E:\evidence -v --concurrency 4
```
### 可用工件
| 名称 | 类别 | 描述 |
|---|---|---|
| `ram` | 🔴 内存 | 通过 winpmem 获取物理内存 |
| `mft` | 🟠 NTFS | 通过直接磁盘访问获取 $MFT(主文件表) |
| `usnjrnl` | 🟠 NTFS | 通过 FSCTL 获取 $UsnJrnl:$J(USN 变更日志) |
| `secure_sds` | 🟠 NTFS | 通过 VSS 获取 $Secure:$SDS(安全描述符) |
| `registry` | 🔵 注册表 | SYSTEM、SOFTWARE、SAM、SECURITY、NTUSER.DAT、UsrClass.dat |
| `eventlog` | 🟢 事件日志 | 所有 .evtx 文件,按取证优先级排序 |
| `prefetch` | 🟡 执行 | Windows Prefetch 文件(.pf) |
| `amcache` | 🟡 执行 | Amcache.hve |
| `wmi` | 🟣 系统 | WMI 仓库(OBJECTS.DATA、INDEX.BTR、MAPPING*.MAP) |
| `srum` | 🟣 系统 | SRUM 数据库(SRUDB.dat) |
**类别快捷方式**:使用 `memory`、`ntfs`、`registry`、`eventlog`、`execution`、`system` 或 `all`。
## 输出结构
```
DESKTOP-ABC123_20260416_143210/
├── memory/
│ └── memory.raw
├── ntfs/
│ ├── $MFT
│ ├── $UsnJrnl_J
│ └── $Secure_SDS
├── registry/
│ ├── SYSTEM
│ ├── SOFTWARE
│ ├── SAM
│ ├── SECURITY
│ ├── DEFAULT
│ └── users/
│ ├── JohnDoe/
│ │ ├── NTUSER.DAT
│ │ └── UsrClass.dat
│ └── Admin/
│ ├── NTUSER.DAT
│ └── UsrClass.dat
├── eventlog/
│ ├── Security.evtx
│ ├── System.evtx
│ ├── Application.evtx
│ └── ... (all .evtx files)
├── execution/
│ ├── prefetch/
│ │ ├── CHROME.EXE-ABC12345.pf
│ │ └── ...
│ └── Amcache.hve
├── system/
│ ├── wmi/
│ │ ├── OBJECTS.DATA
│ │ ├── INDEX.BTR
│ │ └── MAPPING*.MAP
│ └── SRUDB.dat
├── logs/
│ └── collector.log
└── metadata.json
```
## metadata.json
```
{
"hostname": "DESKTOP-ABC123",
"timestamp": "2026-04-16T14:32:10+07:00",
"timestamp_utc": "2026-04-16T07:32:10Z",
"os": "windows",
"architecture": "amd64",
"artifacts_collected": ["registry", "eventlog", "prefetch"],
"collector_version": "1.0.0",
"total_duration": "12.345s",
"results": [
{
"collector_name": "registry",
"category": "registry",
"files_collected": [
{"path": "SYSTEM", "sha256": "a1b2c3...", "size": 16777216}
],
"duration_seconds": 3.21,
"success": true
}
]
}
```
## CLI 输出示例
```
╔═══════════════════════════════════════╗
║ FIR — Freedom Incident Response ║
║ Windows DFIR Artifact Collector ║
║ Version 1.0.0 ║
╚═══════════════════════════════════════╝
[+] Output directory: C:\triage\DESKTOP-ABC123_20260416_143210
[+] Collectors to run: 3
[+] Collecting: registry
[✓] Done: registry (6 hives) ... (3.2s)
[+] Collecting: eventlog
[✓] Done: eventlog (12 files) ... (2.3s)
[+] Collecting: prefetch
[✓] Done: prefetch (45 files) ... (1.1s)
[+] Collection completed in 6.6s
[✓] Results: 3 succeeded, 0 failed
[+] Output: C:\triage\DESKTOP-ABC123_20260416_143210
```
## 架构
### 收集器接口
所有收集器均实现此接口:
```
type Collector interface {
Name() string
Category() string
Description() string
Collect(ctx context.Context, outputDir string) error
}
```
### 添加新收集器
1. 在合适的包中创建新文件(例如 `internal/newcategory/mycollector.go`)
2. 实现 `Collector` 接口
3. 在 `init()` 中自我注册:
```
package newcategory
import "github.com/fir/fir/internal/collector"
func init() {
collector.Register(&myCollector{})
}
type myCollector struct{}
func (c *myCollector) Name() string { return "mycollector" }
func (c *myCollector) Category() string { return "newcategory" }
func (c *myCollector) Description() string { return "Collects something useful" }
func (c *myCollector) Collect(ctx context.Context, outputDir string) error {
// Your collection logic here.
return nil
}
```
4. 在 `cmd/root.go` 中添加空白导入:
```
_ "github.com/fir/fir/internal/newcategory"
```
**无需更改核心编排逻辑。**
### 项目结构
```
├── main.go # Entry point
├── cmd/
│ ├── root.go # Root command, interactive mode, preflight
│ └── collect.go # Flag-driven collection, orchestration
├── internal/
│ ├── collector/ # Core interface + registry
│ ├── cli/ # Interactive menu
│ ├── acquisition/ # Raw disk + VSS helpers
│ ├── output/ # Directory management + metadata
│ ├── logging/ # Dual-output logger
│ ├── utils/ # Privileges, file copy, hashing
│ ├── memory/ # RAM collector
│ ├── ntfs/ # MFT, USN Journal, Secure SDS
│ ├── registry/ # Registry hive collector
│ ├── eventlog/ # Event log collector
│ ├── execution/ # Prefetch, Amcache
│ └── system/ # WMI, SRUM
```
## RAM 获取(winpmem)
FIR **不捆绑** winpmem,因授权许可问题。请将 `winpmem_mini_x64.exe` 放置在:
- 与 `fir.exe` 同一目录(推荐)
- 当前工作目录
- 系统 PATH
如果未找到 winpmem,RAM 收集器将优雅失败并显示明确的错误信息。
## 要求
- **操作系统**:Windows 10/11、Server 2016+
- **权限**:管理员(右键 → 以管理员身份运行)
- **Go**:1.21+(用于从源码构建)
## 许可证
本工具仅限授权取证调查和事件响应使用。
标签:ETW劫持, EVTX分析, Go 1.21, Go语言, HTTPS请求, JSON元数据, NTFS取证, SeBackupPrivilege, SecList, SeDebugPrivilege, SHA-256哈希, VSS影子复制, Windows取证, Windows平台, 事件日志取证, 交互式菜单, 内存取证, 协议分析, 取证完整性, 取证收集器, 只读取证, 可扩展架构, 响应分级, 并发收集, 并行处理, 库, 应急响应, 执行Artifact收集, 接口扩展, 数字取证, 日志审计, 日志记录, 最小系统影响, 权限提升, 标志驱动批处理, 模块化设计, 注册表取证, 生产级, 程序破解, 系统活动取证, 结构化输出, 自动化修复, 自动化脚本, 输出目录树, 锁定文件恢复