汪贤锋,黄茂成
NTFS文件系统以其出色的安全性和稳定性,已经成为主流的文件系统。NTFS将分区中的所有数据都以文件的方式,记录在主文件表(Main File Table,MFT)记录中,每条MFT记录都分配同样大小的空间描述文件(夹)。每个文件(夹)都对应一个或多个MFT记录,文件(夹)的所有相关信息(如文件名、数据、大小等)都作为属性登记中MFT记录中,当文件属性信息(如数据)超过MFT记录分配空间大小,则在文件记录中以非常驻属性保留该属性内容的索引,否则以常驻属性记录该属性内容。NTFS文件系统的存储组织结构如图1所示,其中MFT记录在定位文件(夹)起到了重要的桥梁作用。
NTFS以簇为基本单位分配回收存储空间[1],与FAT结构不同,NTFS卷(volume)从 0 扇区开始划分簇,每簇为 1,2,4 或8个扇区,根据分区的大小不同,最大值不超过8扇区,格式化时可以以格式化参数的形式设定。而在FAT中,由于卷管理空间的限制,只能通过增加簇大小来管理大容量硬盘,较NTFS文件系统,容易造成存储空间的浪费。NTFS簇大小,即每簇扇区数保存在BOOT扇区 (0扇区)。同时,NTFS通过Bitmap文件记录所有簇的使用情况,1个bit对应一个簇,值为1表示已经分配,为0表示未分配。FAT文件系统中的FAT表不仅记录了数据簇的使用情况,还标明了数据簇的链接关系。
NTFS使用逻辑簇号(logical cluster number,LCN)和虚拟簇号(virtual cluster number,VCN)来对簇进行定位。LCN是对卷中所有簇头到尾进行简单编号,VCN则是对属于特定文件的簇从头到尾进行编号,以便访问文件中的数据,LCN是无符号整数,而VCN则是带符号整数,VCN可以映射成LCN,由Data Runs数组完成这个映射。NTFS数据区管理不是采用链接存储,而是采用索引存储[2],文件通过自己的Data Runs数据建立索引表,一个Run就是一个连续存储块,Data Runs数组由若干Run组成,以0x00结束。
每个Run包括3部分,即头部,占用簇数,起始簇号。簇号用VCN,第一个VCN是相对于0簇。头部占用1个字节,存放占用簇数和起始簇号的字节数根据头部确定。如对于以下十六进制数据表示的Data Runs数组为:
0x12 D4 38 04 00
其中,根据头部0x12取其高4位可知1字节(值为随后D4)表示占用簇数,取低4位可知2字节(值为3804),即表示0x0438簇开始的0xD4个簇。而随后的0x00表示Data Runs数组已到数组尾部。
假设一个文件的存储分布的Data Runs数组为:
0x12 D4 38 04 31 28 D0 49 01 21 CB FF 00
则分解成4个Run:
12 D4 38 04,31 28 D0 49 01,21 23 CB FF,00
即文件存储在3个连续块:
(1)Run 1:0x0438簇开始的0xD4个簇。
(2)Run 2:0x0149D0+0x0438=0x014E08簇开始的0x28个簇。
(3)Run 3:这里 VCN为 0xFFCB=-0x35,则与前面 Run的起始簇号累计为0x014E08-0x35=0x014DD3开始的0x23个簇,这里将VCN 0xFFCB换算成LCN,它相对于前一起始地址0x014E08。
(4)Run 4:0x00,Data Runs数组到达尾部。
由上可知,文件的存储地址并不是完全依次连续增加的,而是依据数据簇的分配算法得出的。
NTFS卷上的任何事物都是文件,文件在卷上的位置都是通过主文件表(master file table,MFT)记录来确定的,其组织结构图如图1所示。MFT是一个对应的数据库,由一系列的文件记录组成,以下称其为MFT记录。卷中每一个文件都有一个MFT记录 (对于大型文件还可能有多个MFT记录与之对应),同时,MFT自身也有一个文件,也有其文件记录。MFT的每个MFT记录都有一个ID号,这个ID号从0开始,以递增的方式顺序编号。MFT自身是NTFS系统的第一个文件$MFT,其开始簇号在BOOT扇区中保存,与其他23个系统文件,他们组成系统的元文件(Metafiles),其中根目录占用ID号为5的文件记录。用户的文件MFT记录ID号从24开始分配,用户每添加一个文件ID号加1。
当某个文件被删除时,其所对应的MFT记录由系统回收,该ID号记录为空闲,同时,再次添加文件时,系统则优先给该文件记录分配ID号小的空位。
1 NTFS文件系统存储结构图Fig.1 File storage structure in NTFS file system
文件记录包含文件的所有信息,不同信息以不同属性来表示,如文件名、文件时间标记等都是属性,文件的内容也是一个属性,每个属性都有特定的特征码。属性数据较小时则存放在MFT记录中,称它们为常驻属性(resident attribute),否则MFT记录中只会保存该属性索引到外部的地址,以及索引区的大小,称此类属性为非常驻属性(non-resident attribute),通过Data Runs来保存其存储索引表。当文件被放入回收站,且清空回收站时,该文件的MFT记录在文件系统中被标明为空闲但不会被立即清除,其MFT记录仍完整的保留,可以根据其MFT记录的文件名属性(0x30属性)得到其完整文件名,返查其父目录MFT记录号,然后向上逐级返查,直至根目录,从而得到该文件包含文件路径的完整文件名。同时,该文件的MFT记录中保持文件的数据属性,通过其可以定位到文件的数据本身。而文件的路径信息作为电子证据的一个重要组成部分,能提高电子证据的可采用性及证明力。
而在FAT文件系统只在目录区保存了文件的首簇号,需要通过FAT表的簇链接关系才能确定文件的全部位置。当FAT文件系统中的文件被用户放入回收站,并清空回收站时,该文件的相应占用簇在FAT表中被置为空闲,如果该文件的占用簇不连续,则无法完整定位到该文件。同时在目录区的目录登记项的首字节被置为0xE5,而目录项的前八个字节记录的是其文件名,后三个字节为后缀名,对于文件夹,则其后缀名为空。对于长文件名,FAT文件系统通过短文件名加长文件名的方式,增加新的目录项记录长文件名,解决长文件名问题。如果文件长度为1,则其文件名丢失,而文件的目录登记项只记录文件的首簇,即文件大小,如果文件不是连续簇存放,则无法完整的恢复文件。如果两个删除文件名只有首字节不同,则其删除后的目录登记项中的文件名信息则完全相同,从而降低了电子证据的可采用性及证明力。
电子取证中,为了保持文件的原始性,不能调用操作系统的文件操作命令,同时对于清空回收站的文件擦除,在操作系统的目录视窗中已无法找到该文件。因此,应该根据文件的存储结构直接访问相应的物理扇区,其文件遍历及定位流程可以归纳为以下几个步骤。
(1)由BOOT扇区 (通常为0扇区)的BPB结构中得到$MFT的逻辑簇号(logical Cluster Number,LCN)定位到$MFT,进行下一步。
(2)定位到ID号为5的MFT记录,即根目录MFT记录,进行下一步。
(3)如果该MFT记录对应文件,则根据其常驻属性或非常驻属性读取文件内容,转至步骤(5);如果该MFT记录对应文件夹,则进行下一步。
(4)根据INDEX头部,读取头部信息,进行下一步。
(5)定位至下一个目录登记项,如果无目录登记项,则结束。
(6)读取目录登记项内容,根据其中的MFT号定位到该文件(夹)的MFT记录,转至步骤(3)。
其中,文件(夹)可能读取多个MFT记录,则联合读取MFT记录中的常驻或非常驻属性得到文件(夹)内容。
在NTFS卷中删除一个文件,系统回收其MFT记录,置该记录ID号为空闲ID号。同时,如果文件占用了数据区,则其数据区所占用簇被系统回收,在Bitmap中对应位置置0,标明对应簇为可以被系统重新分配,回收的MFT记录和数据区可供系统再分配。而FAT文件系统中的文件删除后,如果文件的存储空间非连续,恢复时很难确定文件的链接关系,而NTFS文件系统中的文件删除后,如果数据区未被覆盖,只要文件的MFT记录还存在,可以根据其常驻或非常驻属性,很容易由它确定文件数据的存储位置,提高了数据恢复的准确性。
NTFS文件系统给每个文件 (夹)分配固定大小 (一般为1024字节,此值在BOOT扇区得到)存储其对应的MFT记录。文件MFT记录了文件的所有信息或信息外部索引,每种信息都作为属性赋予不同的属性特征号。文件MFT记录由MFT记录头部及属性集组成。MFT记录头部包含了MFT标志(一定为FILE),第一个属性的偏移地址(相对于MFT头),记录的实际长度,记录分配的大小等信息。
根据MFT头部中的第一个属性的偏移地址,可以读取相应的属性,每个属性中都包含不定长属性的长度信息,从而定位和读取下一个属性。文件的MFT记录中的属性包括基本信息属性,属性列表属性,文件名属性,数据属性,索引根属性,索引分配属性,Bitmap属性等,可定义在如下的枚举类型。
在NTFS系统中,文件的MFT记录的文件名属性为0xA0属性。该属性第9个字节(前开始的8个字节为属性类型和属性总长度)为非常驻标志(0x00表示常驻属性,0x01表示非常驻属性),如果为常驻属性标志,则文件数据保存在MFT记录的数据属性(0x80属性),如果为非常驻属性,则文件数据通过MFT记录数据属性的Data Runs数组索引到到文件的数据。
由MFT记录头部开始读取其第一个属性的偏移,逐个搜索是否文件名属性,即判断属性前四个字节是否为0x30,如果不是文件名属性,则根据随后的属性长度信息,跳至下一个属性。当搜寻到文件名属性时,其中包含了文件返查所需的重要数据。文件名属性的包含了文件大小,文件属性(如隐藏,压缩等),文件创建时间,文件修改时间,父目录的MFT记录参考号等信息。而其中的父目录的MFT记录参考号,是文件返查一个重要数据。
对于计算机犯罪中的电子证据,大多罪犯有相当一部分采用的是清空回收站的方式删除。在NTFS中,当文件被放入回收站并清空回收站时,如果未作其他的操作,此时系统所作的操作是将此文件的MFT号置为空闲,同时将文件所占数据簇标志为空闲簇,该MFT记录及空闲数据簇可被系统重分配。而该文件的MFT记录及数据簇集中的内容并未被擦除,这也是文件恢复和文件返查的可行性依据。
当搜寻到擦除文件的MFT记录,定位其文件名属性,读取其父目录的MFT记录参考号,定位到父目录的MFT记录,向上逐级返查至根目录即可得到擦除文件的完整路径,具体步骤如下。
(1)定义返查路径栈,进行下一步。
(2)读取MFT记录的文件头,搜索文件名属性,进行下一步。
(3)读取文件名属性中的文件名,将其压入返查路径栈,进行下一步。
(4)读取文件名属性中的父目录MFT记录参考号,读取父目录MFT记录,转至步骤(2)。
(5)将返查路径栈中路径记录顺序出栈,并以分隔符“”连接,返查结束。
经过以上步骤,即可得到包含擦除文件的文件名和全路径的完整文件名。
NTFS以其优越的安全性和稳定性,已经成为主流的操作系统。电子取证中的电子证据除了包含擦除文件数据本身,同时,也包含文件路径等文件的擦除痕迹。这些电子证据的擦除痕迹,对于电子证据的可采用性及证明力有了进一步的提升。因此,对于电子证据擦除痕迹需要进一步的全面研究,以提高其利用价值。
[1]黄步根.数据恢复与计算机取证[J].计算机安全,2006,(6):79-81
[2]黄步根.NTFS系统存储介质上文件操作痕迹分析[J].2007,33(23):281-282
[3]黄步根,刘建军,张晓南.NTFS文件系统中的视频数据恢复方法[J].计算机工程,2010,(2)