作者在開發硬碟加鎖程式時,因計算錯誤誤寫入擴展分區首隱藏扇區 (Extended Partition Boot Record, EPBR),導致系統無論從軟碟或硬碟啟動,皆進入讀取該扇區的無限迴圈,硬碟燈常亮、無法進入 DOS。本文詳細剖析此現象成因,並提供修復方案與安全警示。
主開機記錄 (MBR, Sector 0) 位移 1BEh~1FDh 為 64 Bytes 分區表,含 4 個 16-Byte 項目。每項結構:
| 位移 | 大小 | 意義 |
|---|---|---|
| 00h | 1 | 啟動旗標 (80h=作用中, 00h=非作用中) |
| 01h | 1 | 起始磁頭號 |
| 02h-03h | 2 | 起始扇區/柱面 (10-bit 柱面 + 6-bit 扇區) |
| 04h | 1 | 分區類型 (01/04/06=FAT12/16/32, 05=Extended, 0F=Extended LBA) |
| 05h | 1 | 結束磁頭號 |
| 06h-07h | 2 | 結束扇區/柱面 |
| 08h-0Bh | 4 | 相對扇區號 (LBA 起始) |
| 0Ch-0Fh | 4 | 分區總扇區數 |
關鍵機制:類型碼 05h/0Fh 代表擴展分區,其「相對扇區號」指向該擴展分區的首隱藏扇區 (EPBR)。EPBR 結構同 MBR,但僅使用前兩項:第一項描述本邏輯磁碟 (類型 01/04/06),第二項指向下一個 EPBR (類型 05/0F),形成單向鏈結串列。DOS 開機時會遍歷此鏈結,為每個邏輯磁碟建立磁碟參數表 (DPB)。
實驗程式將 EPBR 第一項的「分區類型」 (位移 04h) 誤寫為 05h,且「相對扇區號」 (位移 08h-0Bh) 仍指向自身。DOS 開機讀取流程:
此現象在 DOS 3.3~6.22 及早期 Windows 9x 均可重現,證實為 DOS 開機邏輯缺乏鏈結循環偵測所致。
作者發現 DOS 2.x 不支援擴展分區,開機時不會遍歷 EPBR 鏈結。修復步驟:
若無 DOS 2.x,可先破壞 MBR (寫入無效特徵碼),使 BIOS 放棄硬碟開機改由軟碟啟動,再用磁碟工具修復 MBR 與 EPBR。具體 DEBUG 腳本:
; 在另一台電腦製作「開鎖鑰匙」軟碟
C:\DEBUG
-A 100
MOV AX, 0301 ; 寫入軟碟第 1 扇區 (備份用)
MOV BX, 0200
MOV CX, 0001
MOV DX, 0000 ; DX=0000 (A:), 0001 (B:)
INT 13
INT 3
-A 200
MOV AX, 0301 ; 寫入硬碟 MBR (0x80)
MOV BX, 0200
MOV CX, 0001
MOV DX, 0080
INT 13
INT 3
-G=100
執行後將軟碟插入故障機,開機 (畫面無顯示、硬碟燈閃一下) → 插入真正 DOS 開機碟 → 重開機 → 進入 DOS 修復。
KV300 案例深刻揭示了早期 DOS 架構在面對分區表異常時的脆弱性。雖然現代作業系統 (NT 核心、Linux、macOS) 皆具備完善的分區表驗證與錯誤恢復機制,但理解底層儲存結構對數位鑑識、資料救援、韌體開發仍具核心價值。