首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

KV300 硬碟鎖機制深度分析:擴展分區隱藏扇區破壞導致的啟動死循環

     編輯:關於C++

事件回顧:一個毀壞 MBR 擴展分區鏈結的危險實驗

作者在開發硬碟加鎖程式時,因計算錯誤誤寫入擴展分區首隱藏扇區 (Extended Partition Boot Record, EPBR),導致系統無論從軟碟或硬碟啟動,皆進入讀取該扇區的無限迴圈,硬碟燈常亮、無法進入 DOS。本文詳細剖析此現象成因,並提供修復方案與安全警示。

MBR 與擴展分區鏈結結構

主開機記錄 (MBR, Sector 0) 位移 1BEh~1FDh 為 64 Bytes 分區表,含 4 個 16-Byte 項目。每項結構:

位移大小意義
00h1啟動旗標 (80h=作用中, 00h=非作用中)
01h1起始磁頭號
02h-03h2起始扇區/柱面 (10-bit 柱面 + 6-bit 扇區)
04h1分區類型 (01/04/06=FAT12/16/32, 05=Extended, 0F=Extended LBA)
05h1結束磁頭號
06h-07h2結束扇區/柱面
08h-0Bh4相對扇區號 (LBA 起始)
0Ch-0Fh4分區總扇區數

關鍵機制:類型碼 05h/0Fh 代表擴展分區,其「相對扇區號」指向該擴展分區的首隱藏扇區 (EPBR)。EPBR 結構同 MBR,但僅使用前兩項:第一項描述本邏輯磁碟 (類型 01/04/06),第二項指向下一個 EPBR (類型 05/0F),形成單向鏈結串列。DOS 開機時會遍歷此鏈結,為每個邏輯磁碟建立磁碟參數表 (DPB)。

死循環成因分析

實驗程式將 EPBR 第一項的「分區類型」 (位移 04h) 誤寫為 05h,且「相對扇區號」 (位移 08h-0Bh) 仍指向自身。DOS 開機讀取流程:

  1. 讀 MBR,發現類型 05h 項目 → 取其相對扇區號讀取 EPBR。
  2. 讀 EPBR,第一項類型被誤判為 05h → 取其相對扇區號 → 指向同一 EPBR。
  3. 無限重複步驟 2,硬碟控制器持續讀取同一扇區,系統掛死。

此現象在 DOS 3.3~6.22 及早期 Windows 9x 均可重現,證實為 DOS 開機邏輯缺乏鏈結循環偵測所致。

修復方案:以低版本 DOS 繞過鏈結遍歷

作者發現 DOS 2.x 不支援擴展分區,開機時不會遍歷 EPBR 鏈結。修復步驟:

  1. 準備一張 DOS 2.x 開機軟碟 (極難取得)。
  2. 進 CMOS 設定硬碟為正常模式 (勿設為 None,否則 INT 13h 無法存取)。
  3. 用 DOS 2.x 開機 → 進入 DEBUG → 以備份的正確 EPBR 內容覆寫受損扇區 (INT 13h AH=03h 寫入)。
  4. 重新開機,系統恢復正常。

另類修復:無效化 MBR 強制略過硬碟開機

若無 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 修復。

安全啟示與現代視角

  • 鏈結結構脆弱性:任何單向鏈結 (MBR/EPBR、MCB 記憶體鏈、FAT 叢集鏈) 一旦指標錯誤皆會導致系統掛死或資料損毀。作業系統應加入循環偵測 (如 Floyd 判圈演算法) 或節點計數上限。
  • 硬碟加鎖濫用風險:利用此缺陷實作「軟碟無法開機」的硬碟鎖屬惡意軟體行為,現代 UEFI Secure Boot + BitLocker 已從根本解決實體存取控制問題。
  • 資料救援原則:軟體錯誤 (Logical Damage) 應以軟體手段修復,**切勿修改 CMOS 硬體設定** 掩蓋症狀,否則可能導致永久資料遺失。

結語

KV300 案例深刻揭示了早期 DOS 架構在面對分區表異常時的脆弱性。雖然現代作業系統 (NT 核心、Linux、macOS) 皆具備完善的分區表驗證與錯誤恢復機制,但理解底層儲存結構對數位鑑識、資料救援、韌體開發仍具核心價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved