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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章