浅谈NTFS文件系统的数据恢复程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浅谈NTFS文件系统的数据恢复程序设计

【摘要】NTFS文件系统的一大特点是所有的数据,包括系统信息,如引导程序、记录整个卷的分配状态位图等都以文件的形式存在。MFT是NTFS卷结构的核心,系统通过MFT来确定文件在磁盘上的位置以及文件的所有属性,MFT是一个与文件相对应的文件属性数据库,它记录了除文件数据信息外的所有属性(,甚至当文件内容很短时,其内容直接在MFT的数据属性中存放,不再额外占用簇空间。这一点就有别于FAT系统了,在FAT结构中,即使文件很小,也必须占用1个簇的空间,这其实是很浪费磁盘空间的。

【关键词】数据;属性;空间

1 引言

在信息社会日益发达的今天,政府、军队、企业以及个人越来越多关注信息的安全。而信息安全最重要的一环就是数据安全。数据一旦损坏或损失,将为单位或个人带来非常大的损失和不必要的麻烦。而在工作中,这些事情又是难免的。所以,数据恢复技术在我们的工作生活中占有了越来越重要的地位。

2 MFT结构分析

每个文件都与MFT表一一对应,而文件删除、修改等操作都在MFT表中得到了体现,故我们首先必须分析出MFT结构。同样还是采用WinHex软件进行分析。MFT由两个部分组成,即MFT头(也称文件记录头)和属性列表。MFT头的长度和偏移的数据含义是固定不变的,而属性列表则是可变的,其不同的属性数据有着不同的含义,后面将对其进行具体的分析。下面先分析MFT 头结构中主要的偏移位置,即笔者认为在数据恢复程序设计中必须考虑的偏移位置。(1)文件记录头前四个字节的值总为0x454C4946H,标识其为MFT记录表项。(2)偏移14H处,记录了MFT头的总长度,即MFT中第一个属性流的开始。故在程序设计中,即可采用条件语句IF(strcmp(MFTFlag,”FILE”)!= 0 ||*(LPWORD)(lpBuffer + 0x14)== 0)来判断当前读取的文件是否为MFT 记录表项,若非,则直接忽略此文件(其中,MFTFlag表示MFT头最前面四字节值;lpBuffer表示MFT 的起始偏移)。(3)偏移16H处的值为标记字节,具体含义为:00H表示已删除的文件,01H表示正常的文件,02H表示已删除的目录,03H则表示正常的目录,故偏移16H处的值可用于判断此MFT表项是否为非目录文件且是否已删除。(4)偏移18H处四字节,记录了MFT表项的总长度,通过获取此值就可判断MFT表项的结束偏移位置,其中MFT的结束偏移处的标记为FFFFFFFFH,但在NTFS卷的一些MFT中有时会出现不止一个FFFFFFFFH的情况。属性列表也被细分成了两个逻辑组成部分,即属性头部和属性数据,其中属性头部标识了属性的类型、属性数据的相对偏移及其长度。因MFT大小只有1KB,故可能导致有些属性并不能完全存放在单个的MFT表项中,NTFS采用了簇运行列表结构(runs list),将不能完全存放下来的属性值采用了多个簇分开存放,这些簇在物理上可以不连续,故NTFS引入了LCN、VCN来

定位簇号,此类型的属性在NTFS卷中称为非常驻属性,反之则为常驻属性,其中10属性、30属性总为常驻属性,而用于反映数据存储位置的80属性则常为非常驻属性。下面深入地分析与数据恢复相关的属性结构。

3 NTFS下重要的属性结构

1)10属性分析10类型属性即$STANDARD_INFORMATION属性,为文件的标准信息。包括一些基本的文件属性,如只读、系统、存档、隐藏及MAC属性。其中,相对属性头的偏移14H~15H两字节值为10属性值的开始偏移,偏移04H~08H四字节值为10属性的总长度。获取与文件相关的MAC时间。MAC日期与时间相对属性值的偏移分别为00H、08H、18H处,且均占8个字节。MFT表项中的MAC采用64位即8个字节来表现,存储格式为Coordinated Universal Time(UTC),其精确度为100ns,且是从1601年1月1日00:00:00开始为起点。程序设计中,采用结构体FILETIME即可存放64bit的MAC时间,然后再调用Microsoft提供的上层API函数FileTimeToSystemTime,将UTC时间转换为本地时间即可重现文件的MAC日期及时间。

2)30属性分析30类型属性即$FILE_NAME属性,用于存储文件名,总为常驻属性,其相对属性头的偏移代表的含义和10属性一样,不再赘述。属性值中包括父目录的MFT参考号、文件名,获取父目录的MFT参考号。MFT参考号即MFT的相对$MFT表的序号,即给定一个MFT参考号N,即可求出此文件MFT表项在MFT区域的物理位置,N对应的MFT表项的物理扇区数=N*2+BPB_MFTStartClus*8。其中,BPB_MFTStartClus值表示NTFS指定分区的MFT起始簇,可以从BPB结构体中获得。上式表明,已知父目录的MFT参考号即可映射到其父目录的MFT表项位置,从而可以获取父目录MFT表项的相关属性信息,故在程序设计中可以依次的向上搜索出整个目录树。30属性值偏移00H处开始,共8个字节,即为父目录的MFT参考号。在程序设计中,其实只需要读取前4个字节内容,不需要考虑后四个字节。获取文件或目录名。NTFS卷中文件名采用Unicode编码,每个字符占两个字节。在30属性中,文件名的首个字符从属性值偏移42H开始,字符总数记录在偏移40H处,故借助这两处的偏移值,即可准确的读取文件或目录名。但有些MFT表项中会出现两个30属性,前者用于兼容8.3格式文件,假设文件名为recovery.txt的文件,在首个30属性中,其文件名则为RECOVE~1.txt,共12字节;后者用于记录文件或目录的长文件名,

3)80属性分析80 属性即$DATA属性,用于存放文件真实数据或文件数据存放的物理偏移位置。80属性可为常驻属性也可以是非常驻属性,取决于文件数据大小。当文件数据很小,能直接在MFT中存放时,则为常驻属性;反之,则为非常驻属性。常驻80属性,属性头偏移10H~13H处的值为文件数据所占字节数,偏移14H~17H处的值为文件数据存储的起始位置,故读取这两个偏移处的值即可以直接获取文件的真实内容。非常驻80属性。当文件很大时,则会在属性值位置记录文件数据的簇运行列表(Data Runs list),这个列表直接反映了文件数据是否离散存储、占用的簇数及其簇的物理偏移位置。非常驻属性头偏移20H处的值记录了数据运行(Data Runs)的偏移地址;偏移04H处则记录

相关文档
最新文档