数据恢复是一门比较有用的技术,尤其是当硬盘、U盘、手机存储卡等发生数据丢失时,如何找回丢失的文件和数据则成为最关键的问题。能否找回数据不仅和存储介质有关,而且和操作系统以及介质所在的文件系统有很大的关系,基本上,分区表及文件系统(File System,简称FS)是决定数据能否找回的关键,因为它决定了数据存储的逻辑结构,一旦FS被破坏,即便物理上数据依然存在,可因为数据已经失去完整性和连续性,所以找回数据就变得相当困难。分区表则是决定整个磁盘的布局,从分区表可以得知分区数量、主/扩展分区及逻辑分区的位置与大小等,所以分区表丢失对数据的破坏也是异常严重的。本文仅谈论文件系统的结构。
Windows上常见的文件系统有FAT16/32,NTFS,exFAT等,FAT目前基本只有U盘上使用,硬盘上一般都用NTFS,因为FAT32下单个文件最大不能超4G而且文件信息有限,NTFS则不受这个限制,而且加入了安全描述符(Security Descriptor),也就是我们可以为文件或目录设置不同的权限。但是FAT32在U盘下有时还是很方便,当然也可以格式化成NTFS,不过格成NTFS会遇到一种特殊的情况,比如到了某台不受你控制的电脑,你可能因为当前权限原因而无法删除U盘上的文件,问题就变得麻烦了。除此之外,也可格成exFAT,exFAT介于FAT和NTFS两者之间,exFAT下文件大小可以超过4G,所以比FAT32好用。虽然FAT32和NTFS的存储数据方式不同,但某些原理还是相似的,所以,了解了FAT,也就更容易了解NTFS。下面以FAT32为例简单谈一下如何实现FAT下数据的读取和恢复。
FAT12/16由DBR(保留区)、FAT表、根目录和数据区组成,FAT32则没有根目录,根目录位于数据区和文件放在一起。目录(Directory)和文件夹是一样的东西,只是不同的叫法,以下统称目录。DBR扇区中记录了分区基本信息,如每扇区字节数、每簇扇区数、保留扇区数等等。DBR开头三个字节是汇编指令,类似于EB XX XX,意思是跳转到引导代码处。如果将首字节0xEB改成其它数字比如00,分区便无法访问,双击分区会提示未格式化什么的,不过这只是当前电脑的操作系统不识别,如果把U盘或TF卡放到其它系统中去,比如放到随身播放器中还是能够听音乐的,因为播放器系统不一定会检查这个字节的合法性。下面说一下簇,簇是文件系统的存储单位,由若干扇区组成,一个文件若存放了一个簇的前半部分,那簇的后半部分就不能再存放其它文件,也就是说,一个簇不能同时存两个文件。比如假设一个簇大小是8192字节,有个文件大小是1字节,那么它会占据某个簇的第1个字节,实际上它所占的空间是8192字节,剩余8191字节就被浪费了,所以理论上簇是越小越好,但也不能太小,否则寻址不方便。下面看FAT表的结构,FAT表中,每4个字节也就是32位为一项,每一项中记录着簇的编号,前两项不记录簇号,第三项在偏移0x8处,为第一个簇,也就是2号簇,后面是3号,依次编号,每个FAT项的内容是下一个簇的编号。如果内容是FF FF FF 0F,则说明该簇没有下一下关联的簇,是独立簇,独立簇存放的是不超过一个簇大小的文件内容,就这样,每个簇都指向下一个簇,如此不停地跳来跳去,最终就能找到一个文件的所有内容,当跳到FF FF FF 0F,说明这是文件内容的最后一个簇。文件内容的位置在FAT表中记录,那文件的名字和大小等信息保存在哪里呢?文件的大小等信息其实是另一个目录的内容。根目录中首先保存着根目录下所有文件和目录(以下不说明,文件将包括目录,目录也是文件)的信息,每一项信息大小是32个字节,其中有文件短名、长名、删除标记、属性、创建时间、大小、起始簇号等信息,一项信息开头为0,说明已经到头了,系统会认为下面没有子目录和文件了,表示已经搜索完该目录内的所有文件。如果将根目录中第一个字节改为0,那该分区下就成了空白,将看不到任何文件,其实这不完全等于隐藏,因为如果系统再创建文件时会寻找目录项开头为0的项,然后替换它。如果一目录项是文件(通过属性判断),项中保存着文件内容所在的第一个簇,如果是目录,则项中保存着目录的内容,目录的内容正是目录内文件和子目录信息,这些信息又是一系列目录项,甚至占多个簇(如果目录内文件过多),这样一层一层就能遍历目录内所有文件。
创建文件时,首先在FAT中为该文件分配簇,0大小文件不分配。然后在根目录一层层找到它的父目录,然后在父目录中为它分配目录项,记录文件起始簇、文件时间等信息。如果文件名超过8.3或名字含有特殊字符或中文,就为它建立长文件名目录项,短名按一定规则重新命名。删除文件时,一是清除文件FAT表中的簇号,将簇标记为没有使用,以便让给其它文件,二是目录项开头字节被改成0xE5,表示已删除,整个过程文件内容没有做任何改变。若只改删除标记文件也会消失,但簇未释放,文件暂时被隐藏,但不代表系统以后不会清理它,模拟这个过程我们可以实现强删任意文件,不管它是否有保护或正在运行。一个文件被删除,目录项并没有被立即清空,里面仍记录着文件内容的首簇,所以我们能找到文件内容开始一少部分字节,假设1个簇大小为8192字节,如果文件大小小于1个簇,比如512字节,那么只要簇没有被立即占用,我们就能完全恢复该文件,如果文件为16384字节,就要占两个簇,第一个簇读完,这时我们到FAT中查看该簇记录的下一个簇,因为文件被删,文件所有簇被清空,改为00 00 00 00,所以就不能再继续读取了,恢复就变得困难多了,至少不能按常规方法恢复,除非文件是连续存储的,这样我们按簇顺序读取,就能把它恢复。因而,在FAT下恢复文件具有一定概率。用过数据恢复软件的人可能会遇到这种情况,有时已经看到一个文件的名字,恢复出来却是乱码,出现这种情况正是前面说的原因。其实,看到0还不算可怕,如果看到非0,那才悲剧,说明已经被另一个文件替换了,这样就连首簇内容也无法恢复了。从可恢复性上看,NTFS和FAT32就不同,NTFS下如果文件簇没有被覆盖,理论上文件百分之百可以被恢复,或者说,相对而言NTFS文件系统可恢复性更高。下面说隐藏。FAT32下能否简单隐藏一个文件呢?要隐藏一个文件,可以通过改属性标志实现,但不是改变我们通常所说的Hidden(隐藏)属性,而是指改卷标属性。设置普通的隐藏属性后,文件还会在资源管理器中看到,但设置了卷标属性,文件无法再通过文件管理器看到,不过一旦改了驱动器卷标名,文件目录项会丢失,所以最好只对目录进行隐藏。可以将一个目录增加卷标属性,它就看不到了,从而实现了底层隐藏,就连杀毒软件也检测不到它的存在。事实上真有这么强大吗?事实上确实是这样,因为就连操作系统或许都已经检测不到它了,因为你破坏了它的结构。文件是逻辑上的东西,改了关键字节,文件的逻辑结构会发生改变,换句话说,操作系统已经不认为它是一个有效的文件了,它只是磁盘上的一堆数据。其实对于物理磁盘而言,并不存在什么文件,只存在数据0和1,硬盘也根本不知道什么叫文件,就像CPU不知道什么是操作系统一样,它只关心寄存器指令。经过测试,通过这种方法将目录隐藏后改卷标名并不影响目录本身,取消属性后仍然能看到该目录及其下面的所有文件,不过卷标属性是只读的,不能通过SetFileAttributes函数更改,所以只能用DDM(Direct Disk Manipulation,意为“直接磁盘操作”,即直接操作磁盘来访问文件)技术实现。那能不能禁止文件被复制和访问呢?办法是有的,还是改属性,将属性第6bit设为1,它就不能被运行和复制了,任何对该文件或目录的访问都会提示“拒绝访问”,有人顺便会把第7bit也就是最后1位也设为1,这个其实没有必要,7bit其实是Normal(标准)属性,值为0x80,就是不含其它属性的属性,FAT中值存储为0,两者一样,只是在设置属性时加以区分。目前为止,FAT下文件的遍历、隐藏、保护和删除都已讲完,了解更多请上网。具体实现方法及代码请参考《自己动手写数据恢复软件》一文。
浅谈数据恢复原理
最新推荐文章于 2024-07-24 20:19:10 发布