浅谈数据恢复原理

数据恢复是一门比较有用的技术,尤其是当硬盘、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下文件的遍历、隐藏、保护和删除都已讲完,了解更多请上网。具体实现方法及代码请参考《自己动手写数据恢复软件》一文。

  • 9
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
研究磁盘数据恢复的,可以参考 09\JIAN-H 第9章的9.1 JIAN-H.EXE 建立汉字库头文件 09\HZCALL 第9章的9.2 HZCALL.OBJ 显示汉字程序模块 09\NAME 第9章的9.3 NAME.OBJ 图形方式下处理输入字符 10\ARSE 第10章的10.1 ARSE.EXE 读扇区数据(汇编) 10\CRSE 第10章的10.2 CRSE.EXE 读扇区数据(C) 10\HCRSE 第10章的10.3 HCRSE.EXE 读扇区数据(C、汉显) 11\AWSE 第11章的11.1 AWSE.EXE 写扇区数据(汇编) 11\CWSE 第11章的11.2 CWSE.EXE 写扇区数据(C) 11\HCWSE 第11章的11.3 HCWSE.EXE 写扇区数据(C、汉显) 12\ALLSE 第12章的12.1 ALLSE.EXE 对扇区进行多种操作 12\HALLSE 第12章的12.2 HALLSE.EXE 对扇区进行多种操作(汉显) 13\READSF 第13章的13.1 READSF.EXE 读扇区备份文件 13\HREADSF 第13章的13.2 HREADSF.EXE 读扇区备份文件(汉显) 14\SEDIT 第14章的14.1 SEDIT.EXE 编辑扇区文件字节值 14\HSEDIT 第14章的14.2 HSEDIT.EXE 编辑扇区文件字节值(汉显) 15\SBLOCK 第15章的15.1 SBLOCK.EXE 扇区文件块拷贝 15\HSBLOCK 第15章的15.2 HSBLOCK.EXE 扇区文件块拷贝(汉显) 16\JIAN-H1 第16章的16.2.3 JIAN-H1.EXE 扩充汉字库头文件 16\HZCALL1 第16章的16.2.3 HZCALL1.OBJ 重新编译汉字显示程序模块 16\COMPSF 第16章的16.1 COMPSF.EXE 比较扇区文件 16\HCOMPSF 第16章的16.2 HCOMPSF.EXE 比较扇区文件(汉显) 17\0SE63 第17章的17.1 0SE63.EXE 显示0磁道扇区数据 17\H0SE63 第17章的17.2 H0SE63.EXE 显示0磁道扇区数据(汉显) 18\EARSE 第18章的18.2 EARSE.EXE 扩展读扇区数据(汇编) 19\EAWSE 第19章 EAWSE.EXE 扩展写扇区数据(汇编) 20\RSECTOR 第20章的20.1-20.3 RSECTOR.EXE C调用汇编扩展读 20\HRSECTOR 第20章的20.4 HRSECTOR.EXE C调用汇编扩展读(汉显) 21\WSECTOR 第21章的21.1-21.3 WSECTOR.EXE C调用汇编扩展写 21\HWSECTOR 第21章的21.4 HWSECTOR.EXE C调用汇编扩展写(汉显) 22\EALLSE 第22章的22.1 EALLSE.EXE 对扇区多种扩展操作 22\HEALLSE 第22章的22.2 HEALLSE.EXE 对扇区多种扩展操作(汉显) 23\JIAN-H2 第23章的23.2 JIAN-H2.EXE 扩充汉字库头文件 23\HZCALL2 第23章的23.2 HZCALL2.OBJ 重新编译汉字显示程序模块 23\BOOTF
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值