【教學】MBR 主啟動磁區剖析

顯示結果從第 1 筆 到 2 筆,共計 2 筆
  1. #1
    進階會員
    註冊日期
    2000-10-27
    討論區文章
    505

    【教學】MBR 主啟動磁區剖析

    MBR (Master Boot Record) 主啟動磁區剖析

    --------------------------------------------------------------------------------

    了解開機流程:

    在 IBM PC 相容系統上,電腦開機時第一個被執行的程式即是所謂的 BIOS (Basic Input/Output System),BIOS 指的其實是一顆 ROM IC (Read-Only Memory 唯讀記憶體 ), 堶捫N錄了提供電腦基本操作的服務程式,這種儲存於唯讀記憶體中的程式稱之為 Firmware (韌体)。

    當 BIOS 開始執行時, 首先會對系統進行自我檢測 (POST, Power-On Self Test) 以確定硬體設備可以正常動作,當開機自我檢測結束時 BIOS 將嘗試讀入軟碟的第一個磁區 (Boot Sector 啟動磁區)。若沒有軟磁則嘗試讀入硬碟的第一個磁區 (Master Boot Record 主啟動磁區,一般簡稱 MBR) 。 MBR 將會被戴入到記憶體 0000:7C00 的位置開始執行,而後再戴入由作業系統提供的開機磁區( Boot Sector ),進入作業系統。
    PS. 新的 BIOS 可以改變開機順序不由軟碟啟動,可以從直接硬碟啟動、光碟啟動、甚至由 USB 設備啟動。

    在標準狀況下:

    電腦開機→BIOS→POST→軟碟啟動磁區→硬碟主啟動磁區(MBR)->Boot Sector->OS


    --------------------------------------------------------------------------------

    MBR 結構:

    MBR 指的是硬碟機最開頭的第一個磁區,位於硬碟第 0 面,第 0 軌,第 1 磁區的位置。每個磁區為 512 Bytes。

    我們可以透過 BIOS 提供的 INT 13h 中斷服務常式來讀寫 MBR 磁區,如:

    語法:
        MOV AX,0201h
        MOV BX,200h
        MOV CX,0001h
        MOV DX,0080h
        INT 13h
    這段程式可以將 MBR 磁區戴入到記憶體 200h 的位置。

    MBR 磁區大致上分為 3 個區域

    語法:
    ----------------------------  <-- 位移值 00H (0 Bytes)
    |                          |
    |                          |
    | Boot Partition Loader    |
    | 這一小段程式用來將可啟動 |
    | 的作業系統分割區戴入     |
    |                          |
    |                          |
    |                     -----|  <-- 位移值 1BEh (446 Bytes)
    |---------------------|    |
    | Partition Table          |
    | 硬碟分割表          -----|
    |                     |55AA|
    ----------------------------  <-- 位移值 200H (512 Bytes)
    1. 第一個區域是程式區,稱為 Boot Partition Loader, 也有人稱為 Pre-Loader 或 Pre-Boot。這一段小程式用來將可啟動的作業系統分割區戴入 (應該說戴入可啟動作業系統分割區的啟動磁區 Boot Sector),並將控制權交給啟動磁區。其範圍從 000h 到 1BDh,共 446 Bytes。
    因為這段程式區是除了 BIOS 之外最先被電腦戴入執行的區域 (不考慮軟碟),所以像是多重開機管理程式、開機型病毒、軟體式硬碟密碼鎖等程式,大多都是利用這個域區在工作。

    2. 第二個區域是資料區,即硬碟分割表所在區域。其範圍從 1BEh 到 1FDh,共 64 Bytes。
    這 64 Bytes 又劃分成四個區域,代表 4 個硬碟分割表,其範圍分別為

    語法:
    位移值 01BE ~ 01CD  <-- 第一分割表
    位移值 01CE ~ 01DD  <-- 第二分割表
    位移值 01DE ~ 01ED  <-- 第三分割表
    位移值 01EE ~ 01FD  <-- 第四分割表
    因為硬碟分割表區域容量只有 64 Bytes,只能切成 4 個分割表,這也是為什麼在使用 FDISK 時最多只能切出 4 個主分割 (Parmary Partition) 的原因 (擴充分割 Extended 也算是主分割的一種)。
    也因為 MBR 磁區位置固定在硬碟第 0 面,第 0 軌,第 1 磁區的位置,萬一不幸硬碟機第 0 軌 (指 MBR)發生實體損壞時,這顆硬碟就報癈了。即使硬碟機其它磁軌都是好的也是一樣,原因當然就是因為作業系統讀不到 Partition Table 的關係。

    3. 第三個區域只有 2 個 Bytes,位移值 1FE 固定 55h,位移值 1FF 則固定為 AAh。
    沒什麼太特殊的意義,55AA 只是讓 BPL 程式用來驗証是否為 MBR 磁區而已。

    一個完整的 MBR 磁區範例如下:

    語法:
    紅色部份為程式區
    藍色部份為第一分割表
    綠色部份為第二分割表
    桃紅色部份為第三分割表
    紫色部份為第四分割表
    亮綠色部份為MBR標記
    
    0000:7C00  33 C0 8E D0 BC 00 7C FB-50 07 50 1F FC BE 1B 7C   3.....|.P.P....|
    0000:7C10  BF 1B 06 50 57 B9 E5 01-F3 A4 CB BD BE 07 B1 04   ...PW........... 
    0000:7C20  38 6E 00 7C 09 75 13 83-C5 10 E2 F4 CD 18 8B F5   8n.|.u.......... 
    0000:7C30  83 C6 10 49 74 19 38 2C-74 F6 A0 B5 07 B4 07 8B   ...It.8,t....... 
    0000:7C40  F0 AC 3C 00 74 FC BB 07-00 B4 0E CD 10 EB F2 88   ..<.t...........
    0000:7C50  4E 10 E8 46 00 73 2A FE-46 10 80 7E 04 0B 74 0B   N..F.s*.F..~..t.
    0000:7C60  80 7E 04 0C 74 05 A0 B6-07 75 D2 80 46 02 06 83   .~..t....u..F...
    0000:7C70  46 08 06 83 56 0A 00 E8-21 00 73 05 A0 B6 07 EB   F...V...!.s.....
    0000:7C80  BC 81 3E FE 7D 55 AA 74-0B 80 7E 10 00 74 C8 A0   ..>.}U.t..~..t..
    0000:7C90  B7 07 EB A9 8B FC 1E 57-8B F5 CB BF 05 00 8A 56   .......W.......V
    0000:7CA0  00 B4 08 CD 13 72 23 8A-C1 24 3F 98 8A DE 8A FC   .....r#..$?.....
    0000:7CB0  43 F7 E3 8B D1 86 D6 B1-06 D2 EE 42 F7 E2 39 56   C..........B..9V
    0000:7CC0  0A 77 23 72 05 39 46 08-73 1C B8 01 02 BB 00 7C   .w#r.9F.s......|
    0000:7CD0  8B 4E 02 8B 56 00 CD 13-73 51 4F 74 4E 32 E4 8A   .N..V...sQOtN2..
    0000:7CE0  56 00 CD 13 EB E4 8A 56-00 60 BB AA 55 B4 41 CD   V......V.`..U.A.
    0000:7CF0  13 72 36 81 FB 55 AA 75-30 F6 C1 01 74 2B 61 60   .r6..U.u0...t+a`
    0000:7D00  6A 00 6A 00 FF 76 0A FF-76 08 6A 00 68 00 7C 6A   j.j..v..v.j.h.|j
    0000:7D10  01 6A 10 B4 42 8B F4 CD-13 61 61 73 0E 4F 74 0B   .j..B....aas.Ot.
    0000:7D20  32 E4 8A 56 00 CD 13 EB-D6 61 F9 C3 49 6E 76 61   2..V.....a..Inva
    0000:7D30  6C 69 64 20 70 61 72 74-69 74 69 6F 6E 20 74 61   lid partition ta
    0000:7D40  62 6C 65 00 45 72 72 6F-72 20 6C 6F 61 64 69 6E   ble.Error loadin
    0000:7D50  67 20 6F 70 65 72 61 74-69 6E 67 20 73 79 73 74   g operating syst
    0000:7D60  65 6D 00 4D 69 73 73 69-6E 67 20 6F 70 65 72 61   em.Missing opera
    0000:7D70  74 69 6E 67 20 73 79 73-74 65 6D 00 00 00 00 00   ting system.....
    0000:7D80  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
    0000:7D90  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
    0000:7DA0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
    0000:7DB0  00 00 00 00 00 2C 44 63-01 00 00 00 72 20 80 01   .....,Dc....r ..
    0000:7DC0  01 00 0B EF BF 1D 3F 00-00 00 A1 0B 7D 00 00 00   ......?.....}...
    0000:7DD0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
    0000:7DE0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
    0000:7DF0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA   ..............U.

    --------------------------------------------------------------------------------

    硬碟分割表的格式:

    每個分表佔 16 Bytes, 其意義如下:

    語法:
    ----------------------------------------------------------------------------
    |位移值|大小 | 說明                                                        |
    +------+-------------------------------------------------------------------+
    |  00  |Byte | BOOT ID - 若為可開機的分割區則為 80h ~ FFh, 否則為 00h。    |
    |      |     | 80h = C, 81h = D, 82h = E ... 以此類推                      |
    |      |     | 以 fdisk 來說,若第一顆硬碟的分割區設為 Active 則 ID = 80h。 |
    |      |     | 4 個分割表中, 只能有一個被設為可開機, 否則將會發生錯誤。    |
    +------+-----+-------------------------------------------------------------+
    |  01h |Byte | 此分割開始之磁頭編號                                        |
    +------+-----+-------------------------------------------------------------+
    |  02h |Byte | 此分割開始之磁區編號 (6 bits)                               |
    |      |     | 最高的 2 個 bits(bit6-7), 為磁柱編號的 bit8-9 	           |
    +------+-----+-------------------------------------------------------------+
    |  03h |Byte | 此分割開始之磁柱編號 (10 bits)                              |
    |      |     | bit8-9 放在位移值 02h 的 bit 6-7                            |
    +------+-----+-------------------------------------------------------------+
    |  04h |Byte | 作業系統識別碼                                              |
    |      |     |   00 None                                                   |
    |      |     |   01 DOS FAT-12 bits                                        |
    |      |     |   02 XENIX root                                             |
    |      |     |   03 XENIX usr                                              |
    |      |     |   04 DOS FAT-16 bits < 32M                                  |
    |      |     |   05 Extended                                               |
    |      |     |   06 DOS FAT-16 bits > 32M                                  |
    |      |     |   07 HPFS/NTFS                                              |
    |      |     |   08 AIX                                                    |
    |      |     |   09 AIX bootable                                           |
    |      |     |   0A OS/2 Boot Manager                                      |
    |      |     |   0B DOS FAT-32 bits (Int 13h extensions)                    |
    |      |     |   0C DOS FAT Cylinder > 1024 (Int 13h extensions)            |
    |      |     |   0E DOS FAT System (Int 13h extensions)                     |
    |      |     |   0F DOS BigExtended (Int 13h extensions)                    |
    |      |     |   20 SPF Boot manager                                       |
    |      |     |   40 Venix 80286                                            |
    |      |     |   41 PPC PReP Boot                                          |
    |      |     |   51 Novell                                                 |
    |      |     |   52 Microport                                              |
    |      |     |   63 GNU HURD                                               |
    |      |     |   64 Novell Netware                                         |
    |      |     |   65 Novell Netware                                         |
    |      |     |   75 PC/IX                                                  |
    |      |     |   80 Old MINIX                                              |
    |      |     |   81 Linux/MINIX                                            |
    |      |     |   82 Linux swap                                             |
    |      |     |   83 Linux native                                           |
    |      |     |   85 Linux extended                                         |
    |      |     |   93 Amoeba                                                 |
    |      |     |   94 Amoeba BBT                                             |
    |      |     |   A5 FreeBSD                                                |
    |      |     |   A6 Open BSD                                               |
    |      |     |   A7 NETSTEP                                                |
    |      |     |   A9 NetBSD                                                 |
    |      |     |   B7 BSDI fs                                                |
    |      |     |   B8 BSDI swap                                              |
    |      |     |   C7 Syrinx                                                 |
    |      |     |   DB CP/M                                                   |
    |      |     |   E1 DOS access                                             |
    |      |     |   E3 DOS R/O                                                |
    |      |     |   EB BeOS fs                                                |
    |      |     |   F2 DOS secondary                                          |
    |      |     |   FF BBT                                                    |
    +------+-----+-------------------------------------------------------------+
    |  05h |Byte | 此分割結束之磁頭編號                                        |
    +------+-----+-------------------------------------------------------------+
    |  06h |Byte | 此分割結束之磁區編號 (6 bits)                               |
    |      |     | 最高的 2 個 bits(bit6-7), 為磁柱編號的 bit8-9 	           |
    +------+-----+-------------------------------------------------------------+
    |  07h |Byte | 此分割結束之磁柱編號 (10 bits)                              |
    |      |     | bit8-9 放在位移值 06h 的 bit 6-7                            |
    +------+-----+-------------------------------------------------------------+
    |  08h |DWord| 此分割區前之磁區總數                                        |
    +------+-----+-------------------------------------------------------------+
    |  12h |DWord| 此分割之磁區總數                                            |
    +------+-----+-------------------------------------------------------------+

    --------------------------------------------------------------------------------

    FDISK /MBR 的作用:

    Windows/DOS 作業系統提供的硬碟分割程式有一個隱藏參數 /mbr,許多人以為只要下 Fdisk /mbr 就可以重建硬碟分割表,其實這是錯誤的!Fdisk /mbr 主要功用在幫你重建 BPL (Boot Partition Loader),也就是 Fdisk 只會幫你重建程式區而已,如果硬碟分割表已經毀損 Fdisk /mbr 就沒用了。
    也因為 /mbr 的功用在重建 BPL 程式區,而許多的多重開機管理程式或開機型病毒也是利用這區域在工作,所以執行 Fdisk /mbr 可能可以移除多重開機管理程式或開機型病毒。


    --------------------------------------------------------------------------------

    Boot Partition Loader 程式說明 (WinXP):

    ;首先要知道BIOS結束自我測試後,會將MBR戴入至記憶體0000:7C00位置,然後開始執行MBR程式區的程式
    ;為何會固定將 MBR 戴入至記憶體0000:7C00的位置呢? 沒什麼特別原因, 只因為以前 IBM 出的 x86 系統的 BIOS
    ;就是這麼做的, 所以後來大家都跟隨 IBM 的做法..

    ;MBR 程式第一部份
    ;設定堆疊並將MBR程式從 0000:7C00h 複製到 0000:0600h 位置
    ;
    ;將程式碼由 0000:7C00h 複製到 0000:0600h 的原因在於
    ;後續戴入的啟動磁動(Boot Secotr), 也必需被戴入到 0000:7C00h 的位址,
    ;如果沒進行搬移的動作, 將造成在記憶中的 MBR 程式被覆蓋, 造成當機

    語法:
    0000:7C00 33C0          XOR	AX,AX
    0000:7C02 8ED0          MOV	SS,AX
    0000:7C04 BC007C        MOV	SP,7C00		; 設定堆疊 SS:SP (0000:7C00)
    0000:7C07 FB            STI
    0000:7C08 50            PUSH AX
    0000:7C09 07            POP	ES
    0000:7C0A 50            PUSH AX
    0000:7C0B 1F            POP	DS		; DS = ES = AX = 0
    0000:7C0C FC            CLD
    0000:7C0D BE1B7C        MOV	SI,7C1B
    0000:7C10 BF1B06        MOV	DI,061B
    0000:7C13 50            PUSH AX		; AX = 0000
    0000:7C14 57            PUSH DI		; DI = 061B
    0000:7C15 B9E501        MOV	CX,01E5
    0000:7C18 F3 A4	      REPZ MOVSB		; 將第二部份的程式與硬碟分割表複製到記憶體 0000:061Bh 位置
    0000:7C1A CB            RETF		; 跳到新位置繼續執行, 也就是 
    					; MBR 程式的第二部份起始點 (0000:061B)
    
    ;MBR 程式第二部份
    0000:7C1B BDBE07        MOV	BP,07BE		; BP = 07BEh = 第一個硬碟分割表位址
    0000:7C1E B104          MOV	CL,04		; CL = 4, 最多共有 4 組分割表
    0000:7C20 386E00        CMP	[BP+00],CH	; CH = 0
    0000:7C23 7C09          JL	7C2E		; 如果 BootID 等於 80h ~ FFh (可開機分割表)
    					; 則跳到 7C2E 位址繼續檢查其它的分割表
    0000:7C25 7513          JNZ	7C3A            	; 如果 BootID 等於 01h ~ 7Fh, 則顯示
                                         	; Invalid partition table 錯誤訊息 
    0000:7C27 83C510        ADD	BP,+10          	; 讀取下一分割表  
    0000:7C2A E2F4          LOOP 7C20            	; 繼續檢查下一分割表
    0000:7C2C CD18          INT	18		; 在 4 個分割表中都沒找到可啟動分割區, 執行ROM BASIC
    
    0000:7C2E 8BF5          MOV	SI,BP		; SI=BP=可開機的分割表 
    0000:7C30 83C610        ADD	SI,+10		; 下一分割表
    0000:7C33 49            DEC	CX		; 4 個分割表都檢查過了?
    0000:7C34 7419          JZ	7C4F		; 是, 跳到 7C4F 繼續執行
    0000:7C36 382C          CMP	[SI],CH		; 如果 BootID 等於 0
    0000:7C38 74F6          JZ	7C30		; 是, 繼續檢其它分割表
    					; 否, 顯示 Invalid partition table 錯誤訊息 
    
    0000:7C3A A0B507        MOV	AL,[07B5]		; [07B5]=2Ch=Point to 'Invalid partition table' error message
    ; -----------------------------------------------------
    ; 顯示錯誤訊副程式
    0000:7C3D B407          MOV	AH,07
    0000:7C3F 8BF0          MOV	SI,AX		;  
    0000:7C41 AC            LODSB		; 讀取下個字元
    0000:7C42 3C00          CMP	AL,00		; 字串已顯示完畢 ?
    0000:7C44 74FC          JZ	7C42		; 是, 進入無窮迴圈
    0000:7C46 BB0700        MOV	BX,0007
    0000:7C49 B40E          MOV	AH,0E		;
    0000:7C4B CD10          INT	10		; 顯示一個字元
    0000:7C4D EBF2          JMP	7C41		; 繼續顯示
    ; 顯示錯誤訊副程式結束
    ; -----------------------------------------------------
    
    ; 這埵閉q奇怪的程式碼, 不明白有什麼特殊原因要將分割表開始之磁區位移6個磁區
    ; 總之這段 code 在戴入 Boot Sector 時會先根據 Partition Table 的內容戴入 Boot Sector
    ; 如果戴入失敗 或者 戴入的磁區 不是 Boot Sector, 則將分割表開始數 + 6
    ; 然後再一次嘗試戴入 Boot Sector
    0000:7C4F 884E10        MOV	[BP+10],CL	; CL=0, 將下一個 Partition Table 的 BootID 設為 00h
    					; 在這堻o個 byte 當成特殊旗標使用, 用來判斷 分割開始之磁區數
    					; 是否有作位移6個磁區的動作
    
    0000:7C52 E84600        CALL 7C9B		; 戴入 Boot Sector
    0000:7C55 732A          JNB	7C81		; Boot Sector 戴入成功, 跳到 7C81
    
    0000:7C57 FE4610        INC	BYTE PTR [BP+10]		; 將下一個 Partition Table 的 BootID+1 
    0000:7C5A 807E040B      CMP	BYTE PTR [BP+04],0B	; 檢查作業系統格式是否為DOS FAT-32 bits
    0000:7C5E 740B          JZ	7C6B			; 是
    0000:7C60 807E040C      CMP	BYTE PTR [BP+04],0C	; 檢查作業系統格式是否為DOS FAT Cylinder > 1024
    0000:7C64 7405          JZ	7C6B			; 是
    0000:7C66 A0B607        MOV	AL,[07B6]			; [07B6]=44h=Point to "Error loading operation system" 
    0000:7C69 75D2          JNZ	7C3D			; 顯示錯誤訊息
    0000:7C6B 80460206      ADD	BYTE PTR [BP+02],06	; 此分割表開始磁區數位移 6 個磁區
    0000:7C6F 83460806      ADD	WORD PTR [BP+08],+06	; 此分割區前之磁區總數 + 6
    0000:7C73 83560A00      ADC	WORD PTR [BP+0A],+00
    0000:7C77 E82100        CALL 7C9B			; 再次嘗試讀入 Boot Sector
    0000:7C7A 7305          JNB	7C81			; Boot Sector 戴入成功
    
    0000:7C7C A0B607        MOV	AL,[07B6]			; [07B6]=44h=Point to "Error loading operation system"
    0000:7C7F EBBC          JMP	7C3D			; 顯示錯誤訊息
    0000:7C81 813EFE7D55AA  CMP	WORD PTR [7DFE],AA55	; 檢查 BootSector ID 55AAh
    0000:7C87 740B          JZ	7C94			; 確實是 Boot Sector, 轉移控制權
    0000:7C89 807E1000      CMP	BYTE PTR [BP+10],00	; 不是 Boot Sector, 則判段是否做過開始磁區數位移的動作
    0000:7C8D 74C8          JZ	7C57			; 沒位移, 則進行位移, 然後再嘗試讀戴入 Boot Sector
    0000:7C8F A0B707        MOV	AL,[07B7]			; [07B7]=63h=Point to "Missing operation system" error message
    0000:7C92 EBA9          JMP	7C3D			; 顯示錯誤訊息
    0000:7C94 8BFC          MOV	DI,SP			; DI=SP=7C00
    0000:7C96 1E            PUSH DS			; DS=0000
    0000:7C97 57            PUSH DI			; DI=7C00
    0000:7C98 8BF5          MOV	SI,BP			; SI=BP=Paration Table
    0000:7C9A CB            RETF			; 轉移控制權給 Boot Sector
    						; MBR 程式到止結束, 進入作業系統
    ; -------------------------------------------------------------
    ; 戴入 Boot Sector 副程式
    0000:7C9B BF0500        MOV	DI,0005		
    0000:7C9E 8A5600        MOV	DL,[BP+00]	; Drive number, 80h = drive 0, 81h = drive 1
    0000:7CA1 B408          MOV	AH,08
    0000:7CA3 CD13          INT	13		; Get Drive parameters
    					; Input:
    					; 	ah=08h
    					;	dl=00h ~ 7fh : Floppy
    					;	dl-80h ~ FFh : Harddisk
    					; on return:
    					;	ah=status of command executed
    					;	bl=drive type
    					;	ch=Lower 8 bits of maximum cylindernumber
    					;	cl=bits 6-7 : Highest 2 bits of maximum cylindernumber
    					;	   bits 0-5 : Maximum sectornumber
    					;	dh=max heads
    					;	dl=number of drivers attached
    					;	es:di pointer to 11 byte Disk Base Table (DBT) 
    					;	cf=1 if error
    0000:7CA5 7223          JB	7CCA		; 讀取磁碟參數失敗, 跳到 7CCA 繼續執行
    
    0000:7CA7 8AC1          MOV	AL,CL		; AL=CL=每軌磁區數
    0000:7CA9 243F          AND	AL,3F
    0000:7CAB 98            CBW
    0000:7CAC 8ADE          MOV	BL,DH		; BL=DH=磁頭數
    0000:7CAE 8AFC          MOV	BH,AH		; BH=AH=00h
    0000:7CB0 43            INC	BX		
    0000:7CB1 F7E3          MUL	BX		; AX: DX = 磁頭數 * 每軌磁區數
    0000:7CB3 8BD1          MOV	DX,CX		; 
    0000:7CB5 86D6          XCHG DL,DH		; DH=max sector, DL=max cylinder
    0000:7CB7 B106          MOV	CL,06		
    0000:7CB9 D2EE          SHR	DH,CL		; 
    0000:7CBB 42            INC	DX		; DX=Total cylinder
    0000:7CBC F7E2          MUL	DX		; AX: DX = Total Sectors (磁頭數 * 每軌磁區數 * 磁軌數 )
    0000:7CBE 39560A        CMP	[BP+0A],DX	; [BP+0A]=此分割區前之磁區總數 (high word)
    0000:7CC1 7723          JA	7CE6		; 如果 分割區前之磁區總數 大於 Total Sectors
    					; 代表這可能是一顆大容量硬碟, 跳到 7CE6 位置嘗試使用 
    					; int13 Extended Read Function 讀取資料
    
    0000:7CC3 7205          JB	7CCA		; jump, 非大容量硬碟
    
    0000:7CC5 394608        CMP	[BP+08],AX	; [BP+0A]=此分割區前之磁區總數 (low word)
    0000:7CC8 731C          JNB	7CE6		; 如果 分割區前之磁區總數 大於 Total Sectors
    					; 代表這可能是一顆大容量硬碟, 跳到 7CE6 位置嘗試使用 
    					; int13 Extended Read Function 讀取資料
    
    0000:7CCA B80102        MOV	AX,0201		; 讀取 Boot Sector 到記憶體 0000:7C00h
    0000:7CCD BB007C        MOV	BX,7C00		; 
    0000:7CD0 8B4E02        MOV	CX,[BP+02]	;
    0000:7CD3 8B5600        MOV	DX,[BP+00]	;
    0000:7CD6 CD13          INT	13		;
    0000:7CD8 7351          JNB	7D2B		; 讀取成功, 離開
    0000:7CDA 4F            DEC	DI		; 如果讀取 5 次都失敗
    0000:7CDB 744E          JZ	7D2B		; 則離開
    0000:7CDD 32E4          XOR	AH,AH		; 重置磁碟
    0000:7CDF 8A5600        MOV	DL,[BP+00]	;
    0000:7CE2 CD13          INT	13		;
    0000:7CE4 EBE4          JMP	7CCA		; 繼續嘗試讀入 Boot Sector
    
    0000:7CE6 8A5600        MOV	DL,[BP+00]	; Drive number, 80h = drive 0, 81h = drive 1...
    0000:7CE9 60            PUSHA
    0000:7CEA BBAA55        MOV	BX,55AA		; Check for Extension support:
    0000:7CED B441          MOV	AH,41		; Input: AH = 41h
    0000:7CEF CD13          INT	13		;        BX = 55AAh
    					;        DL = Drive Number
    					; Output: CF = 0 - operation successfully completed
    					;         AH - major version of extensions
    					;         AL - minor version of extensions
    					;         BX = 0AA55h
    					;         CX = Bits 15 to 2 - reserved (set to 0)
    					;              Bits 1 = 0 - Removable-media control is not supported
    					;                     = 1 - Removable-media control is supported
    					;              Bits 0 = 0 - Extended disk access is not supported
    					;                     = 1 - Extended disk access is supported
    					;         CF = 1 - operation failed
    					;         AH - Status of operation
    
    0000:7CF1 7236          JB	7D29		; Int 13 not supported Extension, return
    0000:7CF3 81FB55AA      CMP	BX,AA55
    0000:7CF7 7530          JNZ	7D29		; Failed, return
    0000:7CF9 F6C101        TEST CL,01		
    0000:7CFC 742B          JZ	7D29		; Extended disk access is not supported, return
    0000:7CFE 61            POPA
    0000:7CFF 60            PUSHA
    
    ; Extended Read:
    ; Input: AH = 42h
    ;        DL = Drive Number
    ;        DS:SI = Disk-address packet
    ; Output: CF = 0 - operation successfully completed
    ;              1 - operation failed
    ; Format of disk address packet:
    ;        Offset Size    Description
    ;        -----------------------
    ;        00h    BYTE    10h (size of packet)
    ;        01h    BYTE    reserved (0h)
    ;        02h    BYTE    number of blocks to transfer
    ;        03h    BYTE    reserved (0h)
    ;        04h   DWORD    -> transfer buffer
    ;        08h   QWORD    starting logical block address
    0000:7D00 6A00          PUSH 0000		; Start logical block address= 分割表中的 此分割區前之磁區總數
    0000:7D02 6A00          PUSH 0000		;
    0000:7D04 FF760A        PUSH [BP+0A]		; 
    0000:7D07 FF7608        PUSH [BP+08]		;
    0000:7D0A 6A00          PUSH 0000		; Transfer Buferr=0000:7C00h
    0000:7D0C 68007C        PUSH 7C00		;
    0000:7D0F 6A01          PUSH 0001		; Number of Blocks to transfer = 1, reserved = 0
    0000:7D11 6A10          PUSH 0010		; Set packet size = 10h, Reserved = 00h
    0000:7D13 B442          MOV	AH,42		
    0000:7D15 8BF4          MOV	SI,SP		
    0000:7D17 CD13          INT	13		; 讀取 Boot Sector 
    				
    				
    0000:7D19 61            POPA
    0000:7D1A 61            POPA
    0000:7D1B 730E          JNB	7D2B		; 讀取成功, 離開
    0000:7D1D 4F            DEC	DI		; 如果讀取 5 次都失敗
    0000:7D1E 740B          JZ	7D2B		; 則離開 
    0000:7D20 32E4          XOR	AH,AH		; 重置磁碟
    0000:7D22 8A5600        MOV	DL,[BP+00]	;
    0000:7D25 CD13          INT	13		;
    0000:7D27 EBD6          JMP	7CFF		; 再次嘗試讀取
    0000:7D29 61            POPA
    0000:7D2A F9            STC
    0000:7D2B C3            RET
    ; 戴入 Boot Sector 副程式結束
    ; -------------------------------------------------------------
    ; Boot Paration Loader 到止結束
    ; -------------------------------------------------------------



  2. #2
    進階會員
    註冊日期
    2000-10-27
    討論區文章
    505
    說錯了, 上面貼的 mbr 是從 xp 系統抓下來的, 不是 win98.. 文章已修正~
    Code 是直接使用win98提供的 debug 抓下來的, 作法如下:
    將下面這段 debug 指令存成 cmd.txt (包含空格及空行)
    語法:
    A
    mov ax,0201
    mov bx,200
    mov cx,1
    mov dx,80
    int 13
    int 20
    
    G
    M 200 L200 100
    R BX
    0
    R CX
    200
    N MBR.BIN
    W
    M 100 L200 7C00
    U 7C00 L200
    D 7C00 L200
    Q
    然後在 dos/win98 下執行
    c:\debug < cmd.txt > mbr.lst

    完成後, 有兩個檔案會被建立
    1. mbr.bin (這個就是你系統上第一顆硬碟 mbr 磁區的內容, 512 Bytes)
    2. mbr.lst (反組譯後的 code)
    因為 debug 程式本身的限制, 有些指令在dos/win98提供的 debug.exe 反組譯不出來, 如果有其它較好的反組譯程式 (如: Sourcer 7.0) 可以拿 mbr.bin 來反組譯即可.

類似的主題

  1. 用spfdisk做多重開機,安裝至硬碟啟動磁區的問題...
    作者:axpm0n 所在討論版:-- Windows 討 論 版
    回覆: 8
    最後發表: 2006-02-21, 11:47 AM
  2. 【求助】ghost 可否將 mbr 或其動磁區一起備份起來
    作者:kevin1005 所在討論版:-- 其 他 軟 體 討 論 版
    回覆: 2
    最後發表: 2003-08-29, 06:26 PM
  3. 【教學】MBR 主啟動磁區剖析
    作者:xbug 所在討論版:---- 電 腦 / 網 路 軟 體 精 華 區
    回覆: 8
    最後發表: 2002-07-16, 10:03 PM
  4. 找不到啟動磁區 ? 怪現象
    作者:white 所在討論版:-- Windows 討 論 版
    回覆: 9
    最後發表: 2002-01-18, 03:43 AM
  5. XP的啟動磁片製作程式
    作者:tom168 所在討論版:-- Windows 討 論 版
    回覆: 2
    最後發表: 2001-11-06, 08:28 AM

 

ghost &amp; invalid partition table

MBR標記

開機如果顯示loading operation system F2

MBR 64 byte

spf第一軟磁碟

spfdisk mbr pop buffer

發表文章規則

  • 不可以發表新主題
  • 不可以回覆文章
  • 不可以上傳附加檔案
  • 不可以編輯自己的文章
  •