MBR探析

1.标准MBR结构

[](https://img2018.cnblogs.com/blog/389208/201908/389208-20190826171130138-110891109.png)

硬盘的第一个扇区(前512字节)是主引导记录MBR,其中:
446个字节(偏移0x0000-偏移0x01BD):  MBR引导程序代码
64个字节(偏移0x01BE-偏移0x01FD):   分区表DPT,包含4个16字节的硬盘分区表参数
2个字节(偏移0x1FEH-偏移0x1FFH):    MBR签名,十六进制表示为“55AA”

2.DPT分区表

一行分区记录的各字段意义:
————————————————————————————————————————————————————————————
偏移      参数意义
0       80H为引导分区,00H为非引导分区
1 2 3       CHS开始位置 (Cylinder的高2位放在Sectors的高2位)
4       分区格式标志
5 6 7       CHS结束位置
8 9 10 11   本分区前已被占用扇区数(即该分区的LBA地址),
        对于扩展分区表内的分区记录,
        该值相对扩展分区首扇区。
12,13,14,15 本分区占用扇区数(即分区大小)
————————————————————————————————————————————————————————————
  • CHS

    磁头号由(1)字节8位表示,其范围(0 磁头-254 磁头)。
    扇区号由(2)字节低6位表示,其范围(1 扇区-63 扇区)。
    柱面号由(2)字节高2位 + (3)字节,共10位表示,其范围(0 柱面 - 1023 柱面)。
    当柱面号超过1023时,这10位依然表示成1023,需要注意。
    (5,6,7)字节含义同上。

    (8,9,10,11)字节
    如果是主分区表,则这4 个字节表示该分区起始逻辑扇区号与逻辑0扇区(0柱面,0磁头,1扇区)之差。
    如果非主分区表,则这4 个字节要么表示该分区起始逻辑扇区号与扩展分区起始逻辑扇区号之差,要么为63。

    扇区上的字节是按左边低位,右边高位的顺序排列的。
    所以在取值时,需要把字节再反一下,让高位字节在左边,低位字节在右边,
    这一点在读取逻辑起始扇区号和分区大小时需要注意。
    举个例子:第一项的逻辑起始扇区为(3F 00 00 00),转换为十进制前要先反一下字节顺序,
    为(00 00 00 3F)然后在转换为十进制,即63.
    同理分区大小为(3F 04 7D 00),先反为(00 7D 04 3F)再转换为十进制,即8193087

  • 逻辑扇区号LBA与CHS的相互转换:

    令L = 逻辑扇区号,C = 柱面号,H = 磁头号,S = 扇区号。
    每道扇区数 = 63
    每柱面磁头数 = 255
    每柱面扇区数 = 每道扇区数* 每柱面磁头数 = 63 × 255 = 16065

    柱面号下标从0开始。磁头号[0 -- 254],扇区号[1 -- 63]。
    逻辑扇区号下标也从0开始。
    (柱面,磁头,扇区)转换成逻辑扇区号的公式为:
    L = C×16065 + H ×63 + S - 1 ;
    比如(1柱面,1磁头,1扇区),其逻辑扇区号为:
    L = 1×16065 + 1×63 + 1 - 1 = 16128
    逻辑扇区号转换成(柱面,磁头,扇区) 公式为:
    C = L / 16065
    H = (L % 16065) / 63
    S = (L % 16065) % 63 + 1
    比如逻辑扇区号 16127:
    C = 16127 / 16065 = 1
    H = (16127 % 16065) / 63 = 0
    S = (16127 % 16065) % 63 + 1 = 63
    即(1柱面,0磁头,63扇区)

  • 逻辑分区的查找

    分区表链实际上相当于一个单向链表结构,所以只要找到了一个分区表就可以推导找出其后面所有分区表。
    不过该分区表前面的分区表就不好推导出来了。
    但令人高兴的是这个链表的头节点,也即主分区表的位置是固定的位于(0柱面, 0磁头, 1扇区)处,
    我们可以很轻易的找到它,然后把剩下的所有分区表一一找到。

  • 分区格式标志

    字节 分区格式标志

    00 = 分区未使用

    01 = DOS主分区 FAT12

    02 = XENIX root

    03 = XENIX usr

    04 = DOS主分区 FAT16 (最大32M)

    05 = DOS扩展分区 FAT16

    06 = DOS主分区 FA16 big

    07 = NTFS / HPFS (Hight Performace File System, 比如 OS/2)

    08 = AIX

    09 = AIX bootable

    0a = OS/2 Boot Manag

    0b = WIN95 FAT32

    0c = WIN95 FAT32 (LBA)

    0e = WIN95 FAT16 (LBA)

    0f = WIN95 扩展分区 (LBA)

    10 = OPUS

    11 = FAT12

    12 = Compaq diagnost

    14 = FAT16 (32MB) 隐藏分区

    16 = FAT16 big 隐藏分区

    17 = NTFS / HPFS 隐藏分区

    18 = AST Windows swap

    1b = WIN95 FAT32 隐藏分区

    1c = WIN95 FAT32 (LBA) 隐藏分区

    1e = WIN95 FAT16 (LBA) 隐藏分区

    24 = NEC DOS

    39 = Plan 9

    3c = Partition Magic

    40 = Venix 80286

    41 = PPC PReP boot

    42 = SFS

    4d = QNX4.x

    4e = QNX4.x 2nd partition

    4f = QNX4.x 3rd partition

    50 = OnTrack DM

    51 = OnTrack DM6 Aux

    52 = CP/M

    53 = OnTrack DM6 Aux

    54 = OnTrack DM6

    55 = EZ-Drive

    56 = Golden Bow

    5c = Priam Edisk

    61 = Speed Stor

    63 = GNU HURD or SYS

    64 = Novell NetWare

    65 = Novell

    70 = Disk Secure Mult

    75 = UNIX PC/IX

    80 = aktiv (old Minix)

    81 = Booten von Laufwerk D: (不一定可行, 需要MBR引导程序支持 (Minix / old LINUX))

    82 = LINUX swap

    83 = LINUX

    84 = OS/2 hidden C:

    85 = LINUX extended

    86 = NTFS volume set

    87 = NTFS volume set

    8e = LINUX LVM

    93 =http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4179030 Amoebla

    94 = Amoebla BBT

    9f = BSD/OS

    a0 = IBM Thinkpad hidden

    a5 = BSD/386

    a6 = Open BSD

    a7 = NeXT STEP

    b7 = BSDI fs

    b8 = BSDI swap

    c1 = DRDOS/sec (FAT32)

    c4 = DRDOS/sec (FAT32(LB))

    c6 = DRDOS/sec (FAT16(LB))

    c7 = Syrinx

    da = Non-Fs data

    db = CP/M / CTOS / .

    de = Dell Utility

    e1 = DOS access

    e3 = DOS R/o

    e4 = Speed Stor

    eb = BeOS fs

    ee = EFI GPT

    ef = EFI (FAT12/16/32)

    f1 = Speed Stor

    f2 = DOS secondary

    f4 = Speed Stor

    fd = LINUX raid auto

    fe = LANstep

    ff = BBT

3.示例

格式化sdb,找到各分区其中分区表的部分,如下:
========================================================================
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          10       80293+  83  Linux
/dev/sdb2              11          22       96390    b  W95 FAT32
/dev/sdb3              23         150     1028160    5  Extended
/dev/sdb5              23          30       64228+   6  FAT16
/dev/sdb6              31         100      562243+  82  Linux swap / Solaris
/dev/sdb7             101         150      401593+   7  HPFS/NTFS
/dev/sdb4   *         151         261      891607+  83  Linux

========================================================================

sdb: 0001 0100 83fe 3f09 3f00 0000 4b73 0200
0000 010a 0bfe 3f15 8a73 0200 0cf1 0200
0000 0116 05fe 3f95 9664 0500 8060 1f00
8000 0196 83fe 7f04 16c5 2400 af35 1b00

sdb3 0001 0116 06fe 3f1d 3f00 0000 c9f5 0100
0000 011e 05fe 3f63 08f6 0100 c628 1100

MBR:
sdb1:[ (00) (01 01 00) (83) (fe 3f 0b) (3f 00 00 00) (4b 73 02 00) ]
(00):表示该分区(sdb1)为非活动分区
(01 01 00):表示sdb1的起始扇区为(0柱面,1磁头,1扇区)
(83):表示文件系统为ext系列
(fe 3f 0b):表示sdb1的结束扇区为 fe(16)=254(10) 3f(16)=00111111(2) 0b(16)=00001011(2)
磁头号:254;
扇区号:111111(2)=63;
柱面号:00 00001011(2)=7;
所以该分区结束扇区为(7柱面,254磁头,63扇区)。
(3f 00 00 00):反向,(00 00 00 3F)Hex = 63,sdb1起始逻辑扇区与逻辑0扇区号之差。
表示sdb1前面已有63个扇区,这63个扇区为系统隐藏扇区。
(4b 73 02 00):反向,(00 02 73 4B)Hex = 160587,表明C盘有160587个扇区。
即(0柱面,1磁头,1扇区)至(7柱面,254磁头,63扇区)共有160587个扇区。

sdb2:[ 0000 010a 0bfe 3f15 8a73 0200 0cf1 0200 ]
sdb3:[ (00) (00 01 16) (05) (fe 3f 95) (96 64 05 00) (80 60 1f 00) ]
(00):表示该分区为非活动分区
(00 01 16):表示sdb3的起始扇区为(22柱面,0磁头,1扇区)
(05):表示该分区为扩展分区
(fe 3f 95):表示sda3的结束扇区为 fe(16)=254 3f(16)=00 111111(2) 95(16)=1001 0101(2)
磁头号:254;
扇区号:111111(2)=63;
柱面号:00 1001 0101(2)=149;
所以该分区结束扇区为(149柱面,254磁头,63扇区)。
(96 64 05 00):反向,00 05 64 96(16) = 353430
这是真实准确的,我一般都用这一项来定位分区起点。
(80 60 1f 00):反向,00 1f 60 80(16) = 2056320
可以推导出扩展分区的结束位置:353430 + 2056320 = 2409750号扇区,即(149柱面,254磁头,63扇区)。

sdb4:[ (80) (00 01 96) (83) (fe 7f 04) (16 c5 24 00) (af 35 1b 00) ]
(16 c5 24 00):反向,00 24 c5 16(16) = 2409750 = 353430 + 2056320
(af 35 1b 00):反向,00 1b 35 af(16) = 1783215

1783215 + 2409750 = 4192965
(1783215 + 2409750) * 512= 2146798080
2147483648 - 2146798080 = 685568
685568/512 = 1339

sdb3 0001 0116 06fe 3f1d 3f00 0000 c9f5 0100
0000 011e 05fe 3f63 08f6 0100 c628 1100

dd if=/dev/sdb of=./sdb5 bs=512 count=1 skip=353430
dd if=/dev/sdb3 of=./sdb3 bs=512 count=1

SDB3:
sda5:[ 0001 0116 06fe 3f1d 3f00 0000 c9f5 0100 ]
(3f 00 00 00):反向,00 00 00 3f(16) = 63
(c9 f5 01 00):反向,00 01 f5 c9(16) = 128457

[ 0000 011e 05fe 3f63 08f6 0100 c628 1100 ]
(08f6 0100):反向,00 01 f6 08(16) = 128520 = 63 + 128457
(c628 1100):反向,00 11 28 c6(16) = 1124550

sdb6:[ 0001 011e 82fe 3f63 3f00 0000 8728 1100 ]
(3f 00 00 00):反向,00 00 00 3f(16) = 63
(87 28 11 00):反向,00 11 28 87(16) = 1124487 = 1124550 - 63

[ 0000 0164 05fe 3f95 ce1e 1300 b241 0c00 ]
(ce 1e 13 00):反向,00 13 1e ce(16) = 1253070 = 128520 + 1124550
(b2 41 0c 00):反向,00 0c 41 b2(16) = 803250

sdb7:[ 0001 0164 07fe 3f95 3f00 0000 7341 0c00 ]
(3f 00 00 00):反向,00 00 00 3f(16) = 63
(73 41 0c 00):反向,00 0c 41 73(16) = 803187 = 803250 - 63

[ 0000 0000 0000 0000 0000 0000 0000 0000 ]
1253070 + 803250 = 2056320

猜你喜欢

转载自www.cnblogs.com/ilinunix/p/11413672.html