以下是几个重要的MFT属性介绍
(1)MFT文件记录属性头结构
表6 文件属性头说明
偏移 长度 描述
0X00 4 固定值“FILE”
0X04 2 更新序列号偏移,与操作系统有关
0X06 2 固定列表大小
0X08 8 日志文件序列号
0X10 2 序列号(用于记录文件被反复使用的次数)
0X12 2 硬连接数,跟目录中的项目关联,非常重要的参数
0X14 2 第一个属性的偏移
0X16 2 标志字节①
0X18 4 文件记录实时大小(字节)②
0X1C 4 文件记录分配大小(字节)
0C20 8 基础记录 (0: itself)
0X28 2 下一个自由ID号
0X2A 2 边界
0X2C 4 WINDOWS XP中使用,本MFT记录号
0X30 4 MFT的使用标记③
(2)文件名属性
表7 文件名属性说明
偏移 大小 值 属性类型 描述
0X00 4 0X 30
0X04 4 0X68 总长度
0X08 1 0X00 非常驻标志(0X00:常驻属性;0X01:非常驻属性)
0X09 1 0X00 属性名的名称长度
0X0A 2 0X18 属性名的名称偏移
0X0C 2 0X00 标志
0X0E 2 0X03 标识
0X10 4 0X4A 属性长度(L)
0X14 2 0X18 属性内容起始偏移
0X16 1 0X01 索引标志
0X17 1 0X00 填充
0X18 8 0500000000000500 父目录记录号(前6个字节)+序列号(与目录相关)
0X20 8 e0e3e1a066e9c301 文件创建时间
0X28 8 同上 文件修改时间
0X30 8 同上 最后一次 MFT更新的时间
0X38 8 同上 最后一次访问时间
0X40 8 0040000000000000 文件分配大小
0X48 8 0040000000000000 文件实际大小
0X50 4 06000000 标志,如目录、压缩、隐藏等
0X54 4 00000000 用于EAS和重解析点
0X58 1 04 以字符计的文件名长度⑤,每字节占用字节数由下一字节命名空间确定,一个字节
长度,所以文件名最大为255字节长(L)
0X59 1 03 文件名命名空间,见表8
0X60 2L 24004d004600 以Unicode方式标识的文件名
表8 常见命名空间
标志 意义 描述
0 POSIX 这是最大的命名空间。它大小写敏感,并允许使用除NULL(0)和左斜框(/)以外
的所有Unicode字符作为文件名,文件名最大长度为255个字符。有一些字符,
如冒号(:),在NTFS下有效,但WINDOWS不让使用。
1 WIN32 WIN32和POSIX命名空间的一个子集,不区分大小写,可以使用除“*/:<>?/|”
以外的所有Unicode字符。另外,文件不能以句点和空格结束。
2 DOS DOS是WIN32命名空间的一个子集,要求比空格的ASC||码要大,且不能使用* + / ,
: ; < > ? / | 等字符,另外其格式是1-8个字符的文件名,然后是句点分隔,然后是1-3
个字符的扩展名。
3 Win32 & DOS 该命名空间要求文件名对Win32和DOS命名空间都有效,这样,文件名就可以在文
件记录中只保存一个文件名
(3)数据流属性
表9 数据流属性说明
偏移 大小 值 意义
0X00 4 0X80 属性类型(0X80,数据流属性)
0X04 4 0X48 属性长度(包括本头部的总大小)
0X08 1 0X01 非常驻标志(0X00:常驻属性;0X01:非常驻属性)
0X09 1 0X00 名称长度,$AttrDef中定义,所以名称长度为0
0X0A 2 0X0040 名称偏移
0X0C 2 0X00标志, 0X0001为压缩标志,0X4000为加密标志,0X8000为系数文件标志
0X0E 2 0X0001 标识
0X10 8 0X00 其实VCN
0X18 8 0X1FF1 结束VCN
0X20 2 0X40 数据运行的偏移
0X22 2 0X00 压缩引擎
0X24 4 0X00 填充
0X28 8 0X1FF2000 为属性值分配大小(按分配的簇的字节数计算)
0X30 8 0X1FF1C00 属性值实际大小
0X38 8 0X1FF1C00 属性压缩大小
0X40 … 2148062431… 数据运行④
(4) 位图属性
位图属性在NTFS的属性中是一个很灵活的属性。当它位于不同的文件下有不同的含义。比如:例子中的MFT是文件$MFT自身的记录。这里的位图属性有特殊的含义。它在此处为非常驻属性,标志MFT文件的使用情况(类似$BITMAP的作用)。例子中31 01 40 4b 0f为数据运行,起始簇为0x0f4b40,占用一个簇。该簇中以每一位代表一个MFT记录的使用情况(占用为1,未使用为0)。实际操作中,可以根据文件的ID号查找与该文件的MFT对应的位。具体方法为,首先在$MFT的记录中读取0xB0属性运行,根据运行找到$MFT:bitmap位置。对于文件file,根据MFT记录的顺序记录文件file位于第几个,假设记录号为ID,ID/8=A, ID%8=B。表明该文件的MFT记录的位图位从$MFT:bitmap的首字节偏移A个字节,之后的第B个位。
2.3关于文件属性的说明
现在说明几点在数据恢复中很重要的几个属性标志(已用颜色标出)
① 第一处标志代表的是文件的状态:
1表示普通文件;
0表示文件被删除;
3表示普通目录;
2表示目录被删除。
当然,对于系统的文件可能有除此以外的标志符。
② 第二处为文件记录的实际大小。虽然每一个MFT记录都分配1K的空间,但实际使用的字节数并相同。因此,这里记录的是实际使用的字节数。
③ 第三处为MFT的使用标记,它在MFT记录的两个扇区中与每扇区的最末4个字节相对应,如若不然,系统将示此记录为非法记录。
④ 第四处为数据运行,是在数据流属性为非常驻的状况下索引到数据流的关键。其具体计算方式如下:
这是例子中的80H属性,其中蓝色部分为该80H属性(数据属性)的运行:
80 00 00 00 68 00 00 00 01 04 40 00 00 00 08 00
00 00 00 00 00 00 00 00 4b 00 00 00 00 00 00 00
48 00 00 00 00 00 00 00 00 c0 04 00 00 00 00 00
88 bc 04 00 00 00 00 00 88 bc 04 00 00 00 00 00
24 00 53 00 44 00 53 00 21 48 06 24 31 01 f3 aa
02 31 01 0d 7a fd 31 01 f3 38 02 31 01 c3 4b 05
00 a2 6b 81 d0 50 3d e1
该运行分为
子运行1:21 48 06 24
子运行2:31 01 f3 aa 02
子运行3:31 01 0d 7a fd
子运行4:31 01 f3 38 02
子运行5:31 01 c3 4b 05
以子运行1:“21 48 06 24”为例,“2”表示后面4个字节中后面2个字节是子运行的起始簇号,即子运行的起始簇号为“24 06”,“1”表示前面的1个字节表示子运行的大小,即该子运行的大小为“48”。所以该文件数据实际是从起始扇区号为0x2406的地方,占用0x48个簇。接下来是子运行2,运行2的簇号的起始位置为0x2406 + 0x02aaf3 = 0x2cef9。占用0x01个簇。接下来是子运行3,按照前面的理论,子运行3的起始簇号应该是0x2cef9+0xfd0a0d。但是0xfd0a0d的第一个字节为1(fd的首字节),证明此数为负数,所以不能简单的做加法,而应该取该数的补数来计算。既,0xfd7a0d取反加1,得到0x2F5F2,所以运行3的起始扇区号为0x2cef9 - 0x285f3 = 0x4096。占用0x01个簇。依此类推直到子运行之后为“00”时结束。
在程序中,一个Run代表整个运行,每一个子运行以链表的方式链接在一起。
⑤ 此处由一个字节标识文件名的长度,故NTFS磁盘格式下的文件名长度不能超过256个字节,但是文件名的存储格式是以Unicode的形式存储的,所以,文件名在磁盘中占用的真实字节数是该值的两倍。
除此以外,关于数据属性的还有几个方面需要说明
(1) 关于文件名属性。在MFT中,可能有多个文件名属性。这可能是因为文件的命名空间不同。例如:一个DOS命名空间下是8+3的短文件名格式。而WINDOWS下是Unicode的命名空间。