USN 日志用序号定序
NTFS 卷的 USN 变更日志为每一次文件系统变更分配一个单调递增的序号(USN),并记录文件名、父目录引用号、变更原因与时间戳。时间戳精度有限,同一秒内发生的多条操作靠时间分不出先后,而序号是严格递增的,这让「先创建后改名」这类顺序判断成为可能。
记录存在哪里
日志以 $J 数据流的形式保存在卷的 $Extend\$UsnJrnl 中,容量有限,长期运行的主机早期记录可能已被新记录覆盖。因此可用范围要以实际导出结果为准,报告里要写明导出的时间点与记录起止序号。
基本信息
| 适用平台 | Windows(NTFS 卷),Vista 以后的系统默认启用记录 |
|---|---|
| 数据流 | $Extend\$UsnJrnl 中的 $J 数据流 |
| 关键字段 | USN 序号、文件引用号、父目录引用号、Reason、时间戳 |
| 提取命令 | fsutil usn readjournal(另有管理员权限要求) |
| 解析工具 | MFTECmd 可直接输出 CSV 并按 Reason 归类 |
典型使用场景
- 判断某文件是新建还是改名而来:序号相邻的 FILE_CREATE 与 RENAME 组合可还原
- 区分同秒操作:时间戳只到秒时,用序号排出真实先后
- 定位数据外带前的打包动作:DATA_EXTEND 与 FILE_CREATE 集中出现在某时段
- 确认删除行为:FILE_DELETE 记录与 $MFT 中的 inode 状态相互印证
- 核对时间线:把 USN 序号作为辅助键并入主机时间线
导出与解析
导出与解析
# 原始导出(文本量大,先落地再筛选)
fsutil usn readjournal C: csv > C:\out\usn-c.csv
# 用 MFTECmd 解析 $J 数据流,输出 CSV 便于排序筛选
MFTECmd.exe -f 'C:\case\$Extend\$UsnJrnl_$J' --csv C:\out\usn --csvf usn.csv
# 在结果里按序号排序,观察同一秒内的先后
Import-Csv C:\out\usn\usn.csv | Sort-Object UpdateSequenceNumber |
Select-Object -First 20常见 Reason 含义
| Reason | 含义 | 分析用法 |
|---|---|---|
| FILE_CREATE | 创建了文件或目录 | 投递阶段的最早痕迹之一 |
| DATA_EXTEND | 文件数据被追加 | 常用于识别写入与外传前打包 |
| DATA_OVERWRITE | 覆盖写入 | 与压缩或加密写入相关 |
| RENAME_NEW_NAME | 文件被改名 | 配合旧名记录还原改名链 |
| FILE_DELETE | 文件被删除 | 痕迹清理行为的直接证据 |
USN 日志只记录变更,不记录访问;文件被打开读取不会产生记录,因此不能用它证明某个文件被读取过。
序号出现断档通常说明中间记录已被覆盖或导出过程有丢包,不能直接当作「该时段没有变更」,需要与 $MFT 和文件系统日志交叉确认。