Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7130592
  • 博文数量: 655
  • 博客积分: 10264
  • 博客等级: 上将
  • 技术积分: 8278
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-04 17:47
个人简介

ABAP顾问

文章分类

全部博文(655)

文章存档

2017年(2)

2014年(8)

2013年(3)

2012年(2)

2011年(18)

2010年(102)

2009年(137)

2008年(274)

2007年(134)

分类:

2008-11-09 20:23:24

分区表结构分析及应用

白天振

1999.8

众所周知,硬盘的第一扇区(001扇)包含了MBR(Master Boot Recorder主引导纪录)、分区表和结束标志55AA,区区512字节在硬盘中起着非常重要的作用。硬盘不能自举时,或找不到分区时,往往和这一部分有关。有一些程序还有可能破坏这一扇区,导致硬盘软故障,(比如臭名昭著的CIH)MBR 若损坏可用FDISK /MBR 来恢复,结束标志55AA也很容易写上,相比之下,分区表就有点麻烦了,有鉴于介绍分区表的文章很少,且一般都是浅尝辄止,三言两语带过,没有作深入的分析,很多读者看完后还是一头雾水,更谈不上应用了,所以下面我就较详细的来谈一谈分区表的结构及其几个应用,以供大家参考。

一、分区表的结构:

分区表位于硬盘的001扇区,以偏移为01BEH(注:本文以数后加H表示此数为十六进制,以B表示二进制,不加字母时表示十进制)开始的64个字节(其实,这一分区表应该叫做“主分区表”,大部分介绍分区表的文章就只介绍了这一部分,稍后我们就会看到,只研究这一部分是不够的),包含四个分区项,每个分区项16个字节(16*4=64)。假如我们只用DOS操作系统(即DOS WINDOWS系列)则只有前两项有用,第一项为主分区,第二项为扩展分区。下面我们以Seagate 4.3G硬盘为例(共4个分区、主分区C 逻辑分区D,E,F),来看一看分区表的具体结构,如果你有Norton 8.0 最好,直接用diskedit.exe 来看即可,若没有,只好跟我用Debug 一步一步来操作啦

C:\WINDOWS>debug      注:斜体字为输入部分,下同

-a

0E63:0100 mov ax,201             0E63称为段地址,与你的值可能有所不同

0E63:0103 mov bx,200

0E63:0106 mov cx,1

0E63:0109 mov dx,80

0E63:010C int 13      ; 读出硬盘001扇区的内容。

0E63:010E int 3    

0E63:010F

-g=100       ;执行程序

AX=0050  BX=0200  CX=0001  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000

DS=0E63  ES=0E63  SS=0E63  CS=0E63  IP=010E   NV UP EI PL NZ NA PO NC

0E63:010E CC            INT     3

-d 03b0 03ff    ;察看内存的内容

0E63:03B0  00 00 00 00 00 2C 44 63-A5 EA A5 EA 00 00 80 01   .....,Dc........

                                                                                     

0E63:03C0  01 00 06 FE 3F A6 3F 00-00 00 A8 EF 28 00 00 00   ....?.?.....(...

                                                                    

0E63:03D0  01 A7 05 FE BF 0C E7 EF-28 00 E6 C1 57 00 00 00   ........(...W...

                                                                                    

0E63:03E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

0E63:03F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA   ..............U.

说明:带下划线部分即为()分区表的前两项,⑴--⑹项即主分区之分区表,⑺--⑿项为扩展DOS分区,两个表项的对应字节所表示的意义是一样的,其各项意义为:

⑴:引导指示符(80:活动分区;00:非活动分区)在用FDISK时,我们说“要激活一个分区”就是指的这一项。此处表示第一分区即为活动分区(即可以由此分区来引导系统)。如在启动时出现“Not found any [active partition]in HDD . DISK BOOT FAILURE ,INSERT SYSTEM DISK AND PRESS ENTER (在硬盘上没有发现活动分区。启动失败,插入系统盘并按回车) ”指示,则说明没有任何激活分区,可以用fdisk的第二项功能(Set active partition)来激活。一般来说,活动分区有且只能有一个。

⑵:该分区的起始地址。这三个字节依次表示磁头号、扇区号和柱面号,DOS3.0以后的DOS操作系统在启动时都要读取此值,以初始化系统环境。以⑵为例,01 01 00 即表示此分区开始0()1扇、0柱。(有时,我们称“头”为“面”)

⑶:操作系统指示符。其数值含义为:00:不能识别的操作系统;01FAT1202XENIX04FAT16 且分区小于32M05:扩展DOS分区;06FAT16且分区大于32M(BIGDOS分区)0BFAT3265Novell分区。

如本例,C盘为FAT16且大于32M,所以⑶的值为06为第二分区项--扩展DOS分区的操作系统指示符,所以值为05

:分区结束地址(头、扇、柱),需注意的是,由于BIOS的原因,此处的头、扇、柱号和实际磁头数,柱面数并不一样,有一个转换的关系(因为此问题不是本文所讲重点,所以不再论述)。如:现在的硬盘大多为13个盘片即26个磁头。即第一字节应为26,实际上,此值在此硬盘上为FEH(即十进制的254)。而且由于扇区数和柱面数的差异:扇区数较小,用6位即可描述,而柱面数较大,一般大于FFH,即一个字节不能描述,所以,第二字节的低六位表示扇区号,而高二位放在第三字节的8位数前面,构成十位来表示柱面数。如:⑽中BFH=10111111B去掉前面两位10111111B=3FH=63(扇区数),0CH=00001100B,前面加上10得:1000001100B=20CH=524(柱面数)

⑸:此分区起始相对扇区号(该分区前的扇区总数)。表示该分区之前共有多少扇区。采用高位在后,低位在前的表示方法。如:(3F 00 00 00) 换成我们所熟悉的记数方法,即是:(0000003F)H=63,即从后按字节向前写。

⑹:该分区所占用的扇区数,也采用高位在后,低位在前的表示方法。

为了使读者对这些数有一个整体的认识,而不是一盘散沙,我们把其中几项联系起来,并和硬盘的参数(C.H.S)相比较。首先,在BIOS中记下硬盘的各个参数(Cycle:柱面,Secter:扇区,Head:头。本例为:C:525S:63H:255)

1.因为一个柱面不能包含两个分区,即分区表必须位于0面。所以分区的大小必须是(每道扇区数*总的面数)的整数倍,否则就向上取到相同。这就是为什么我们分区时分出的实际大小和我们所键入的数字有时不同,如:在用Fdisk分区时,有时我们把C盘定为1000,而实际大小一般大于这个数。又因为每个当前分区的0面为分区表,实际分区起始于1面,所以(0E63:03BF)处必为“01 (0E63:03C0)的低六位必为“01”而(0E63:03CE)处必为00

2.两分区相邻,所以,此分区的结束柱面加1必为下一分区的开始柱面号。即C分区的结束柱面号(中第三字节)为A6H,扩展分区的开始柱面号((⑻中的第三字节)A6H+1=A7H

3.根据最后分区结束的面、柱、扇号,应能算出此硬盘的(H.C.S)参数,如本例,⑽表示最后分区的面、扇、柱号,所以共有FEH+1=FFH=255个面(加1是因为面开始于0,下同),BFH取低六位=111111B=63所以每道有63扇,0CH=00001100B 加上BFH的高二位,得1000001100B=20CH=524,524+1=525,所以,共有25个柱面。与BIOS中的参数是不是一样?

4.理论总扇区数=C*H*S=525*255*63=80B1CDH,应该等于⑾+⑿,再看⑾+=28EFE7H+57C1E6H=80B1CDH,正好!

以上几点在应用二中会有更明显的体现。

 

二、应用

1.制作或解开硬盘逻辑锁。

(注意:当硬盘用逻辑锁锁住时,软硬盘都不能启动,所以一定要准备充分再做,切切!!)

原理:

DOS3.0以后的DOS系列操作系统中,负责启动的IO.SYS文件中,有一个函数专门用来检测分区表,它要读出每一个所认识的分区,以初始化系统环境。如果把分区表中二表项设成一个循环链表,即C指向D,而D又指向C,形成一个无穷循环,此时若操作系统标识符DOS所认识的(如0406等),且为软盘启动时(此时硬盘不能启动),则读到Z盘符时,就会出现一条“WarningLogical drives past Z exist and will be ignored”信息而终止循环,并启动系统,但实际上只有C分区能用。若是DOS不能认识的操作系统标识符(如00)则它就会一直读下去,状同死机,而不管是软盘还是硬盘启动。这就实现了“硬盘锁”的功能。所以,我们只要把⑶改成“00,然后再做一个链表就可以了。怎么做链表呢?只要把两分区项的柱、扇号改成一样就可以了。不明白为什么?没关系,在下一个应用中,我会再提一下这个问题的。

实现方法:

强烈建议:在做锁之前,请先把分区表备份在第二扇区,以备后用。为了安全,强烈建议请不要忽略这一步。否则,后果自负!!

C:\dos>debug

-a 100

1362:0100 mov ax,201

1362:0103 mov bx,200

1362:0106 mov cx,1

1362:0109 mov dx,80

1362:010C int 13      ;读第一扇区到ES:200

1362:010E mov ax,301

1362:0111 mov bx,200

1362:0114 mov cx,2

1362:0117 mov dx,80

1362:011A int 13      ;将读出的内容写到第二扇区

1362:011C int 3

1362:011D

-g=100      ;执行程序

AX=0001  BX=0200  CX=0002  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000

DS=1362  ES=1362  SS=1362  CS=1362  IP=011C   NV UP EI PL NZ NA PO NC

1362:011C CC            INT     3

-q         ;退出debug

你可以用DEBUG看一看是否已备份好。

然后,做一个“恢复盘”,即把备份的分区表再恢复回去,以解开逻辑锁。找一个质量好些的软盘,打开写保护,写上“恢复盘”,插入软驱,然后运行以下程序。

C:\WINDOWS>debug

-a 100

1362:0200 mov ax,201

1362:0203 mov bx,2000

1362:0206 mov cx,2

1362:0209 mov dx,80

1362:020C int 13       ;读出第二扇区

1362:0210 mov ax,301

1362:0213 mov bx,2000

1362:0216 mov cx,1

1362:0219 mov dx,80

1362:021C int 13       ;将读出的内容写到第一扇区

1362:021E jmp ffff:0000

1362:0223

-w 100 0 0 1

-q

为了防止万一,最好再做一个“应急盘”,当“恢复盘”不好用时,使用此盘来破坏链表,以手动恢复分区表。

C:\dos>debug

-a 100

1362:0100 mov ax,201

1362:0103 mov bx,2000

1362:0106 mov cx,1

1362:0109 mov dx,80

1362:010C int 13      ;读第一扇区到ES:2000

1362:010E mov al,06

1362:0110 mov [21c2],al

1362:0113 mov al,0

1362:0115 mov [21d2],al     ;破坏链表

1362:0118 mov ax,301

1362:011B mov bx,2000

1362:011E mov cx,1

1362:0121 mov dx,80

1362:0124 int 13       ;将修改后的数据写回第一扇区

1362:0126 jmp ffff:0000

1362:012B

-w 100 0 0 1

-q

 准备工作完成后,我们就可以来做逻辑锁了:

C:\dos>debug

-a 100

1362:0100 mov ax,201

1362:0103 mov bx,200

1362:0106 mov cx,1

1362:0109 mov dx,80

1362:010C int 13

1362:010E int 3

1362:010F

-g=100

AX=0050  BX=0200  CX=0001  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000

DS=1362  ES=1362  SS=1362  CS=1362  IP=010E   NV UP EI PL NZ NA PO NC

1362:010E CC            INT     3

-d 3b0 l 50

1362:03B0  00 00 00 00 00 2C 44 63-A5 EA A5 EA 00 00 80 01   .....,Dc........

1362:03C0  01 00 06 FE 3F A6 3F 00-00 00 A8 EF 28 00 00 00   ....?.?.....(...

1362:03D0  01 A7 05 FE BF 0C E7 EF-28 00 E6 C1 57 00 00 00   ........(...W...

1362:03E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

1362:03F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA   ..............U.

-e 3c2

1362:03C2  06.02

-e 3d1

1362:03D1  A7.00

-a 100

1362:0100 mov ax,301

1362:0103

-g=100

AX=0001  BX=0200  CX=0001  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000

DS=1362  ES=1362  SS=1362  CS=1362  IP=010E   NV UP EI PL NZ NA PO NC

1362:010E CC            INT     3

-q

重启,哈哈!现在软硬盘都不能启动了!!

 

解锁方法:

BIOS中,将启动顺序设为A,C,然后用恢复盘启动,恢复完成后,系统会自动重启,此时,拿出恢复盘,系统便又能启动了。如是还不能,请用“应急盘”,重启后,拿出“应急盘”,用WINDOWS98启动盘启动后,再人工修复分区表即可。

 

 

如果你认为这一应用只是好玩的话,应用二就不仅仅是好玩的问题了,好,请看应用二!

2.恢复被CIH破坏的硬盘

在讲如何恢复之前,有必要讲一下扩展分区的分区表项。在文章的开头,我已经埋下了伏笔,说“只研究这一部分是不够的”可能有细心的读者已经想到这个问题了,即:D.E.F 这三个分区是如何划分的呢?分区表中也没有体现出来啊?好,现在我们就来看看他们到底是怎样划分的。

由主分区表的第二项:00 00 01 A7 05 FE BF 0C E7 EF-28 00 E6 C1 57 00  我们可以看出扩展分区的开始柱面为A7H=167,我们现在就来看一看柱167、面0、扇区1里面到底有些什么(程序略):

在这个扇区中,偏移01BE之前都是0,如下:(0000:0000—0000:01AF省略,下同)

0000:01B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 01  

0000:01C0  01 A7 0B FE 7F 1B 3F 00-00 00 F6 AD 1C 00 00 00

0000:01D0  41 1C 05 FE 7F 7B 35 AE-1C 00 60 88 17 00 00 00

0000:01E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  

0000:01F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA 

仔细看一看,咦!原来又是一个分区表项,且有当前分区和扩展分区两项,算一算第一项分区的大小:1cadf6H=1879542个扇区917M正好是D盘的大小,顺藤摸瓜,再往下找:

284、面0、扇1

0000:01B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 01  

0000:01C0  41 1C 0B FE 7F 7B 3F 00-00 00 21 88 17 00 00 00 

0000:01D0  41 7C 05 FE BF 0C 95 36-34 00 51 8B 23 00 00 00

00002:01E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  

0000:01F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA 

380、面0、扇1

0000:01B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 01  

0000:01C0  41 7C 0B FE BF 0C 3F 00-00 00 12 8B 23 00 00 00 

0000:01D0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00

0000:01E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  

0000:01F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA 

  

我们再来看一看CIH是如何破坏硬盘的。通常,是按物理扇区的顺序,依次写入无用的信息。即先破坏掉主引导纪录MBR,然后破坏C分区的DBR(DOS引导纪录)à 文件分配表(FAT)à根目录à数据区。通常在破坏过程中WINDOWS就会死机,所以D分区及以后的分区一般不会被破坏,我们只要修复主分区表,扩展分区数据就可以读出来。因为C分区的文件分配表和根目录可能已被破坏,所以C分区完全恢复的希望不大。

阅读(4473) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

qdbarry2008-11-21 19:31:56

NO~~这是我九几年的时候写的

chinaunix网友2008-11-21 19:04:10

白大哥,专职搞BASIS了?