進階會員 | 【教學】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 磁區大致上分為 3 個區域 語法: ---------------------------- <-- 位移值 00H (0 Bytes) | | | | | Boot Partition Loader | | 這一小段程式用來將可啟動 | | 的作業系統分割區戴入 | | | | | | -----| <-- 位移值 1BEh (446 Bytes) |---------------------| | | Partition Table | | 硬碟分割表 -----| | |55AA| ---------------------------- <-- 位移值 200H (512 Bytes) 因為這段程式區是除了 BIOS 之外最先被電腦戴入執行的區域 (不考慮軟碟),所以像是多重開機管理程式、開機型病毒、軟體式硬碟密碼鎖等程式,大多都是利用這個域區在工作。 2. 第二個區域是資料區,即硬碟分割表所在區域。其範圍從 1BEh 到 1FDh,共 64 Bytes。 這 64 Bytes 又劃分成四個區域,代表 4 個硬碟分割表,其範圍分別為 語法: 位移值 01BE ~ 01CD <-- 第一分割表 位移值 01CE ~ 01DD <-- 第二分割表 位移值 01DE ~ 01ED <-- 第三分割表 位移值 01EE ~ 01FD <-- 第四分割表 也因為 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 到止結束 ; ------------------------------------------------------------- |
會員 | 又學ㄌ很多..... 受益不淺.......喔 ^^ |
會員 | 好文章 推........ |
會員 | 可以請問一下,Code 是怎麼來的嗎…?? |
進階會員 | 說錯了, 上面貼的 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
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 來反組譯即可. |
會員 | 內容豐富多謝... |
進階會員 | 想更深入瞭解∼∼∼ 我推薦一本旗標出的PCDIY硬碟玩家實戰∼∼∼ |
會員 | 哇.....又是高手一個 |
會員 | 好文章 感謝你 受益匪淺 |
XML | RSS 2.0 | RSS |
本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。