文件系统取证分析(第11章:NTFS概念)
/*
Skogkatt 开始翻译于2015-01-24,仅作为学习研究之用,谢绝转载。
译注:我翻译这本书的这三章虽然蓄谋已久,但并不是一个计划好的工作。因为之前和vczh、mili、darkfall曾讨论过everything这个软件,也曾想过要写一个开源的everything,于是就出来一个坑。everything这个软件其实是从底层直接parse了NTFS MFT,然后parse类每一个FILE entry,从里面拆出来了每一个文件的信息,这个操作速度远快于Win32 FindFirstFile和FindNextFile。道理虽然简单,但是实现起来代码不会很少。
又,我从2013年起因工作原因开始研究和分析NTFS文件系统,并且看过数遍《File System Forensic Analysis》这本书的NTFS三章。这三章的信息已经略显过时并且存在一些技术细节谬误,翻译出来仅仅是给英语不好的朋友们做为拓展知识所用。如果想认真研究NTFS实现细节,建议看看泄露的Windows源代码、开源的NTFS3g库并使用磁盘编辑工具实际看看磁盘的布局。
另外,NTFS3g目前公开的代码坑很多,在高负荷压力测试中会出现严重的数据丢失损坏甚至文件系统挂掉,,不建议作为一个严谨的NTFS实现来使用。
再,翻译进行中,不定期更新。
*/
新技术文件系统(NTFS)是由Microsoft设计的并作为Micrtosoft Windows NT、Windows 2000、 Windows XP和Windows Server的缺省文件系统。在写作本书的时候,Microsoft已经停止了Windows 98 和 ME 产品线的销售,Windows XP家庭版成为新的消费系统。FAT仍将会存在于移动和小型存储设备之中,但NTFS将会成为Windows研究中最为常见的文件系统。NTFS是比FAT更为复杂的文件系统,这是由于它具有众多的功能特性和伸缩性。由于NTFS的复杂性,我们需要三章来讨论它。本章将会讨论NTFS的核心概念,覆盖到我们模型中的五个分类。第12章,“NTFS分析”讨论了NTFS分析和使用五分类模型来展示我们从哪里获取证据。第13章,“NTFS数据结构”介绍了NTFS相关的数据结构。
简介
NTFS被设计为具有可靠性、安全性和支持大型存储设备。伸缩性是由通用的数据结构所封装的具有特定内容的数据来实现的。这之所以是一个可伸缩的设计,是由于内部的数据结构可以根据文件系统新增的需求而变化,二外部的封装可以保持不变。一个通用封装的例子是,NTFS文件系统的每一个字节都被分配到文件之中。我们稍后在本章中将会讨论NTFS文件的概念。
NTFS是一个复杂的文件系统,不幸的是,并没有一个从Microsoft公开的规范来描述其在磁盘上的布局。文件系统高层组件的描述已经公开了,但是底层细节信息仍然非常匮乏。幸运的是,其他组织已经公开了他们所认为的磁盘布局结构信息,这些信息包含在本书之中,并且我们将会用它们来手工深入到磁盘之中。尽管这听起来很有难度,然而,我们仍然无法确保这里所描述的数据结构和磁盘上面的完全一致。
NTFS是大量Windows系统的标准,并且在免费的Unix发行版中也越发常见(译注:Linux)。没有官方规范和单一支配应用来创建文件系统两个因素合并在一起,使得难以区分应用指定的功能和文件系统通用的功能。例如,存在着Microsoft所不使用的初始化文件系统的方法,然而这种方法的结果是否被认为是一个“合法的NTFS”文件系统还难以定论。Microsoft在每一次新发布Windows系统的时候都会更改文件系统内部,我将会在这里指出这些改变。
一切都是文件
为了了解NTFS的设计,一个最重要的概念是一切重要的数据都被分配为文件。这包括其他文件系统通常隐藏起来的基本的文件系统管理数据。事实上,包含管理数据的文件可以存在放卷的任何位置,和普通文件一样。也就是说,NTFS文件系统并不像其他文件系统那样有一个特定的布局。整个文件系统被认为是一个数据区,每一个扇区都可以分配给一个文件。唯一不变的布局是每一个卷开始的几个扇区,包含有引导扇区和引导代码。
MFT概念
主文件表(MFT)是NTFS的心脏,这是因为它包含所有文件和目录的信息。每一个文件和目录在表中至少有一个入口(Entry),entry本身很简单。每一个entry都是1KB大,但是只有前42字节有定义的用途。剩余的空间用来存储属性(Attributes),属性是很小的具有特性用途的数据结构。例如,有一个属性用来保存文件的名称,另一个属性用来保存文件的内容。图11.1一个MFT entry的基本布局,包括头信息和三个属性。
图11.1 一个MFT entry,有一个小头部,剩余的部分用来存储不同的属性。这个entry有三个属性。
Microsoft称每一个表中的entry为一个文件记录,但是我想把每一个entry简称为MFT entry,这样更便于记忆。每一个entry都基于其在表中的位置有一个地址,从0开始。所有的entry的大小都是1024字节,不过实际的大小定义在引导扇区中。
如NTFS中的所有一切一样,MFT也是一个文件。导致这个令人困惑的是MFT有一个它自己的entry。表中第一个entry名字叫做$MFT,它描述了MFT在磁盘上的位置。实际上,这是唯一描述MFT在磁盘上的位置的地方;也就是说,你需要处理这个entry才能得知MFT的布局和大小。MFT的起始位置在引导扇区给出,引导扇区始终是文件系统的第一个扇区。我们可以在图11.2看到这个,如何使用引导扇区找到第一个MFT entry,它显示出MFT被分为碎片,有32到34和56到58的簇组成。类似于FAT,NTFS使用簇,簇由连续的扇区组成。
图11.2 引导扇区和$MFT的关系,用来确定MFT的布局。
在Microsoft实现的NTFS中,MFT开始保持尽量小的尺寸,当需要更多的entry时扩展MFT。理论上说,操作系统可以在创建文件系统的时候创建固定数量的entry,但是Microsoft实现的动态特性允许很方便的通过分卷扩展文件系统容量。Microsoft在MFT entry创建后不删除它们。
MFT entry内容
每一个MFT entry的大小定义在引导扇区之中,但是Microsoft使用的所有版本都使用1024字节大小。数据结构开始的42个字节包含12个域,剩余的982字节没有特定的结构,可以用属性填充。你可以把一个MFT entry想想为一个用来存放你物品的大盒子。盒子外面是你的基本信息,比如你的名字和地址。基本信息等价于MFT entry的固定域。盒子里面一开始是空的,但是它可以用来保存任何比它小的容器。这非常像MFT entry没有内部结构并且它含有一些包含特定信息的属性。
每一个MFT entry的第一个域是签名,一个标准的entry是ASCII字符串“FILE”,如果一个entry里面发现了错误,它可能含有字符串“BAAD”,还有一个标志域用来标识这个entry是否使用、这个entry是否是一个目录。一个MFT entry的分配状态也可以通过$MFT文件的$BITMAP属性来检查,详见第13章。
如果一个文件无法把它的所有属性放进一个entry,它可以使用多个entry。当这种情况发生的时候买第一个entry被称为基本文件记录,或者基本MFT entry,后续的每一个entry都在它的固定域保存有基本entry的地址。
第13章显示了一个MFT entry的数据结构,并分解了我们的示例文件系统镜像。
MFT entry 地址
每一个MFT entry都使用一个48位的顺序地址,第一个entry地址是0。MFT最大地址随着MFT的增长而增大,它的值由$MFT的大小除以每一个entry的大小来计算。Microsoft称这个顺序地址为文件编号(File number)。
每一个MFT entry还有一个16位的顺序号,当entry分配的时候这个顺序号增长。例如,想象一下MFT entry313的顺序号是1.entry313的文件删除了,然后这个entry被分配给一个新的文件。当这个entry被重新分配,它得到了一个新的顺序号2。MFT entry和顺序号组合起来,顺序号放在高16位,组成了一个64位的文件参考地址,见图11.3。
图11.3 MFT地址和顺序号组成一个文件参考地址的例子。
NTFS使用文件参考地址来引用MFT entry,这是由于顺序号使得检查文件系统是否处于一种损坏状态变得容易。例如,如果系统在一个文件的数据结构被分配的时候崩溃了,顺序号可以用来判断一个数据结构是否包含MFT entry,是因为上一个文件使用了它还是它是新文件的一部分。我们也可以用它来恢复被删除的内容。例如,如果我们有一个未分配的数据结构,里面有文件参考号,我们可以判断这个数据结构被使用以来MFT entry是否被重新分配过。顺序号在信息挖掘中有很大的作用,但是在本章为简单起见,我将主要讨论文件号,或者MFT entry地址。
文件系统元文件
由于卷的每一个字节都被分配给了文件,必定有文件保存了文件系统的管理数据。Microsoft称它们为元文件,但这样会导致困惑,因为我们还要讨论文件元数据。我将会称这些特殊文件为文件系统元文件。
Microsoft保留了前16个MFT entry作为文件系统元文件(Microsoft文档声称只保留了前16个entry,但是实际上第一个用户文件或者目录从entry24开始。entry17到23作为缓冲entry防止预留的不够用导致溢出),这些保留并且未用的entry被置为分配状态并且只有基本的信息。每个文件系统元文件都列在根目录,尽管通常情况下普通用户是看不到它们的。每一个文件系统元文件的名字都由“$”开始,并且第一个字母大写。我们将在第12章讨论每一个文件系统元文件,但是我们现在把它们列在表11.1作为一个方便参考。
表11.1标准的NTFS文件系统元文件
Entry | File Name | Description |
0 | $MFT | MFT自身的entry |
1 | $MFTMirr | 含有MFT起始的几个entry的备份 |
2 | $LogFile | 含有元数据事务的日志 |
3 | $Volume | 含有卷信息 |
4 | $AttrDef | 含有属性信息 |
5 | . | 文件系统根目录 |
6 | $Bitmap | 文件系统簇的分配状态 |
7 | $Boot | 引导扇区和文件系统引导代码 |
8 | $BadClus | 含有坏扇区的簇 |
9 | $Secure | 还有安全和访问控制相关信息 |
10 | $Upcase | 含有每一个Unicode字符的大写形式 |
11 | $Extend | 含有可选扩展文件的目录。 |
MFT入口属性概念
// TODO
其他属性概念
// TODO
索引
// TODO
分析工具
// TODO
总结
NTFS之中的每一个关键元素都被关联给了一个文件或者一个索引。本章之中,我们讨论了NTFS的核心概念:MFT入口、属性和索引。通过使用这些基本的概念,我们现在就可以检查特定的属性和分析第12章中的分类项目。
参考资料
略,请看原著
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。