csdn 发表于 2008-5-17 01:32:26

硬盘NTFS分区MFT文件记录结构

MFT文件记录结构分析
主文件表MFT的文件记录由记录头和属性列表组成,由“FF FF FF FF”结束,一般大小为1K,或一个簇大小,记录头包括以下一些域:
偏移 长度(字节) 属性
0X00 4 标志,一定是“FILE”
0X04 2 更新序列US的偏移
0X06 2 更新序列号USN的大小与数组,包括第一个字节
0X08 8 日志文件序列号LSN
0X10 2 序列号(SN)
0X12 2 硬连接数
0X14 2 第一个属性的偏移地址
0X16 2 标志,1表示记录正在使用,2表示该记录为目录
0X18 4 记录头和属性的总长度,即文件记录的实际长度,
0X1C 4 总共分配给记录的长度
0X20 8 基本文件记录中的文件索引号
0X28 2 下一属性ID
0X2A 2 XP中使用,边界
0X2C 4 XP中使用,本文件记录号

每次记录被修改都将导致日志文件序列号$LogFile Sequence Number(LSN)发生变化。
序列号Sequence Number(SN)用于记录主文件表记录被重复使用的次数。
硬连接数Hard Link Count记录硬连接的数目,只出现在基本文件记录中。
文件记录的实际长度是文件记录在磁盘上实际占用的字节空间。
基本文件记录中的文件索引号,对于基本文件记录,其值为0,如果不为0,则是一个主文件表的文件索引号,指向所属的基本文件记录中的文件记录号,在基本文件记录中包含有扩展文件记录的信息,存储在“属性列表ATTRIBUTE_LIST”属性中。

属性列表是可变长度区,以“FF FF FF FF”结束,对于1K长度的MFT记录,属性列表的起始偏移为0x30。

索引记录结构分析

每一个索引记录都是由一个标准的索引头和一些包含索引键和索引数据的块组成的。索引记录的大小在引导记录 $Boot中定义,一般总是4KB。
标准索引头的结构如下:

偏移 大小 说明
0X00 4 总是“INDX”
0X04 2 更新序号偏移
0X06 2 更新序列号USN的大小与排列,包括第一个字节
0X08 8 日志文件序列号LSN
0X10 8 该索引缓冲在索引分配中的索引VCN
0X18 4 索引入口的偏移(相对于0X18)
0X1C 4 索引入口的大小(相对于0X18)
0X20 4 索引入口的分配大小(相对于0X18)
0X24 1 非页级节点为1(有子索引)
0X25 3 总是0
0X28 2 更新序列号
0X2A 2S-2 更新序列排列

常用索引列表

名称 索引 说明
$I30 文件名 目录使用
$SDH 安全描述 $SECURE
$SII 安全IDS $SECURE
$O 对象IDS $OBJID
$O 所有者IDS $QUOTA
$Q 配额 $QUOTA
$R 重解析点 $REPARSE

tclrz100e 发表于 2008-5-17 11:22:32

探讨一个问题!!

很多资料上在解释NTFS的文件记录中偏移0X16的解释是:1表示记录正在使用,2表示该记录为目录。但我的分析发现这个结论好像有点问题,我的理解是:1表示该记录文件(使用中);3表示该记录为目录(使用中);0表示文件已删除;2表示目录已删除。不知是否正确,大家说说看!!

qydwjzk 发表于 2008-5-17 11:33:38

回复 2# 的帖子

我也是看着有问题,老戴也是这么写的,当初我看的时候也不理解。

22168060 发表于 2008-5-20 10:22:27

看得不是很明白。

wsan 发表于 2008-5-20 21:43:13

太深奥了,看不懂

aqingxwz 发表于 2008-5-24 11:34:05

(38: 记下了

xiaoys 发表于 2008-5-25 16:17:42

顶一个,简单了。看不是太明白,如果能把NTFS文件系统的数据存取结构画出来就好了。

zcx_hqj 发表于 2008-5-28 16:40:03

受教了,保存下来慢慢消化!
谢谢LZ的无私奉献!
(49: (49: (49:

yang198224 发表于 2008-6-14 20:39:53

受教了,保存下来慢慢消化

yanglife 发表于 2008-6-29 22:23:31

支持tclrz100e说法.顶!
页: [1] 2 3 4 5
查看完整版本: 硬盘NTFS分区MFT文件记录结构