ABAP顾问
分类:
2008-11-09 20:23:24
分区表结构分析及应用
白天振
1999.8
众所周知,硬盘的第一扇区(0柱0面1扇)包含了MBR(Master Boot Recorder主引导纪录)、分区表和结束标志55AA,区区512字节在硬盘中起着非常重要的作用。硬盘不能自举时,或找不到分区时,往往和这一部分有关。有一些程序还有可能破坏这一扇区,导致硬盘软故障,(比如臭名昭著的CIH)。MBR 若损坏可用FDISK /MBR 来恢复,结束标志55AA也很容易写上,相比之下,分区表就有点麻烦了,有鉴于介绍分区表的文章很少,且一般都是浅尝辄止,三言两语带过,没有作深入的分析,很多读者看完后还是一头雾水,更谈不上应用了,所以下面我就较详细的来谈一谈分区表的结构及其几个应用,以供大家参考。
一、分区表的结构:
分区表位于硬盘的0柱0面1扇区,以偏移为01BEH(注:本文以数后加H表示此数为十六进制,以B表示二进制,不加字母时表示十进制)开始的64个字节(其实,这一分区表应该叫做“主分区表”,大部分介绍分区表的文章就只介绍了这一部分,稍后我们就会看到,只研究这一部分是不够的),包含四个分区项,每个分区项16个字节(16*4=64)。假如我们只用DOS操作系统(即DOS、 WINDOWS系列)则只有前两项有用,第一项为主分区,第二项为扩展分区。下面我们以Seagate
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:
0E63:010E int 3
0E63:
-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
0E63:010E CC INT 3
-d 03b0 03ff ;察看内存的内容
0E63:03B0 00 00 00 00 00
⑴ ⑵
0E63:
⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻
0E63:03D0
⑻ ⑼ ⑽ ⑾ ⑿
0E63:03E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0E63:
说明:带下划线部分即为(主)分区表的前两项,⑴--⑹项即主分区之分区表,⑺--⑿项为扩展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:不能识别的操作系统;01:FAT12;02:XENIX;04:FAT16 且分区小于
如本例,C盘为FAT16且大于
⑷:分区结束地址(头、扇、柱),需注意的是,由于BIOS的原因,此处的头、扇、柱号和实际磁头数,柱面数并不一样,有一个转换的关系(因为此问题不是本文所讲重点,所以不再论述)。如:现在的硬盘大多为1—3个盘片即2—6个磁头。即第一字节应为2—6,实际上,此值在此硬盘上为FEH(即十进制的254)。而且由于扇区数和柱面数的差异:扇区数较小,用6位即可描述,而柱面数较大,一般大于FFH,即一个字节不能描述,所以,第二字节的低六位表示扇区号,而高二位放在第三字节的8位数前面,构成十位来表示柱面数。如:⑽中BFH=10111111B去掉前面两位10得111111B=3FH=63(扇区数),而0CH=00001100B,前面加上10得:1000001100B=20CH=524(柱面数)。
⑸:此分区起始相对扇区号(该分区前的扇区总数)。表示该分区之前共有多少扇区。采用高位在后,低位在前的表示方法。如:(
⑹:该分区所占用的扇区数,也采用高位在后,低位在前的表示方法。
为了使读者对这些数有一个整体的认识,而不是一盘散沙,我们把其中几项联系起来,并和硬盘的参数(C.H.S)相比较。首先,在BIOS中记下硬盘的各个参数(Cycle:柱面,Secter:扇区,Head:头。本例为:C:525;S:63;H:255)
1.因为一个柱面不能包含两个分区,即分区表必须位于0面。所以分区的大小必须是(每道扇区数*总的面数)的整数倍,否则就向上取到相同。这就是为什么我们分区时分出的实际大小和我们所键入的数字有时不同,如:在用Fdisk分区时,有时我们把C盘定为1000,而实际大小一般大于这个数。又因为每个当前分区的0面为分区表,实际分区起始于1面,所以(0E63:03BF)处必为“01” (0E63:
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+
以上几点在应用二中会有更明显的体现。
二、应用
1.制作或解开硬盘逻辑锁。
(注意:当硬盘用逻辑锁锁住时,软硬盘都不能启动,所以一定要准备充分再做,切切!!)
原理:
DOS3.0以后的DOS系列操作系统中,负责启动的IO.SYS文件中,有一个函数专门用来检测分区表,它要读出每一个所认识的分区,以初始化系统环境。如果把分区表中二表项设成一个循环链表,即C指向D,而D又指向C,形成一个无穷循环,此时若操作系统标识符⑶为DOS所认识的(如04、06等),且为软盘启动时(此时硬盘不能启动),则读到Z盘符时,就会出现一条“Warning:Logical drives past Z exist and will be ignored”信息而终止循环,并启动系统,但实际上只有C分区能用。若是DOS不能认识的操作系统标识符(如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:
1362:010E mov ax,301
1362:0111 mov bx,200
1362:0114 mov cx,2
1362:0117 mov dx,80
1362:
1362:
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=
1362:
-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:
1362:0210 mov ax,301
1362:0213 mov bx,2000
1362:0216 mov cx,1
1362:0219 mov dx,80
1362:
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:
1362:010E mov al,06
1362:0110 mov [
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:
1362:010E int 3
1362:
-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
1362:010E CC INT 3
-d 3b
1362:03B0 00 00 00 00 00
1362:
1362:03D0
1362:03E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1362:
-e
1362:
-e 3d1
1362:03D
-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
1362:010E CC INT 3
-q
重启,哈哈!现在软硬盘都不能启动了!!
解锁方法:
在BIOS中,将启动顺序设为A,C,然后用恢复盘启动,恢复完成后,系统会自动重启,此时,拿出恢复盘,系统便又能启动了。如是还不能,请用“应急盘”,重启后,拿出“应急盘”,用WINDOWS98启动盘启动后,再人工修复分区表即可。
如果你认为这一应用只是好玩的话,应用二就不仅仅是好玩的问题了,好,请看应用二!
2.恢复被CIH破坏的硬盘
在讲如何恢复之前,有必要讲一下扩展分区的分区表项。在文章的开头,我已经埋下了伏笔,说“只研究这一部分是不够的”可能有细心的读者已经想到这个问题了,即:D.E.F 这三个分区是如何划分的呢?分区表中也没有体现出来啊?好,现在我们就来看看他们到底是怎样划分的。
由主分区表的第二项:00 00
在这个扇区中,偏移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:
0000:01D0 41
0000:01E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0000:
仔细看一看,咦!原来又是一个分区表项,且有当前分区和扩展分区两项,算一算第一项分区的大小:1cadf6H=1879542个扇区≈
柱284、面0、扇1:
0000:01B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 01
0000:
0000:01D0 41
00002:01E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
0000:
柱380、面0、扇1:
0000:01B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 01
0000:
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:
我们再来看一看CIH是如何破坏硬盘的。通常,是按物理扇区的顺序,依次写入无用的信息。即先破坏掉主引导纪录MBR,然后破坏C分区的DBR(DOS引导纪录)à 文件分配表(FAT)à根目录à数据区。通常在破坏过程中WINDOWS就会死机,所以D分区及以后的分区一般不会被破坏,我们只要修复主分区表,扩展分区数据就可以读出来。因为C分区的文件分配表和根目录可能已被破坏,所以C分区完全恢复的希望不大。