1、首先我们先给出复合文档的数据分配结构:文件头 数据区 MSAT SAT 目录 SSAT 文档标示最后那个文档标示,占用最后一个扇区。不重要;其中的那个 MSAT 指的是主扇区配置表过大,用来存储过大的那部分MSAT 内容的扇区;对于复合文档的修复,主要都是基于修复文件头的,就像是修复 FAT文件系统的 DBR 一样。那么我们就可以根据修复 FAT 文件系统一样的方法来修复复合文档的文件头。思路就是先拷贝一个正常的复合文档的文件头覆盖掉被破坏的文件头,然后逐一修改相应的参数。这里我们需要修改的参数有以下几个:l SAT 占用的扇区数;l 目录流的起始扇区号,也就是目录流第一个扇区的 SID;l
2、短扇区配置表(SSAT)的起始扇区,也就是 SSAT 的第一个扇区的 SID;l 短扇区配置表(SSAT)占用的扇区总数;l 存放主扇区配置表的其他扇区的第一个扇区的 SID,如果没有则此处为 FE FF FF FF;l 存放主扇区配置表的其他扇区的扇区总数,如果没有则此处为 00 00 00 00;至于扇区大小数,一般都是 09 00 00 00 也就是 512 个字节。短扇区大小数一般都是 06000000也就是 64 个字节。还有标准流的大小一般情况下也是 00 10 00 00 也就是 4096 个字节;好的,下面我们就根据上述分析来逐一找到那些参数,从而修复复合文档的文件头。0 号扇
3、区已经被清零了,文件头完全被破坏了。下面我们来修复这个文件头。l 先复制一个正常的复合文档的文件头覆盖掉受损的文件头,然后逐一修改相应参数;l 我们首先要找的是目录流起始扇区,因为前面分析过,目录流的签名标志是 ROOT entry .搜索 52006F006F007400 找到目录流的起始扇区。我们在 1556 号扇区找到了目录流的起始扇区,那么我们就确定了目录流的起始扇区这个参数了,为 1556-1=1555 用十六进制表示就是 06 13 。接着我们顺着目录流往下找,因为前面说过紧接着目录流的是SSAT。目录流记录的都是一些名称之类的,而 SSAT 记录的确是 SID。这个就跟 FAT
4、表记录的内容一样,4 个字节占用一个表项。我们很容易就能区分出目录流和 SSAT。果然我们就在 1558 号扇区找到了 SSAT。看到 SSAT 的内容了吗,记录的就是 SID 和目录流记录的内容完全不一样,我就是通过这个判断出目录流到哪里就结束了。SSAT 找到了,起始扇区是 1558-1=1557 号扇区,大小只有一个扇区,因为 SSAT 的后面只有一个扇区了,就是前面提过的表示扇区。所以我们的 SSAT 占用 1 个扇区。我们又找到了两个参数了。l 接着我们找 SAT , 目录流是紧接着 SAT 的,我们就可以通过找 SSAT的方法判断出哪里是 SAT。因为 SAT 记录的也是 SID。
5、和目录流记录的内容很不一样。我们顺着目录流往上找,因为 1556-1=1555 号扇区是目录流的起始扇区,那么 1555-1=1554 肯定是 SAT 的结束扇区,因为SAT 和目录流是紧接着的。这就是 1555-1=1554 号扇区的内容,大家可以看到这个记录的就是 SID后面的表项内容都是 FF FF FF FF 也就是说是空闲扇区。现在我们就要来确定 SAT 占用多少个扇区,如果 SAT 是连续存储的,那么我们顺着它的结束扇区慢慢往上找根据它内容的特殊性,就能确定 SAT 占用多少个扇区了。而且,SAT 的起始扇区前面一个扇区一般都是以 0 结束的扇区。前提就是 SAT 是连续的,不连续
6、的情况,我没遇到过,这里就不做讨论了。好的,我慢慢往上找,终于在 1543-1=1542 号扇区找到了 SAT 的起始扇区。现在我们的 SAT 起始扇区就确定了,因为这里的 SAT 是连续的,那么SAT 占用多少个扇区也就知道了。现在我们需要的参数都确定了下来了,就可以重建复合文档的文件头了。下面我们来总结一下找到的参数:1 SAT 占用扇区数 1555-1543+1=13 个扇区,起始扇区是 1543-1=1542号扇区;2 目录流的起始扇区是 1556 1 =1555 号扇区;3 SSAT 起始扇区是 1558 1 =1557 号扇区,大小是 1 个扇区;4 因为 SAT 只占用 13 个扇区,也就是说 MSAT 中只需要用 13 个表项来记录就行了,文件头中能记录 MAST 的前 109 个表项,所以文件头中就能放下 MSAT 的内容了,就不需要额外的扇区来存放 MSAT 了。所以MSAT 的起始扇区就是 FE FF FF FF 大小就是 00 00 00 005 以上参数确定了之后,最后一步就是修复 MSAT 的内容了。我们先把上述确定好的参数重写进文件头中。