30H属性的结构

30H类型属性,即$FILE_NAME属性,该属性用于存储文件名,它总是常驻属性。它最少68字节,最大578字节,可容纳最大255个Unicode字符的文件名长度。其结构描述见表4-41。

表4-41 30H属性描述表

字节偏移 字段长度(字节) 含义
 标准属性头(已分析过)
0x00 8  父目录的文件参考号(即父目录的基本文件记录号,分为两个部分,前6个字节48位为父目录的文件记录号,后2个字节为序列号)
0x08 8  文件创建时间
0x10 8  文件修改时间
0x18 8  MFT修改时间
0x20 8  文件最后访问时间
0x28 8  文件分配大小
0x30 8  文件实际大小
0x38 4  标志,如目录、压缩、隐藏等
0x3C 4  EAs(扩展属性)和Reparse(重解析点)使用
0x40 1  文件名长度(字符数L)
0x41 1  文件名命名空间(Filename Namespace)
0x42 2L  Unicode文件名

NTFS通过为一个文件创建多个文件名属性的方式实现了POSIX(可移植操作系统接口)式的硬连接,每个文件名属性都有它自己的详细资料和父目录参考号。当一个硬连接文件删除时,就从文件记录中删除掉这个文件名,当最后一个连接也删除时,文件就真正的删除了。

如果文件有EAs(扩展属性),则EA域将包含有缓存所需要的空间。

如果文件是个重解析点,则会在重解析点域给出它的类型,这在后文谈重解析点属性时有详细说明。

30H属性的文件标志含义

30H属性中偏移38H的标志含义见表4-42。

表4-42 30H属性文件标志字节含义

标志 二进制位 含义
0x0001 0000 0000 0000 0001 只读
0x0002 0000 0000 0000 0010 隐含
0x0004 0000 0000 0000 0100 系统
0x0020 0000 0000 0010 0000 存档
0x0040 0000 0000 0100 0000 设备
0x0080 0000 0000 1000 0000 常规
0x0100 0000 0001 0000 0000 临时
0x0200 0000 0010 0000 0000 稀疏文件
0x0400 0000 0100 0000 0000 重解析点
0x0800 0000 1000 0000 0000 压缩
0x1000 0001 0000 0000 0000 脱机
0x2000 0010 0000 0000 0000 未编入索引
0x4000 0100 0000 0000 0000 加密
0x10000000 0001 0000 0000 0000
(前2个字节)
目录(从MFT文件记录中复制的相应的位)
0x20000000 0010 0000 0000 0000
(前2个字节)
索引视图(从MFT文件记录中复制的相应的位)

30H属性的文件名命名空间

在DOS年代,旧的FAT文件系统在文件名上有很多约束,比如文件名长度必须是文件名不超过8个字符,扩展名不超过3个字符,而且许多字符在文件名中是不允许,比如不能用空格等。FAT32则允许了较多的字符作为文件名和较长的文件名,而NTFS几乎没有限制。

在文件名中都有一个标志指出这个文件的文件名属于哪一种名字空间。为了兼容旧的文件系统,NTFS系统给文件名分配了一个短的DOS兼容文件名给每个具有非DOS兼容文件名的文件。

可能的文件命名空间有:

(1)该字节的值为“00”:POSIX(Portable Operating System Interface,可移植操作系统接口)

Windows 20000、Windows XP完全支持可移植操作系统接口POSIX 1003.1。在文件系统方面,NTFS实现了POSIX 1003.1的所有要求,例如:

①大小写敏感:在POSIX环境下,文件名是大小写敏感的,因而在POSIX命名空间ABC.TXT、Abc.txt、abc.txt并不是同一个文件。

②通过许可:当判定一个用户是否可以访问一个文件或者目录时,需要考虑路径上的所有目录的安全许可。

③文件改变时间:提供文件最后被访问的时间标记(这在10属性中定义)。

④硬连接:在不同的目录下不同文件名的两个文件指向相同的数据时,两个文件发生硬连接。

POSIX是最大的文件命名空间,它允许除了空字符(00H)和向前的斜线“/”以外所有的Unicode字符集,最大的文件名长度为255,但是有一些特例,例如冒号“:”,在NTFS文件系统中是有效,但在Windows操作系统是不允许的。

(2)该字节的值为“01”:Win32

Win32是POSIX命名空间的一个子集,它使用除“"*/:<>?\|”之外的所有Unicode字符集,但注意名字不能够以“.”或空格结束。

(3)该字节的值为“02”:DOS

DOS是Win32命名空间的一个子集,只允许用大写字符,不能用空格,而且排除“"*+,/:;<=>?\”等字符做文件名。注意其文件名一定是这样的:1~8个字符的文件名,然后是一个点“.”,然后是0~3个字符的扩展名。

(4)该字节的值为“03”:Win32 & DOS

这种文件命名空间表示Win32和DOS文件名都是一样的(也就是说该文件只有一个符合DOS命名方式的文件名),因此这种文件名只有这一个文件名属性。

将POSIX或Win32文件名转换成DOS兼容文件名必须遵从以下步骤:

①除去所有的Unicode字符;

②除去除最后一个外的所有的“.”,且这最后一个“.”还不能是首字符;

③将所有的小写字符转换为大写;

④除去被禁止的字符;

⑤如果此时主文件名长度(即“.”之前的长度)大于8个字符,则除去第6个字符后的所有字符,其在其后补上两个字符“~1”;

⑥在“.”之后如果字符长度大于3,则只保留前3个字符;

⑦当这个文件名已经存在时,则把“~1”变成“~2”,如果依然存在则继续递增字符“~”后的数字。

30H属性一般都是常驻的,这里依然以$MFT文件自身的文件记录中的30H属性为例,其结构如图4-417所示。

30H($FILE_NAME)属性分析-数据恢复迷

图4-417 30H属性的例子

该属性的参数模板如图4-418所示。

30H($FILE_NAME)属性分析-数据恢复迷

图4-418 30H属性的参数模板