wefinger

FAT32(二)重建DBR实例
本文将通过一个重建DBR的实例来帮助我们更好的理解FAT32文件系统。一、模拟破坏DBR这里博主还使用上文所使用的...
扫描右侧二维码阅读全文
22
2018/04

FAT32(二)重建DBR实例

本文将通过一个重建DBR的实例来帮助我们更好的理解FAT32文件系统。

一、模拟破坏DBR

这里博主还使用上文所使用的那个虚拟磁盘。这个虚拟分区16G内用一些文件,能正常打开:

此时我们将此分区的DBR与备份DBR全部删除来模拟DBR丢失的情况。

使用winhex删除主与备份DBR后,保存。重新挂载虚拟磁盘,此时系统提示


分区已经不能正常打开,查看其主与备份DBR位置,已经被清空,模拟成功,接下来我们就来分析如何重建DBR来修复分区取出数据。

二、重建DBR准备

FAT32文件系统的DBR格式相对固定,不同分区间只是BPB参数的改变。因此我们可以通过其他正常的FAT32分区复制一份DBR过来,然后手工修改其中的DBR参数达到手工重建DBR的目的。事实上博主也是这么做的,因此我们接下来的主要工作就是计算各各BPB参数。

三、记算BPB参数

修复前我们再看一看各各BPB参数的定义。

FAT32BPB

接下来将按照博主的习惯来逐步计算BPB参数。

3.1、计算分区大小,隐藏扇区数。

这两个参数,可以说是最容易获取的了

  • 隐藏扇区数。 隐藏扇区数从其定义中可以知道,是指MBR至主DBR的位置,从MBR中可以很容易的得知其大小是2048。这里说一个常识:从windows7开始,通过系统默认初始化分区的磁盘,其隐藏扇区数一般都是2048。
  • 分区总扇区数。在本例中,虚拟磁盘中仅有这一个分区,因此直接使用(磁盘扇区总数-隐藏扇区数)即可获得,在本例中为:33552384

3.2、计算保留扇区数与每FAT表扇区数

  • 保留扇区数,。想要得知保留扇区数,则必须找到FAT1的位置。通过前文的学习我们得知,FAT表一般以F8 FF FF 0F开头,我们可以通过winhex的搜索功能来进行搜索,winhex16进制搜索位于导航栏下方的工具栏中, 点击红框框出的图标。在搜索栏中填入F8FFFF0F搜索方向选择向下,点击搜索,很快就搜到了,我们查看一下该扇区,确定就是FAT表。记下当前扇区号,本例中为2080我们用它减去DBR的位置就能得到保留扇区数,即2080-2048=32可以得到保留扇区数为32.
  • 每FAT表扇区数。在找到FAT1后我们继续搜索FAT2的位置。按下F3继续搜索,很快找到了FAT2的位置。本例中是18448,根据文件系统结构我们得知FAT大小=FAT2起始位置-FAT1起始位置。本例中算得FAT大小等于16368

3.3、计算每簇扇区数

每簇扇区数的计算应该是FAT32BPB参数中相对比较复杂的了。它的计算方法很多样,而且很灵活,博主仅从自己常用的一些判断方法来讲讲。

  • 第一种也是比较复杂的一种,我知道数据区是按簇来管理的,而且肯定是簇大小的整数倍,而FAT表中每FAT表项都对应着数据区的一个簇,FAT表中能记录的总簇数应该就是数据区的总簇数,那么我们就可以用数据区总扇区数除以数据区总簇数即可算出簇大小。利用上面以求得的参数可以得出簇大小的计算公式为:

此处内容需要评论回复后(审核通过)方可阅读。

  • 其实还有一种更快捷准确的判断方法

此处内容需要评论回复后(审核通过)方可阅读。

四、手工填写BPB

我们已经计算得到了所有的BPB参数,下面就是按照对应位置依次填入参数,在填写时,我们没有必要手工将十进制数据转换为16进制再按照反字节序填入,我们可以直接借助数据解释器填入,将光标定位至你需要填写数据的起始位置,在数据解释器中的对应位置直接填写十进制数据然后回车即可。注意填写时注意该项参数的字节数,每字节为8bit。填写完毕后,ctrl+s保存即可。

五、重建成功

重新加载磁盘,可以看到,计算机已经能识别到该分区,且能正常打开,打开文件也正常。重建DBR成功。

关于FAT32的文件系统的介绍暂时就到这里吧,有不清楚可以留言评论。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

Last modification:April 22nd, 2018 at 12:58 pm
If you think my article is useful to you, please feel free to appreciate

9 comments

  1. dd

    巩固记忆

    1. password
      @dd

      继续学习中

  2. password

    学习中!(๑•̀ㅁ•́ฅ)

  3. dyl

    最简单的方法就是直接按照分区容量来获知每簇的扇区数。例如,8GB

    1. wefinger
      @dyl

      按分区大小猜测每簇扇区数并不准确,你那只是系统默认值,但是实际上这个值是可以随意指定的,所以还是按文中方法计算最为准确

      1. dyl
        @wefinger

        系统在对该分区格式化操作时,就是按照默认值设置的,所以这个方法还是很适用的。

      2. dyl
        @wefinger

        系统在对分区进行格式化操作时,就是按照默认值设置的。

  4. 老莫

    多年前有搞过这个,现在都忘记了

    1. wefinger
      @老莫

      你还真是啥都干过

Leave a Comment