手把手教你数据恢复编程基础知识篇

Posted xizero00

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手把手教你数据恢复编程基础知识篇相关的知识,希望对你有一定的参考价值。

好了。接上一篇,本篇,我们将详细讲解NTFS文件系统的一些重要的数据结构,闲话少叙,咱们开讲。

NTFS文件系统

一、NTFS简介

NTFS(New Technology File System)文件系统是微软公司同时和Windows NT(New Technology)操作系统开始设计。在NTFS文件系统的基本结构和各部分的功能确定后,微软公司决定使用NTFS作为NT操作系统的文件系统。NTFS作为一个全新的文件系统,它能克服原有FAT(File Allocation Table)文件系统的限制同时又满足NT企业用户的预期需要。

NTFS的明显特点是它能够很好的适应不断扩大的磁盘容量需求。所有的文件系统都把磁盘分割为逻辑的分配单元,也就是簇。FAT文件系统使用16位的入口来引用簇,因此,FAT最多能寻址216或65 536个族。簇的大小能依据磁盘的大小而改变,但是大的簇将形成磁盘碎片,或在簇内部形成较大的浪费。一个250字节的文件仍然要分配一个簇的空间,如果簇为16K字节,则15K以上的空间都被浪费。由于只能寻址65 536个簇,一个簇为l KB的FAT磁盘只能寻址65MB空间。要寻址4 GB或更大的磁盘则需要64 KB的簇,但它又将产生大量空间浪费。NTFS采用64位地址来引用簇。因此,如果使用512字节的簇,NTFS能寻址216*512字节的磁盘,在很长的时间内都能满足需要。

FAT和HPFS(High Performance FileSystem)文件系统的开发者则忽视了文件系统安全问题,而NTFS文件系统使用与Windows NT操作系统一样的安全模型。NTFS文件系统通过使用自由访问控制和系统特权访问控制,来控制能在一个文件上进行的操作。同时,文件上的任何操作都将记录在日志中,日志文件则以NT内部格式储存在NTFS文件系统内。这种方式使NTFS的安全管理与NT的安全管理天衣无缝的结合在一起。

在名字字符集方面,FAT文件系统使用8 bit的ASCII码作为文件和目录名字方案的字符集,这使得FAT文件系统的名字局限于英文字符和一些符号。NT操作系统和NTFS文件系统都使用16bit的Unicode码作为名字的字符集,NTFS文件系统的这一特性让全球的NT操作系统使用者都能使用本地语言处理他们的文件。

在FAT文件系统中,文件是以基于单位的方式储存数据模型。NTFS文件系统则允许在文件内部使用数据流。NTFS文件系统未命名的数据流等同于传统FAT中的文件数据视图,但NTFS的命名文件流则能够代替FAT的文件数据单位。

FAT没有提供对故障.容错的支持。如果在创建或更新文件和目录时,系统出现崩溃,则FAT的磁盘结构可能变得不一致。这种情形可能造成已修改数据的丢失,也可能造成驱动器的损坏和磁盘上数据的丢失。为了解决这一问题,NTFS文件系统内建一个事务日志系统,对于任何将要进行的修改操作,NTFS文件系统都要在一个特殊的日志文件中做登记。如果系统崩溃,NTFS文件系统检查日志文件并利用它使磁盘回复到数据损失最小的一致状态。

二、NTFS分区的磁盘空间分配

NTFS分区由两大部分组成:第1部分包括分区引导扇区和主文件表(Master File Table,MFT);第2部分为文件存储区域,在文件存储区中部存放的是MFT前4个(或更多)元数据文件备份。图1显示了NTFS文件系统的文件组成结构。

 

图1 NTFS文件组成

NTFS文件系统把磁盘空间的前12%分配给MFT,为保持MFT元文件的连续性,MFT对这12%的空间享有独占权,余下的88%的空间被分配用来存储文件。通过研究发现,随着文件数量的不断增长,MFT区域不够使用时,系统会另外分配一块(或者多块)空间作为MFT使用。这些区域(建立文件系统时由操作系统划分的MFT区域作为第1个MFT)在逻辑地址空间上是连续的,而在物理地址空间上则不一定连续。确定MFT区域的物理地址对磁盘扫描是很重要的。

三、NTFS磁盘管理

用来创建NTFS磁盘分区和逻辑驱动器的工具能选择簇的大小。程序基于磁盘的大小来决定簇的大小,并且能够在小的簇所带来的管理开销与大的簇所带来的空间浪费之间做出选择。表1是NTFS文件系统中不同卷大小和簇的一般对应关系。

表1 NTFS卷大小和簇大小关系表

卷尺寸

每簇扇区数

默认的簇尺寸

≤512MB

1

512个字节

513MB~1024MB

2

1024个字节(1KB)

1025MB~2048MB

4

2048个字节(2KB)

≥2049MB

8

4KB

从表1可以看出,当卷尺寸小于等于512MB时,所选取的簇尺寸为512Bytes,每簇的扇区数位1;当卷尺寸在513MB到1024MB之间是,选取的簇尺寸为1KB,每簇的扇区数为2;当卷尺寸为1025到2048MB之间时,选取的簇尺寸为2KB,每簇的扇区数为4;当卷尺寸大于等于2049MB时,选取的簇尺寸为4KB,每簇的扇区数为8。当然这并不是完全一定的,只是在文件系统格式化磁盘时的默认情况,这个默认的簇的值一般被认为是最能优化系统的值。

和FAT文件系统一样,NTFS文件系统的第一个扇区为引导扇区,即DBR扇区。其中有NTFS分区的引导程序和一些DBR参数,如果没有这些信息,分区表将不能正常使用。

在分区的第一个扇区(引导扇区DBR)后是15个扇区的NTLDR(NT Loader,系统加载程序)区域,这16个扇区共同构成$BOOT文件。在NTLDR后是文件表区域,文件表由文件记录构成,每个文件记录占2个扇区。NTFS中的各个属性被放入文件记录中进行管理,当一个属性太大时,就会分配多个文件记录进行存放。而当一个文件非常小时,可能这个文件的所有属性都包含在一个文件记录中,甚至包括这个文件的数据,也会作为属性存放在其文件记录中,这样做的好处是节约了磁盘空间并且提高了文件访问效率。

除了储存用户的文件和目录数据外,NTFS将一些用于磁盘管理的数据也储存在文件中,存储在这些文件中的与文件系统相关的数据和用户文件与目录中存储的数据都叫做元数据文件,简称为“元文件”。NTFS将这些数据当做文件进行管理,用户不能访问,它们文件名得第一个字符都是“$”,表示文件是隐藏的。在NTFS文件系统中,这样的文件主要有16个。表2列出元数据文件和功能描述。在命令行方式下,用命令“DIR *.*/AH”(显示当前目录下所有具有隐藏属性的文件),能看到这些文件的信息。

表2 数据文件和功能描述

文件名

记录号

功能描述

$MFT

0

主控文件表自身,每个文件的索引

$MFTMIRR

1

主文件表的部分镜像

$LOGFILE

2

事务日志文件

$VOLUME

3

卷属性定义表

$ATIRDEF

4

属性定义列表文件

$BOOT

5

卷的根目录

$BITMAP

6

位图文件,记录分区中簇的使用情况

$BOOT

7

引导文件,记录用于系统引导的数据情况

$BADCLUS

8

坏簇文件

$SECURE

9

安全文件

$UPCASE

10

大小写字符转换表文件

$EXTEND METADATA DIRECTORY

11

扩展元数据目录

$EXTEND\\REPARSE

12

重解析点文件

$EXTEND\\USNJRNL

13

加密日志文件

$EXTEND\\$QUOTA

14

配额管理文件

$EXTEND\\$OBJID

15

对象ID文件

在表2中,$MFT中前16个文件记录总是元文件的记录,并且这16个文件系统的顺序是固定的,下面我们详细讲解。

第1个记录就是$MFT本身的记录,也就是说$MFT首先对自己进行管理。

第2个记录是$MFTMIRR的记录,也就是$MFT前4个文件记录的镜像。

第3个记录是日志文件($LOGFILE)的记录,该文件是NTFS为实现可恢复性和安全性而设计的。当系统运行时,NTFS就会在日志文件中记录所有影响NTFS卷结构的操作,包括文件的创建和改变目录结构的命令,从而可在系统失败时能够恢复NTFS卷。

第4个记录是卷文件($VLOLUME)的记录,它包含卷名、NTFS的版本和一个标明该磁盘是否损坏的标志位,NTFS文件系统以此决定是否需要调用Chkdsk程序来进行恢复。

第5个记录是属性定义表($ATTRDEF)的记录,其中存放着卷所支持的所有文件属性,并指出它们是否可以被索引和恢复等。

第6个记录是根目录($ROOT)的记录,其中保存着该卷根目录下的所有文件和目录的索引。在访问一个文件后,NTFS就保留该文件的MFT引用,第二次就能够直接访问该文件。

第7个记录是位图文件($BITMAP)的记录,NTFS卷的簇使用情况都保存在这个位图文件中,其中每一位(bit)代表卷中的一个簇,标示该簇是空闲还是已分配。由于该文件可以很容易被扩大,所以,NTFS的卷可以很方便地动态扩大。

第8个记录是引导文件($BOOT)的记录,该文件中存放着操作系统的引导程序代码。该文件必须位于特定的磁盘位置才能够正确地引导系统,一般都是位于卷得最前面。

第9个记录是引导文件($BADCLUS)的记录,它记录着该卷中所有损坏的簇号,防止系统对其进行分配使用。

第10个记录是安全文件($SECURE)的记录,它存储着整个卷的安全描述符数据库。NTFS文件和目录都有各自的安全描述符,为节省空间,NTFS将文件和目录的相同描述放在此公共文件中。

第11个记录为大写文件($UPCASE)的记录,该文件包含一个大小写字符转换表。

第12个记录是扩展元数据目录($EXTENDED METADATADIRECTORY)的记录。

第13个记录是重解析点文件($EXTEND\\REPARSE)的记录。

第14个记录是变更日志文件($EXTEND\\USNJRNL)的记录。

第15个记录是配额管理文件($EXTEND\\$QUOTA)的记录。第16个记录是对象ID文件($EXTEND\\$OBJID)的记录。

第17~23个记录是系统保留的记录,暂时不用,用于将来扩展。从第24个记录开始存放用户文件的记录。

四、NTFS文件系统的DBR(DOS Boot Record)结构分析

NTFS文件系统的引导扇区是$BOOT的第一个扇区,它的结构与FAT文件系统的DBR类似,所以习惯上也称该扇区为DBR扇区。DBR扇区在操作系统的引导过程起着非常重要的作用,如果这个扇区遭到破坏,系统将不能正常启动。

NTFS文件系统的DBR扇区包括跳转指令、OEM(Original EquipmentManufacturer)代号、BPB(BLOS Parameter Block,Bios参数块)参数、引导程序和结束标志。NTFS文件系统DBR参数的含义如表3所示。

表3 NTFS文件系统DBR参数含义

位置

长度(字节)

字段名

0x00~0x02

3

跳转指令

0x03~0x0A

8

OEM代号

0x0B~0x0C

2

每扇区字节数

0x0D

1

每簇扇区数

0x0E~0x0F

2

保留扇区

0x10~0x12

3

总是0

0x13~0x14

2

为0

0x15

1

介质描述符

0x16~0x17

2

总为0

0x18~0x19

2

每磁道扇区数

0x1A~0x1B

2

磁头数

0x1C~0x1F

4

隐藏扇区数

0x20~0x23

4

为0

0x24~0x27

4

总为80008000

0x28~0x2F

8

扇区总数

0x30~0x37

8

$MFT的起始簇号

0x38~0x3F

8

$MFTMirr的起始簇号

0x40

1

文件记录的大小描述

0x 41~0x43

3

未用

0x44

1

索引缓冲的大小描述

0x 45~0x 47

3

未用

0x48~0x4F

8

卷序列号

0x50~0x53

4

校验和

0x54~0xFD

426

引导程序

0xFE~0xFF

2

结束标志"55AA"

接下来,我们将详细讲解DBR各个参数的含义。

(1)0x0B~0x0C:每扇区字节数。每扇区字节数记录每个逻辑扇区的大小,其常见值为512个字节,但512并不是固定值,该值可以由程序定义,合法值包括512字节、1024字节、2048字节和4096字节。

(2)0x0D~0x0D:每簇扇区数。每簇扇区数记录着文件系统的簇的大小,即由多少个扇区组成一个簇。果这个分区是在系统安装前被格式化而来的,一般大于2GB的分区每簇默认占用8个扇区,也就是每簇大小为4KB,这个字节的内容就为十六进制值“08”。如果这个分区是由一个FAT分区转换而来,则每个簇一般占用1个扇区的空间,也就是每簇大小为512字节,这个字节的内容就是“01”。在NTFS文件系统中所有的簇从0开始进行编号,每个簇都有一个自己的地址编号,并且从分区的第一个扇区就开始编簇。

(3)0x0E~0x0F:DBR保留扇区数。NTFS文件系统中DBR没有保留扇区,该值常为“0000”。

(4)0x10~0x12:总是0。这3个字节总是“00 00 00”。

(5)0x13~0x14:未用。这两个字节不用。

(6)0x15~0x15:解释描述符。这个字节为解释描述字节,一般硬盘为“0xF8”;双面5.25英寸软盘为“0xF9”;双面3.5英寸软盘RAM虚拟盘为“0xFA”;3.5英寸、1.44MB的软盘一般为“0xF0”。

(7)0x16~0x17:未用。这两个字节不用。

(8)0x18~0x19:每磁道扇区数。这是逻辑C/H/S中的一个参数,其值一般为63,NTFS已经不用此参数。

(9)0x1A~0x1B:磁头数。这是逻辑C/H/S中的一个参数,其值一般为255,NTFS已经不用此参数。

(10)0x1C~0x1F:隐藏扇区数。隐藏扇区数是指本分区之前使用的扇区数,该值与分区表中所描述的该分区的起始扇区号一致。对于主磁盘分区来讲,是MBR到该分区DBR之间的扇区数:对于扩展分区的逻辑驱动器来讲,是其EBR到该分区DBR之间的扇区数。

(11)0x20~0x23:未用。这四个字节不用。

(12)0x24~0x27:未用。这四个字节不用,但总为80008000。

(13)0x28~0x2F:扇区总数。扇区总数是指分区的总扇区数。NTFS的BPB中记录的分区大小比分区表中记录的少一个扇区,因为分区最后一个扇区留给DBR备份使用。

(14)0x30~0x37:$MFT的起始簇号。这8个字节为$MFT的起始簇号,注意这个位置使用簇号定义的,而不是扇区号,并且改地址不是固定值。

(15)0x38~0x3F:$MFTMirr的起始簇号。这8个字节为$MFTMirr的起始簇号,这个位置使用簇号定义么人不是扇区号。$MFTMirr的地址也不是固定值得,可以在$MFT之后,也可以在$MFT之前。

(16)0x40~0x40:文件记录的大小描述。这个字节描述每个文件记录的簇数。注意该参数为带符号数,当其实负数时,说明每个文件记录的大小要小于每簇扇区数,在这种情况下,文件记录的大小用字节数表示。

(17)0x41~0x43:未用。这三个字节不用。

(18)0x44~0x44:索引缓冲的大小描述。这一个字节描述每个索引缓冲的簇数。注意改参数也是带符号数,当其是负数时,说明每个索引缓冲的大小要小于每簇扇区数,在这种情况下,索引缓冲的大小用字节数表示。

(19)0x45~0x47:未用。这三个字节不用。

(20)0x48~0x4F:卷序列号。这8个字节为分区的逻辑序列号,也就是在命令下输入DIR命令后显示的一排数据,这个序列号是硬盘格式化时随机产生的。

(21)0x50~0x53:校验和。BPB的最后四个字节是其校验和,一般都为0。

五、NTFS文件系统的MFT(Master File Table)结构分析

在NTFS文件系统中,磁盘上所有的数据都是以文件的形式出现的,即使是文件系统的管理信息也是以一组文件的形式存储的,即元文件。元文件主要有16个,在前面已近介绍过。16个元文件中主文件表($MFT)是一个非常重要的元文件,它由文件记录构成,每个文件记录占用2个扇区。其文件记录头信息如表4所示。

表4 MFT结构

位置

字段长度(字节)

字段名和含义

0x00~0x03

4

MFT标志,一定为字符串“FILE”

0x04~0x05

2

更新序列号的偏移

0x06~0x07

2

更新序列号的大小和数组,包括第一个字节

0x08~0x0F

8

日志文件序列号

0x10~0x11

2

序列号

0x12~0x13

2

硬链接数,即有多少目录指向该文件

0x14~0x15

2

第一个属性的偏移地址

0x16~0x17

2

标志,0x00表示文件被删除,0x01表示文件正在使用,0x02表示目录被删除,0x03表示目录正在使用

0x18~0x1B

4

文件记录的实际长度

0x1C~0x1F

4

文件记录的分配长度

0x20~0x27

8

基本文件记录中的文件索引号

0x28~0x29

2

下一个属性的ID,当增加属性时,将该值分配给新的属性,然后该值增加,如果MFT记录重新使用,则将它置0,第一个实例总为0

0x2A~0x2B

2

边界,Windows XP中为偏移0x30处

0x2C~0x2F

4

文件记录参考号,Windows XP中使用,Windows 2000中无此参数

0x30~0x31

2

更新序列号

0x32~0x35

4

更新数组

接下来,我们来详细介绍表4中各个字段的含义

(1)0x00~0x03:MFT的标志字符串,总为“FILE”。

(2)0x04~0x05:更新序列号的偏移量。

(3)0x06~0x07:更新序列号的大小与数组。

(4)0x08~0x0F:日志文件序列号,每次修改都将导致其被修改。

(5)0x10~0x11:序列号,用于记录主文件表记录被重复使用的次数。

(6)0x12~0x13:硬连接数,只出现在基本文件记录中。

(7)0x14~0x15:第一个属性的偏移地址。

(8)0x16~0x17:文件标志,表示文件状态。

(9)0x18~0x1B:文件记录的实际长度,即文件记录在磁盘上实际占用的字节空间。

(10)0x1C~0x1F:系统分配给文件记录的长度,一般为“00 04 00 00”,即1KB的长度。

(11)0x20~0x27:基本文件中的文件索引号,基本文件在此的值总为0,如果不为0,则是一个主文件的文件索引号,指向所属的基本文件记录中的文件记录号。

(12)0x28~0x29:下一个属性的ID。

(13)0x2A~0x2B:边界。

(14)0x2C~0x2F:文件记录编号,由0开始编号。

(14)0x30~0x31:更新序列号,会同时出现在该文件记录的第一个扇区和第二个扇区的最后两个字节处。

(15)0x32~0x35:更新数组,当文件系统中信息要往第一和第二个扇区的最后两个字节处写入时,它才会其作用,具体对应关系是:文件记录第一个扇区最后两个字节对应0x32~0x33处,文件记录第二个扇区最后两个字节对应0x34~0x35处。

文件记录由两部分组成,一部分是文件记录头,另一部分是属性列表,一个属性的偏移0x00~0x03处的四个字节,为该属性的类型标识,不同的属性其结构和含义各不相同。每个属性也都可以分为两个部分,属性头和属性体。属性头包含该属性的重要信息,如属性类型、属性大小、名字(并非都有)、及是否为常驻属性。一个属性根据是否常驻和是否有属性名,可以排列组合成四种情况,分别为:常驻没有属性名,常驻有属性名、非常驻没有属性名、非常驻有属性名。

 

好了,关于文件系统的就先介绍到这里,我会继续写下去的,下一篇,我们将详细介绍如何调用Windows的API来实现磁盘数据的简单读取。

如果您有什么问题可以联系我xizero00#gmail.com(将#换成@ 即可)

以上是关于手把手教你数据恢复编程基础知识篇的主要内容,如果未能解决你的问题,请参考以下文章

手把手教你数据恢复编程基础知识篇

手把手教你学perl编程之题目篇

手把手教你做项目web框架flask篇——基础用法详解

手把手教你做项目多线程篇——基础知识详解

手把手教你做项目MySQL篇——从下载到命令总结

《手把手教你》系列基础篇之2-python+ selenium-打开和关闭浏览器(详细)