NTFS文件系统中用WinHex手动恢复文件的研究
2020-05-21史春水刘思磊
史春水 刘思磊
摘要:通过数据恢复软件扫描出来的文件的文件名很多都已经改变,现在的硬盘已经容量很大,通常用户在硬盘里存的文件也非常多,再通过这种扫描的方法恢复丢失文档必然造成再次寻找文件的麻烦,通过手动恢复某个具体的文件就变得有价值。
关键词:计算机;数据;恢复
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2020)09-0036-03
现今数据恢复的软件较多,大多数数据恢复软件可以扫描出丢失的文件,不过多数扫描出来的文件的文件名都已经改变如下图1所示,如果硬盘里的文件数目比较少这种文件名改变的情况引起的问题还不大但是现在的硬盘已经容量很大,通常用户在硬盘里存的文件也非常多,再通过这种扫描的方法恢复丢失文档必然造成再次寻找文件的麻烦,通过手动恢复某个具体的文件就变得有价值。下面我们探讨一下针对个别文件进行恢复的方法。
当用户把硬盘分区格式化为NTFS文件系统就建立了一个NTFS的结构,将整个磁盘分区上的任何一件事物都看作一个文件,而文件的相关事物又看作一个属性。“Master File Table”(MFT主文件表)就是NTFS文件系统中一个特殊的文件,它详细地记录了各个文件的属性。每个文件记录在主文件表中占据的磁盘空间一般为两个扇区,大小1KB,因为MFT的重要性在NTFS文件系统的原文件中还有MFT的备份“MFTMirr”,不过MFTMirr只备份了MFT的前8个扇区。文件放人回收站不小心清空了,按Shift+Del键永久删除之后又想找回这个文档,格式化,重装系统等通常是导致文件丢失的几种常见方式。下面我们来分别看看清空回收站、按Shift+Del键永久删除文件丢失后对$MFT文件的分析。
1 清空回收站
我们在VHDI硬盘的NTFS分区内放人一个文件名为“大家好”的word文档,我们先用winhex打开这个盘然后找到$MFT元文件,然后我们新建一个txt文本文件在里面输入大家好另存为的时候选择Unicode如图2所示,这样我们就可以知道文件名在$MFT中的30H属性中的编码如图3所示。
我们再用Winhex软件把这个硬盘分区打开并单击$MFT,由于NTFS文件系统中所有事物都是以文件的形式管理并在$MFT中记录并占用2个扇区,因此我们通过搜索文件名的方式找到这个文件在$MFT中的记录如图4所示。
从图中可以看出该文件的文件名在30H属性中,另外可以看到80H属性中该文件的RunList为21048927。我们先把这个盘备份,然后再用清空回收站的方式删除这个分区里的“大家好.doc”文件,再通过查找文件名的方式可以发现30H属性中文件名已经发生变化如图5所示。
重新根据变化的文件名找到$MFT中的记录如图6所示,通过80H属性知道这个文件的Runlist为21048927,通过跟没删除前进行对比可以发现虽然文件被删除并在回收站清空了但是文件在分区里的簇流并没有发生变化。
2 Shift+Del键永久删除
下面我们再来看看Shift+Del键永久删除文件方式对文件在分区中Runlist有没有影响。我们把刚刚备份的盘重新加载并根据之前的方法搜索文件名,因为是备份盘,所以80H属性中该文件的RunList仍然为21048927,然后用Shift+Del键永久删除这个文件,再通过搜索文件名的方式找到文件在$MFT中的记录如图七所示,这次我们可以发现不但文件名没有变化,而且文件的Runlist仍然为21048927,因此可以知道文件在分区中的位置没有发生变化,也就是说Shift+Del键永久删除文件方式对文件在分区中Runlist没有影响。
从上面的分析可以看出,只要MFT中还保留着文件记录数据恢复就有迹可循,但是一旦文件记录被破坏掉文件的恢复就比较困难。我们可以找出一条快速找到文件的思路,就是通过查找文件在MFT中的记录并利用80H属性中的Runlist就可以对数据进行恢复。
在数据恢复中经常会遇到分区信息丢失的现象如图8所示。根据之前的思路我们首先要找到MFT,分区如果没有丢失那么我们可以直接看到$MFT,而这种情况我们可以根据MFT的特性来找,通过搜索十六进制数46494C45(明文FILE)可以快速找到$MFT如图9所示。
在NTFS文件系统中$MFT元文件中存在大量的46494C45。首先我们要区分开是MFT还是MFTMirr,区分的方法是MFTMirr只备份了MFT的前8个扇区,如果找到以46494C45开头的扇区并向后跳转8个扇区发现扇区的开头不是46494C45,可以判断找到的是MFTMirr。下面我们来研究怎么通过查找MFT和MFTMirr来找到需要的文件。NTFS文件系统结构如下表所示,如果是第一种我们可以很快搜索到$MFT。
如果是第二種结构通过分析文件系统结构我们可以得出如下等式,并且经过观察现在以表二这种结构居多。
MFT的起始扇区=MFTMirr的起始扇区+(MFT起始簇一MFTMirr起始簇)*每簇的扇区数
把之前备份的盘分区信息删除,通过搜索46494C45,在2064扇区找到一个MFT记录并在30H属性中看到这是文件名为$MFT的元文件如图10所示,之前分析过这并不能判断一定是MFT,从2064扇区往后跳转8个扇区在2072扇区的00偏移可以判断之前找到的是MFTMirr如图11所示。
因为MFTMirr前8个扇区是完全备份MFT的,可以从MFT的80H属性中找到MFT的Runlist并通过数据解释器看出MFT的起始簇是786432如图12所示,接着通过MFTMirr的80H属性找出MFTMirr的起始簇是2如图13所示。
根据上面的分析,已经找到了MFTMirr的起始扇区为2064,MFT的起始簇为786432簇,MFTMirr的起始簇为2簇,那么只要找出每簇的扇区数就可以计算出MFT的起始扇区。一般来讲每簇扇区数在DBR信息里可以直接看到,但是DBR损坏的话那就必须通过其他方式来找,比如可以通过80H属性找出这个文件所占的总簇数以及总字节数,那么每簇扇区数=总字节数/512/总簇数,因为每个扇区为512字节,文件总字节数/512=文件总扇区数,再除总簇数就可以得出每簇所占的扇区数,下面我们举例说明一下。通过数据解释器可以知道这个文件占的总字节数为67108864字节如图14所示,然后通过这个文件的Runlist可以知道总簇数为16384簇如图15所示,计算后得知每簇扇区数为8,也符合现在NTFS文件系统常见每簇所占扇区数。
现在我们把数据代入,MFT的起始扇区=2064+(786432-2)*8,计算后为6293504扇区,我们根据计算的结果直接跳转到该扇区来验证一下可以发现这个办法是可行的如图16所示。
找到$MFT元文件后,再来找某个具体的文件就变得容易了。通过搜索文件记录找到80H属性然后再根据文件的Run-list来提取该文件即可。
参考文献:
[1]赵振洲.数据恢复技术案例教程[Ml.机械工业出版社,2018.
[2]刘伟.数据恢复技术深度揭秘[M].电子工业出版社,2010.
[3]张京生,汪中夏,刘伟.数据恢复方法及案例分析[M].电子工业出版社,2008.
[4]高志鹏,张志伟,孙云峰.识数寻踪[M].人民邮电出版社,2013.
【通联编辑:代影】
作者简介:史春水(1975-),男,湖南邵阳人,中学高级教师,本科,主要研究方向为计算机。