1. 主页
  2. 文档
  3. exFAT文件系统结构
  4. exFAT目录结构
  5. 文件目录项

文件目录项

表17 文件目录项结构

字段名 偏移(字节) 大小(字节) 描述/值
项类型 0 1 0x85

类型区域 偏移 大小
是否使用 7 1 1
类别 6 1 0
是否重要 5 1 0
代码 0 5 00101
辅助数目 1 1
设置校验 2 2
文件属性 4 2
属性 偏移 大小 记录
保留2 6 10
文档 5 1 0x20
目录 4 1 0x10
保留1 3 1
系统 2 1 0x04
隐藏 1 1 0x02
只读 0 1 0x01
保留1 6 2
创建时间 8 4 DOS时间戳格式
最后修改 12 4 DOS时间戳格式
最后访问 16 4 DOS时间戳格式
创建10ms 20 1 0-199个10ms
最后修改10ms 21 1 0-199个10ms
创建时区 22 1 与UTC相差N个15分钟的时区偏移1
最后修改时区 23 1 与UTC相差N个15分钟的时区偏移1
最后访问时区 24 1 与UTC相差N个15分钟的时区偏移1
保留2 25 7
注意:如果“是否使用”位是0(0x05)这可能为删除的文件,也可能是文件被重命名了,或者文件名扩展目录项的数目改变了。

1这些区域在exFAT规范中没有定义,这是分析的结果。

文件目录项用来定义文件或子目录,它不是独立存在的。文件项集可能包含3-19个32位的目录项。文件项集以文件目录项(0x85)开始,其后是扩展目录流项(0xC0)然后是1-17个文件名扩展目录项(0xC1)。这些项是按顺序排列的,中间没有别的数据。

“辅助数目”是一个字节的无符号整数,它的取值是2-18,指示主目录项后面使用了多少个项。例如0x85项中的这个值,它不包括0x85项本身。它的值最大可以到255,但在现在的环境中最大值是18。它不包括0x85项本身的原因是这一项是主项,其他项是辅助项,这个值是文件项集中辅助项的数目。

    “文件属性”与FAT16和FAT32中的属性类似,有着相同的定义。exFAT的文件属性中没有卷标属性值,因为0x81项定义了exFAT的卷标,长文件名和8.3文件名也不存在于exFAT中,这些属性值也没有定义。

图14  由Server 2008创建的文件项集

图14显示了一个文件项集序列包括0x85,0xC0和0xC1项。这三个时间戳为:创建时间(0x3B7D6466)最后修改时间(0x35328573)最后访问时间(0x3B7D6466),这些项是由Server 2008 SP1创建的。现在看一下这个文件的属性如图15所示。

图15 显示由支持exFAT的Server 2008创建的文件属性

访问时间,只有日期记录没有时间记录。左边的图是在Server 2008中的文件属性,右图是XP SP3中的文件属性,结果是一样的。虽然exFAT的存储了最后访问时间,但是没有显示时间值的命令。图16显示了在NTFS中的文件属性,所有的时间和日期值都有显示,因此在exFAT中,访问时间有记录,但是不会显示出来。

图16 XP中NTFS文件系统中的文件属性

exFAT规范定义3个一字节的无符号整型数(这个值是代表每个10ms)的附加区域,来作为每个时间的附加值,这个值的范围(十进制)从0到199。这三个区域只使用了两个。DOS时间值的秒记录的是双数秒(两秒),这个值用来补足丢失的那个秒。

现在看一下使用Windows Explorer显示的文件日期和时间,如图17

图17 Windows Explorer显示的日期和时间

访问日期显示了时间值,而属性窗口没有显示。

在Windows XP系统中做黑箱测试中发现MAC时间与我们的预料不同。在exFAT中打开一个文件并显示里面的数据,或把文件复制到另一个磁盘并不影响源文件的最后访问时间戳。在NTFS文件系统中进行同样的操作每次都会改变最后访问时间。我们期望的是访问一个文件时,例如读取这个文件的数据区的一个簇时,最后访问时间可能变化。但是观察得知,它根本不更新。如果修改了这个文件,最后访问时间才会变化。在这个过程中,修改的10ms增量中设置成0。类似的分析试验了几个文件,这说明exFAT存在着一个很大的问题,尤其是基于时间戳的调查,可能会当作文件已经更新了。

让我们看一下理论上的情况:假设法证人员调查一个有关儿童色情的案件,已经从犯罪嫌疑人的电脑上下载了一些图片(就是JPG格式的JPEG文件),对调查提出要求:这些图片没有被人看过。法证人员为了达到这个目的会综合考虑不同的系统元文件。然而,如果文件系统在任何程序打开JPG文件时不更新最后访问时间戳,如何确定这个要求是成功达到了呢?

在图14中,看时间戳的后面两个字节(偏移143476),它们是0xC3,0x00分别代表创建时间的修改时间的10ms附加值。修改时间的10ms附加值是0。

图18 Winhex显示的Windows XP SP3创建的0x85项

图18显示了由Windows XP SP3在另一个USB磁盘上创建的一个文件,由Winhex列出的0x85项。观察显示的两个情况,第一个是创建时间和最后修改时间的10ms附加值0x45和0x00,第二个是位于保留区域三个字节的“0xEC”值,这个值是没有定义的。在XP系统支持的exFAT文件系统中创建的文件在0x85项的偏移22处三个字节的值都是0xECECEC。在不同的XP系统中创建的这个值可能不同。例如在5章中的解释,这三个字节是时区偏移,是UTC时间戳的一部分(这个例子0xEC代表GMT-5,也正是在这个研究中使用的时区)。

法证人员的一个重要工作是检查在系统中一个记录事件发生日志的创建时间。需要理解时间戳元文件在文件系统中的存储格式并且开发的工具也能显示这样的数据(MAC时间分析)。写入时间戳位置的数据取决于采用何种操作系统。甚至在同一个操作系统上不同的工具显示的元文件也是不同的。

校验值是所有项集的计算结果,项集的大小(项大小)为“辅助数目”+1,最大是“项大小”*32个字节,最小是3个项目96个字节。

表18   C程序计算的文件项目集的校验代码

UINT16 EntrySetChecksum(const unsigned char octsts[],long NumberOfBytes)
{
UINT16 Checksum = 0;
long Index;
for (Index = 0; Index < NumberOfBytes; Index++)
{
if (Index == 2 || Index == 3)
{
continue;
}
Checksum = ((Checksum <<15) | (Checksum>> 1)) + (UINT16) octsts[Index];
}
return Checksum;
}

表18显示了计算文件项集校验值的C程序代码,校验值本身位于偏移2和3,因此在计算中不包括这个区域。

如果没有使用0x85项,这个项目的最高位设置成关,这个目录项显示为0x05,这说明这个文件已经删除了。同一个文件项集的所有剩下的项的高位全都设置成关,结果是0xC0变成了0x40,所有的0xC1变成了0x41。尽管这些位设置成了0,但是文件项集的校验值不会重新计算,也不会变化。

下面4个图片显示文件目录项的变化:

图19 Winhex显示的文件删除前的0x85项

图20 文件删除前0x85项的格式转换结果

图21 Winhex显示的文件删除后的0x85项

图22 文件删除后0x85项的格式转换结果

这个例子取自XP系统,因此项目中出现3个时区偏移(0xEC),这个值在其它XP系统中可能不同。

文件删除前文件目录项有一个0x85类型的项,文件项目集的校验值是0x91EF,程序重新计算的校验值也是0x91EF。

现在删除这个文件,不再使用这项,它的高位设置成0,因此文件项类型成了0x05。文件目录项中的校验值仍是0x91EF,但是文件项集的校验代码重新计算后为0x89EF。这两个校验不匹配,原因是在文件项目设置中的所有项目的“是否使用”位设置成关了。在删除的过程中没有重新计算校验值。

当一个文件项目集的“是否使用”设置成0后,不都是意味着文件被删除了。当重命名一个文件时,文件名长度改变时,需要文件名扩展项和以前的不一样时,这时会新建一个文件项目集。可能要确定一些系统仍然在使用的文件是否能够重命名成功,因为旧文件名的目录项仍然原封不动的存在于目录中。它也可能出现在文件系统偶尔往目录中一个未用的空间添加一个新目录项。

实验显示,当重命名一个文件有时不需要改变文件项集的大小。把一个文件名少于15个字符的文件重命名成文件名更少时,只是修改原文件项集,根本不会产生一个新的文件项集和删除现在的文件项集。

图20中的文件项集包括5个项目,每个文件项目的大小为32字节,文件项集的大小为160字节。文件项集本身是5个项目,但是文件项集的“辅助数目”是4,因为这个数目不包括文件目录项本身,因此文件项集数目应该是辅助数目加1。

我们要如何帮助您?

评论 抢沙发

评论前必须登录!