
故障存储:SD卡 64G /exFAT
故障现象:
拍完照片后通过读卡器电脑端查看,结果发现连续有大约8张JPG文件无法正常打开。使用通用恢复软件恢复后同样不能查看,提示损坏。
故障分析:
通过在WINHEX中查看出错的文件表现出相同的故障:
1、 文件容量大小正常
2、 第一个簇块是正常的,文件头看样子也正常。
3、 Fat表链出现问题,跳转FAT表发现指向为0,所以查看表链也仅能获取第一个簇块编号。
初步推测是可能是由于读卡器问题导致相关文件的FAT表被清0,文件变的不正常。
故障处理:
前边已经说过JPG的文件结构不太适合碎片的定位和重组,但是分析这个案例还是发现恢复是可行的,最终决定使用遍历的方法进行按簇写入再查看。
因为在文件系统中所有写入最小单位是簇,那么以簇块为单位进行文件头之外的遍历写入,因为JPG的霍夫曼压缩算法是以行为单位,那么每写入一次去解析查看一次图片如果能得解压出正常的行,那么当前碎片就算吻合,如此重复直到完成。当然要想做到这些,至少要保证以下几点:
1、 文件没有被覆盖过至少一簇
2、 尽可能的压缩查找区间,在很小的范围内进行遍历。
3、 遍历过程中进行初步判断排除一些无用的碎片,因为存在JPG交叉碎片的情况,所以提升遍历的质量也很重要。
基于以上三点,写了一个小程序,实际使用效果非常好,当然这个也和此卡仅仅拍摄照片有关系,如果卡中数据过于复杂,如存在视频文件,视频文件也是压缩算法会导致遍历成本增加。
如下图,通过这个程序可以探测出文件尾,缩小遍历区间,同时做到第3点要求,最终成功恢复出6张JPG文件,极其完美。另外2张JPG,经过对比文件头所在的簇有覆盖产生,所以已经不满足之前我们说的条件了,无法有效恢复。考虑到这个案例的特殊性,此程序仅提供一种极端情况下的恢复方案,如果碎片区间过大,区间中干扰信息较多,那么遍历的成本就会无限增加!
这就是JPG文件碎片的恢复方法,算是一个另类的采用笨办法遍历的方法,当然从恢复结果来看虽然方法笨便是有效!大家在遇到此类问题时,可以和我们联系。