易码技术论坛

 找回密码
 加入易码
搜索
查看: 219477|回复: 4

久病成医----手工分析硬盘分区表杂谈

[复制链接]
发表于 2005-6-17 09:19:00 | 显示全部楼层
是哪个多事的版主给这帖子加的精??!!!
正合我意啊~
[em07][em07]
发表于 2005-7-1 22:57:00 | 显示全部楼层
岂止应该加精,下载下来存档,灭哈哈……
发表于 2005-7-3 11:12:00 | 显示全部楼层
看来小子那个硬盘荡掉后的求助贴是真D,浴血重生啊...
发表于 2005-7-9 08:56:00 | 显示全部楼层
把鲜花给老大.
 楼主| 发表于 2005-6-16 15:59:30 | 显示全部楼层 |阅读模式
哈哈,大家还好吗?想死你们了!我是零壹空,就是以前的空小子呀!很就没上网了,这几天都不会打字了,而且硬盘又遭到破坏了,但是最后终于修复了,却用了一天的时间。咳咳~~~所谓久病成医(其实只病了两次),所以在下打算将这次的经验总结出来,为的是让大家不再为这个烦恼,或是当做了解吧!

题外话:对待硬盘人们儿,我个人将他(她)们分为这几种:
  1.最潇洒的:硬盘里的数据都无关紧要,被击垮了好办,来TMD三步曲:重分区;格式化;装系统。全部搞定!记得以前我就是这种人!
  2.有条件的:A类---我某某亲戚朋友有个完全跟我相同的硬盘,这边坏了怕个鸟,将那边的重新分成象这边原来的样子,主引导扇区什么的全部复制过来,数据全部恢复,羡慕吧~~
       B类---我某某亲戚朋友是开硬盘厂的,所以说我硬盘上的数据恢复概率是:%99。更羡慕吧~~
       毕竟是有条件的人才可以这么做啊~~~
  3.顶尖高手:总有办法的......(要努力往这边靠)
  4.细心的人:什么都备份得好好的,什么都不用怕(要向这样的人学习)
  5.临时抱佛脚(我们这里喜欢说粗的---“屎出的时候才挖粪坑”):这种人比较多,而且他们不备份分区表的原因是:不相信软盘。就好比我的软驱,再好再贵的软盘进了它肚子就报销了!这样的话备份不备份都是一个样。到了遇难的时候就~~~不用说了,就象我一样。
  ......
  不管怎么样,哪种人(除了坏人)都会有好的结局的,所以没有必要寻死寻活的。(噢~~不小心说到自己了)

        ===============第一步:基本功修炼!===============
看下面这个表:



这就是主引导扇区,分为三部分:
一.表中红色80以上部分为主引导程序(446字节),它主要用来检查是否出错,有兴趣的朋友可以反汇编来看看。
可以看到第一部分中有:Invalid partition table.Error loading operating system,所以黑屏幕看到这些数据就表明分区表有错误了。

二.黄色部分包括红色80就是我们所说的硬盘分区表了(64字节)。最难修复的就是它!
它分为4个表项,每个表项16字节,最后两个表项一般都为00。主要是前面两个表项:

第1个字节:自举标志----80h表示可自举(活动)分区;00h表示不可自举分区
第2个字节:该分区的开始磁头号
第3个字节:低6位表示该分区的开始扇区号
第4个字节:将第三个字节的高2位接到这里,共10位,表示该分区的开始柱面号
第5个字节:分区的格式类型(如FAT32)
第6---7个字节:该分区的结束磁头号,扇区号,柱面号,表示方式同第2---4个字节一样
第9---12:该分区的相对扇区号(也叫做隐含扇区数)
第13--16:该分区所占总扇区数

下面一步步总结固定跟有规律可得的地方:
如果C区是系统盘(可自举),那么第一个字节就是:80
我们知道0磁1扇0柱已经存放了主引导扇区,就是上面那个图表,共512字节。那么真正的分区开始就从下一个扇区开始,既是1磁1扇0柱开始,这基本是固定的。
所以接下来的数据是:01 01 00
接下来是0B表示FAT32(其他的分区格式类型需要改变)。
接下来就是结束CHS了,因为不同的分区方式(这里既是C区大小不同),所以这里的数据也不同,但是由于不管怎么样,每个分区的结束磁头号必须是总磁头号-1,结束扇区号是最大扇区号,柱面号就是不定的了。这里那我的硬盘来举例:FE 7F FD
接下来是相对扇区号,固定的3F 00 00 00
接下来是C区所占的扇区总数,所以是不固定的,但有个规律:扩展分区开始逻辑扇区号-$3F(隐含扇区数)
第一个表项就这么分析完毕,它是描述C区的。
第二个表项开始:
第一个字节就是:00(不自举)
接下来是扩展分区开始磁头号,是固定的:00
接下来是扩展分区的开始扇区号,低6位固定的:XX000001(二进制)
接下来是扩展分区的开始柱面号,不固定但有规律:主分区(C区)的结束柱面号+1
接下来是扩展分区的开始逻辑扇区号,不固定但有规律:就是D区分区表所在的扇区号(Partition Table Sector)它等于C区所占的扇区总数-$3F
接下来是扩展分区所占的扇区总数,不固定但是有规律:C区所占的扇区+其隐含扇区数+D区所占的扇区+其隐含扇区数,既是:C区所占的扇区+D区所占的扇区+3F*2

好了,根据上面的固定项和规律,要修复这个表就变得容易多了。这些固定项和规律真的很重要。

三.55 AA部分(2字节),它跟前面的红色80都是标志,许多修复工具就只能修复这些固定的东西却不能分析其它,这就是为什么有时候要手工修复的原因。


        ===============第二步:实战===============
现在我要说的是分区表被破坏了,而且条件最差的时候怎样恢复硬盘数据。
下面就以我的经历做为感性材料:
我的硬盘:迈拓20G,分C区(4GB),D区(8GB),E区(8GB),C区用来装系统,CHS分别为:39704,255,63

一天,死机,重启,硬盘狂读,画面却停在黑屏上。用光盘(我从不用软盘)启动到DOS,一些基本的处理不凑效。重装系统。装完发现只剩下C,D区了,系统要求D区要格式化。

开始恢复原来的分区表,KV3000(网上到处都有,大多数驱动光盘也有)可以帮您的忙,查看主引导扇区及其他,你会DEBUG的话也可以用DEBUG。


进入KV3000主界面--》按F6,看到了主引导扇区表,呆会儿要修改它了,当前的分区表呢,不相信软盘的我,用手抄起来,存放好。
80 01 01 00      0B FE 7F FD     3F 00 00 00     38 04 7D 00
00 00 41 FE      0F FE FF FE     77 04 7D 00     09 AA E5 01
进入KV3000主界面--》按F6--》按F6--》按F2:
       Total sector      Total bytes(这项基本上没有用)    Partition  Table  Sector
D:     000016386337      008389753344                     000008193150
E:     000015438402      007904461824                     000024579450
记下这个表。

进入KV3000主界面--》按F6--》按F3:
输入D区的Partition  Table  Sector(000008193150)发现最下面一个表,就是D区的Partition  Table。说明Partition  Table  Sector是没有错的了,那如果错了呢?回答是:具体情况具体分析。说真的,一个硬盘这么大,哪里都可能错,我在这里不能面面俱到,包括下面的①。若您真的碰到具体情况,请要我这个菜鸟医生帮帮您(好大口气呀)。

好了,我们开始逐个验证,可以断定80 01 01 00没有错,0B也没有错,FE  7F  FD错了吗?不知道,管它呢,先放着,我们做个记号为①!3F 00 00 00没有错了,C区所占的扇区总数38 04 7D 00($7D0438),它是否正确呢?利用上面的式子:扩展分区开始逻辑扇区号-3F《=====》000008193150-63=8193087($7D043F)得出的结果说明它是错的,改回来。一个表项分析结束。

我们再看扩展分区开始CHS---00 41 FE,如果说①是正确的,那么它肯定就正确了。0F是扩展分区类型,正确。(05好象也正确)接下来是扩展分区的开始逻辑扇区号77 04 7D 00,因为前面的C区所占的扇区总数都错了,而它等于哪个错的C区所占的扇区总数+$3F,那么肯定也错了,用正确C区所占的扇区总数+$3F,然后颠倒后写入。最后是扩展分区所占的扇区总数09 AA E5 01($1E5AA09),它是否正确呢?公式一算,又是错的,改回来。

到这里我的分区表就算修复了,最上面图表的黄色就是正确的了,但是很多人遇到的不一定就是这样的错误呀,比如DBR,D区Partition  Table,E区Partition  Table等等。但是我主要是想让一些不清楚的人掌握基本技巧,起抛砖引玉之用。具体灵活处理还要大家进一步修行。有什么问题可以在此贴大大的讨论。有什么错误直接指出。

提醒:如果真的不想那么辛苦的话,现在赶紧备份吧。用本子抄起来也行。够牛的用背也行。

下面是额外的,如果你嫌一些工具罗嗦,就自己写吧,在下开了个头,可以自己加其他功能!




#include<stdio.h>
#include<bios.h>

int main()
{

int result;
char buf[512];
FILE * fp;

       result=biosdisk(2,0x80,0,0,1,1,buf);
       if(! result)
         {

              if((fp=fopen("MBR","wb+")) == NULL)
                {
                     printf("不能创建文件: MBR\n");
                     exit(1);
                }
              fwrite(buf,1,512,fp);
              fclose(fp);
              printf("主引导扇区导出成功\n");

         }
       else
        {
              printf("主引导扇区导出失败\n");
              exit(1);
         }

       result=biosdisk(2,0x80,1,0,1,1,buf);
       if(! result)
         {

              if((fp=fopen("DBR","wb+")) == NULL)
                {
                     printf("不能创建文件: DBR\n");
                     exit(1);
                }
              fwrite(buf,1,512,fp);
              fclose(fp);
              printf("系统引导扇区导出成功\n");
         }
       else
        {
              printf("系统引导扇区导出失败\n");
              exit(1);
         }
       return 0;
}


好久没有写东西了,很累!给朵鲜花吧。

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2021-9-28 10:41 , Processed in 0.019665 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表