UI はローカライズ済みです。スキルの紹介と説明文書は選択した言語へ AI が自動翻訳し、コード・コマンド・パス・専門用語は原文のままです。原作者の文書が優先されます。
スキルを探す
生産性・共同作業 · SKILL.md

analyzing-mft-for-deleted-file-recovery

analyzing-mft-for-deleted-file-recovery

通过检查 MFT 记录条目、$LogFile、$UsnJrnl 和 MFT 松弛空间,使用 MFTECmd、analyzeMFT 和 X-Ways Forensics 分析 NTFS 主文件表($MFT)以恢复已删除文件的元数据和内容。

Independent GitHub snapshot · Automated classification · Original documentation governs

スキルの説明

GitHub

name: analyzing-mft-for-deleted-file-recovery description: 通过检查 MFT 记录条目、$LogFile、$UsnJrnl 和 MFT 松弛空间,使用 MFTECmd、analyzeMFT 和 X-Ways Forensics 分析 NTFS 主文件表($MFT)以恢复已删除文件的元数据和内容。 domain: cybersecurity subdomain: digital-forensics tags: [mft, ntfs, deleted-files, file-recovery, mftecmd, usn-journal, logfile, mft-slack-space, file-system-forensics, dfir] version: "1.0" author: mahipal license: Apache-2.0

分析 MFT 用于已删除文件恢复

概述

NTFS 主文件表($MFT)是 NTFS 卷上每个文件和目录的中央元数据存储库。每个文件至少由一条 1024 字节的 MFT 记录表示,其中包含 $STANDARD_INFORMATION(时间戳、权限)、$FILE_NAME(名称、父目录、时间戳)和 $DATA(文件内容或簇运行指针)等属性。文件被删除时,其 MFT 记录被标记为非活动状态(InUse 标志清除),但元数据保留到被新文件的条目覆盖为止。这种持久性使 MFT 分析成为恢复已删除文件证据、重建文件系统时间线以及检测反取证活动(如时间戳篡改)的主要技术。

前置条件

  • 取证磁盘镜像(E01、raw/dd、VMDK 或 VHDX 格式)
  • MFTECmd(Eric Zimmerman 工具)或 analyzeMFT(基于 Python)
  • FTK Imager、Arsenal Image Mounter 或类似工具用于挂载镜像
  • Timeline Explorer 或 Excel 用于 CSV 分析
  • Python 3.8+ 用于自定义分析脚本
  • 了解 NTFS 文件系统内部结构

MFT 结构和记录布局

MFT 记录头部

每条 MFT 记录以签名"FILE"(0x46494C45)开头,包含:

偏移量大小字段
0x004 字节签名("FILE")
0x042 字节更新序列偏移量
0x062 字节更新序列大小
0x088 字节$LogFile 序列号
0x102 字节序列号
0x122 字节硬链接计数
0x142 字节第一个属性偏移量
0x162 字节标志(0x01 = 使用中,0x02 = 目录)
0x184 字节MFT 记录已用大小
0x1C4 字节MFT 记录已分配大小
0x208 字节基础文件记录引用
0x282 字节下一个属性 ID

关键 MFT 属性

类型 ID名称描述
0x10$STANDARD_INFORMATION时间戳、标志、所有者 ID、安全 ID
0x30$FILE_NAME文件名、父目录 MFT 引用、时间戳
0x40$OBJECT_ID文件的唯一 GUID
0x50$SECURITY_DESCRIPTORACL 权限
0x60$VOLUME_NAME卷标(仅卷元数据文件)
0x80$DATA文件内容(小于 700 字节时为驻留型)或簇运行列表
0x90$INDEX_ROOT目录的 B 树索引根
0xA0$INDEX_ALLOCATION大型目录的 B 树索引条目
0xB0$BITMAP索引或 MFT 的分配位图

已删除文件恢复技术

技术 1:使用 MFTECmd 进行 MFT 记录分析

# 使用 KAPE 或 FTK Imager 从取证镜像提取 $MFT
# 使用 MFTECmd 解析 $MFT
MFTECmd.exe -f "C:\Evidence\$MFT" --csv C:\Output --csvf mft_full.csv

# 在 Timeline Explorer 中过滤已删除文件(InUse = FALSE)
# 查找 InUse 列为 False 的条目

在 CSV 输出中识别已删除文件:

  • InUse = False 表示已删除或已重新分配的记录
  • ParentPath 显示删除前的原始文件位置
  • FileSize 显示原始大小(可能仍可恢复)
  • $STANDARD_INFORMATION 和 $FILE_NAME 属性中的时间戳持续存在

技术 2:USN 日志($UsnJrnl:$J)分析

USN 日志记录 NTFS 卷上文件的所有更改,包括创建、删除、重命名和数据修改事件。

# 使用 MFTECmd 解析 USN 日志
MFTECmd.exe -f "C:\Evidence\$J" --csv C:\Output --csvf usn_journal.csv

# 删除证据的关键 USN 原因代码:
# USN_REASON_FILE_DELETE     = 0x00000200
# USN_REASON_CLOSE           = 0x80000000
# USN_REASON_RENAME_OLD_NAME = 0x00001000
# USN_REASON_RENAME_NEW_NAME = 0x00002000

技术 3:$LogFile 事务分析

$LogFile 存储 NTFS 事务记录,即使 USN 日志已循环,也能揭示文件操作。

# 使用 LogFileParser 解析 $LogFile
LogFileParser.exe -l "C:\Evidence\$LogFile" -o C:\Output

# 查找表示文件删除的 REDO 和 UNDO 操作:
# - DeallocateFileRecordSegment(释放文件记录段)
# - DeleteAttribute(删除属性)
# - UpdateResidentValue(清除 InUse 标志)

技术 4:MFT 松弛空间分析

MFT 松弛空间存在于 MFT 记录已用部分末尾和已分配 1024 字节末尾之间。该区域可能包含之前文件记录的残留数据。

import struct

def parse_mft_slack(mft_path: str, output_path: str):
    """提取并分析 MFT 松弛空间中已删除文件的残留数据。"""
    with open(mft_path, "rb") as f:
        record_size = 1024
        record_num = 0
        slack_findings = []

        while True:
            record = f.read(record_size)
            if len(record) < record_size:
                break

            # 验证 FILE 签名
            if record[:4] != b"FILE":
                record_num += 1
                continue

            # 从偏移量 0x18 获取已用大小
            used_size = struct.unpack("<I", record[0x18:0x1C])[0]

            if used_size < record_size:
                slack = record[used_size:]
                # 检查松弛空间是否包含可读字符串或属性头部
                if any(c > 0x20 and c < 0x7F for c in slack[:50]):
                    slack_findings.append({
                        "record": record_num,
                        "used_size": used_size,
                        "slack_size": record_size - used_size,
                        "slack_preview": slack[:100].hex()
                    })

            record_num += 1

    return slack_findings

与支持性痕迹的关联

与 $Recycle.Bin 交叉引用

# 使用 RBCmd 解析回收站
RBCmd.exe -d "C:\Evidence\$Recycle.Bin" --csv C:\Output --csvf recycle_bin.csv

# 关联: $I 文件包含原始路径和删除时间戳
# 将 $R 文件中的 MFT 条目号匹配回原始 MFT 记录

与卷影副本交叉引用

# 列出卷影副本
vssadmin list shadows

# 挂载卷影副本并从每个副本提取 $MFT
# 比较不同卷影副本中的 MFT 记录以追踪文件随时间的变化

取证价值

  • 已删除文件元数据恢复:原始文件名、路径、大小和时间戳
  • 时间线重建:文件创建、修改、访问和删除事件
  • 时间戳篡改检测:比较 $SI 和 $FN 时间戳
  • 数据雕刻引导:MFT 簇运行指向磁盘上的文件内容
  • 反取证检测:识别被擦除或被篡改的 MFT 记录

参考资料

保存したスキル