在電腦鑑識(Computer Forensics)和災難復原領域中,最令人頭痛的莫過於檔案系統嚴重損毀、硬碟分割表遺失,甚至是被格式化後的殘局。市面上的救援工具雖然琳瑯滿目,但底層技術細節多被包裝成黑盒子。
本篇文章將為您全面揭密本專案 —— Polik Recovery Engine。這是一個基於 Rust Workspace 精巧架構設計的資料救援引擎。我們不僅以零複製(Zero-copy)的高效邏輯重新實作了多種經典與現代檔案系統的解析器,更配備了高置信度的特徵碼雕刻模組,使您能夠在檔案系統完全損壞的磁碟映像上精準抽取重要檔案。
💡 小白磁碟救援速成班(生活化比喻)小白友善
如果您不是程式設計師,覺得磁碟底層技術太過艱深,沒關係!以下用「圖書館」的日常生活場景,為您快速科普本引擎是如何在不破壞任何資料的情況下,幫您把消失的檔案拯救回來:
硬碟就像一個巨大的圖書館。NTFS、exFAT 與 APFS 就是不同的「圖書編目系統」。當您刪除檔案時,圖書館員只是把目錄卡丟掉,但書架上的書(實體檔案)其實還好好地放在原地!
如果書非常薄(極小的檔案),圖書館員懶得跑去架上放,會直接寫在目錄卡背面(常駐資料)。本引擎能直接在卡片上把內容抄給您,連跑架子的功夫都省了。
當圖書目錄卡全部被大火燒毀時,我們就派「雕刻器」逐一翻找架子,根據書本獨特的「封面特徵 (Header)」與「封底特徵 (Footer)」(如 PNG/JPEG 圖片特徵)來挖出檔案,進行無痛重建。
本引擎嚴格遵守「唯讀 (Read-only) 規則」,就像一位只能看、不能寫字的圖書館檢查員。我們絕對不會動到您受損的硬碟,而是把救出的資料安全複製到您指定的新隨身碟或新資料夾中。
⚡ 現代化 Tauri 2.0 桌面端圖形介面小白友善
為了讓非專業使用者不需要接觸命令列(CLI),本專案已使用 Tauri 2.0 + HTML5 框架封裝成精美的桌面版應用程式。雙擊即可開啟直覺的點擊操作,在背景透過極速 Rust 引擎與安全寫入器為您把關資料。
- 選擇要掃描的磁碟區段路徑或映像檔案。
- 點擊右上角「開始掃描」,數秒內即會生成虛擬目錄樹。
- 在清單中勾選您要復原的項目,點選「💾 執行真實復原」即可還原!
🏗️ 系統架構與四大核心引擎專家特調
整個引擎以功能劃分為數個微型模組(Crates),以達成低耦合與高測試覆蓋率。以下為核心模組的設計架構:
NTFS MVP 核心閉環與常駐資料提取
NTFS 使用 MFT (Master File Table) 紀錄來管理硬碟上的所有檔案。當檔案非常小(一般小於 700 位元組)時,NTFS 會直接把檔案內容放在 MFT 紀錄的 $DATA 屬性內(稱為常駐資料 Resident Data)。當檔案變大時,內容才會轉存至外部磁區(非常駐資料 Non-Resident Data),並以 Data Runs (映射鏈) 的形式指明磁區位置。
本引擎同時支援常駐與非常駐 `$DATA` 屬性提取,並具備更新序列校正(Fixup Array Verification)功能,防範磁區寫入不完整所產生的損壞數據。
自動識別 `$DATA` 屬性類型。小檔案由記憶體直接 clone 輸出,大檔案則依據 cluster 映射鏈走訪 BlockSource 讀取。
精準解碼 MFT 屬性頭的 flag 狀態,主動判別與標示壓縮(Compressed)、加密(Encrypted)與稀疏(Sparse)檔案,預防救援過程崩潰。
exFAT 遍歷與刪除檔案檢索
相較於 NTFS 的複雜性,exFAT 的結構更為緊湊。其目錄項目以 32 位元組為單位成組(Primary Directory Entry Group)排列。當一個檔案被刪除時,其對應的 File Entry(0x85)和 Stream Extension Entry(0xC0)首位元組會分別被置換成 0x05 和 0x40。
我們的 exFAT 解析模組能夠完整解碼這些狀態,在掃描時主動找出已被刪除的目錄與檔案,並透過無 FAT 鏈結(NoFatChain)或尋找 FAT 表的方式動態重建完整的虛擬樹狀路徑!
APFS 超級區塊校驗與 B-Tree 遍歷
APFS(Apple File System)是蘋果系統的現代檔案系統。其在容器層級(Container Superblock)及卷層級(Volume Superblock)都大量使用了 Fletcher64 校驗演算法 來確保元資料(Metadata)的完整性。
除了校驗碼驗證外,本引擎更實作了完整的 APFS B-Tree 遍歷與走訪演算法,深度解析目錄記錄(Dir Record)與 Inode 節點。這讓我們能從損壞的 APFS 容器中解析出完整的虛擬檔案系統(VFS)樹狀結構,還原出原始檔案與資料夾路徑。
智慧型 File Carving (特徵彫刻)與 OLE 支援
當檔案系統的分配表(如 FAT、MFT)遭受毀滅性破壞時,唯一的救援途徑就是 **File Carving** —— 循序掃描硬碟中的魔術位元組(Magic Bytes)。
除了支援 PNG、JPEG、PDF、ZIP 與具有嵌套 Box-Walking 長度走訪的 MP4 外,本引擎更進一步支援 **Microsoft Office 舊版 OLE/CFBF 複合二進制格式(如 .doc、.xls、.ppt)**。我們實作了 DIFAT 與 FAT 鏈結分配表解析,動態算出所有配置扇區(Sectors)的最後分佈位置,以精準雕刻出完整的 Office 文件。
🛠️ 實戰教學:如何一步步使用 CLI 進行資料救援專家特調
現在,我們將透過實際操作,帶您在終端機中體驗這一套 Rust 資料救援引擎。
第一步:編譯與測試
首選,請確保您在專案根目錄下,執行以下指令以確保整個工作區編譯正確且測試通過:
# 測試全部 48 個測試案例
cargo test
# 檢查代碼排版
cargo fmt --check
如果您不想記憶或輸入長長的命令列參數,可以直接執行以下指令啟動 中文互動式選單嚮導 (Interactive Wizard),系統會以選單形式一步步引導您進行所有功能的執行與復原:
cargo run -q -p polik-recovery-cli
第二步:列舉硬碟裝置
本引擎的 macOS 模組可以讀取磁碟配置。你可以使用 devices 指令列出受保護或外接的唯讀硬碟:
cargo run -q -p polik-recovery-cli -- devices
第三步:掃描 NTFS 並建立 VFS 樹狀結構
讓我們使用測試映像檔,將其中的檔案結構以 JSON 格式印出,這有助於後續 UI 端或計畫程式進行解析:
cargo run -q -p polik-recovery-cli -- ntfs-scan-vfs --file fixtures/images/ntfs_volume_with_mft.bin --count 2 --format json
執行後,您將會得到類似下方的結構,標明了每個檔案的 id(MFT record 序號)、路徑、類型以及分配狀態(例如 Allocated 或 Deleted):
{
"source": "fixtures/images/ntfs_volume_with_mft.bin",
"volume_offset": 0,
"entries": [
{"id":0,"path":"/$MFT","kind":"File","status":"Allocated","size":16384},
{"id":5,"path":"/report.txt","kind":"File","status":"Deleted","size":42}
]
}
第四步:執行批次復原計畫 (Batch Recovery)
透過建立一個復原計畫的 JSON 檔(例如 plan.json),我們可以一次抽取多個選定項目,並將其安全寫入指定的目的地。
plan.json 中指明來源映像與需要抽取的 record_index 及其輸出檔名即可。
{
"source": "fixtures/images/ntfs_volume_extract.bin",
"volume_offset": 0,
"items": [
{ "record_index": 0, "output_filename": "recovered_data.txt" }
]
}
接著,在 CLI 中執行此計畫:
cargo run -q -p polik-recovery-cli -- ntfs-extract-batch --plan plan.json --output-dir /tmp/recovered_output
執行完畢後,在 /tmp/recovered_output 目錄下,您會發現復原成功的檔案、單一檔案的雜湊證書,以及專門用來作鑑識與稽核的 recovery-session.manifest.txt 總結清單!
🔍 File Carving 實際示範與 MP4 Box 走訪細節專家特調
當我們面臨一塊被完全格式化的隨身碟時,檔案系統資料已經蕩然無存,這時可以利用 carve 指令直接掃描特徵並重建檔案。
cargo run -q -p polik-recovery-cli -- carve --file <raw_image.bin> --output-dir /tmp/carved_files --format text
在背後,以 MP4 檔案的彫刻為例,引擎不會傻傻地只去尋找 footer,因為許多 MP4 並沒有統一的結尾標記。相反地,[find_mp4_length](file:///Users/huangjianzhe/Desktop/資料救援/crates/file-carver/src/lib.rs#L218) 與 [find_ole_length](file:///Users/huangjianzhe/Desktop/資料救援/crates/file-carver/src/lib.rs#L289) 函數會分別走訪 MP4 Box 及 OLE FAT 分配扇區結構鏈:
// 簡化版 MP4 Box 走訪示意
fn find_mp4_length(source: &S, start_offset: u64) -> Option<u64> {
let mut offset = start_offset;
while offset < limit {
let box_size = read_be_u32(source, offset)?;
let box_type = read_box_type(source, offset + 4)?;
// 若遇到不合常理的 box_size 或包含非 ASCII 字元的 type,則停止
if !is_valid_type(box_type) { break; }
offset += box_size; // 前進到下一個 Box
}
Some(offset - start_offset)
}
這種依循結構長度進行雕刻的方式,能夠確保在硬碟區段中,精準擷取出未受碎裂化(Fragmentation)影響的完整影片檔案!
🌟 總結
利用 Rust 開發的這套 Polik Recovery Engine,以無記憶體安全風險、零成本抽象的優勢,為資料救援提供了穩健的架構。無論是針對結構嚴密的 NTFS、適用於隨身碟的 exFAT、現代 Apple 設備的 APFS,或是最底層的 File Carving 特徵掃描,此核心引擎都展現了出色的穩定性與精準度。
歡迎您直接閱讀 [開發交接手冊 (handoff.md)](file:///Users/huangjianzhe/Desktop/資料救援/docs/handoff.md),了解如何以此核心為基礎,串接您的 Flutter/Tauri 應用程式或進行後續功能擴展!
❓ 常見問答 (FAQ)
BlockSource 抽象特質(Trait)來進行的,該 API 只暴露了讀取(Read)方法,且在底層開啟 /dev/rdiskN 時強制使用唯讀模式的 Flag(例如 Rust 中的 OpenOptions::new().read(true).write(false).open(...))。任何寫入動作在編譯與運行層面均被完全杜絕。
ftyp 表頭後,會讀取前 4 位元組長度與後 4 位元組 Box 類型(如 moov, mdat),然後跳轉到下一個 Box,並遞迴檢驗其合法性(是否為常見 ASCII 盒子類型)。只要偵測到非法 Box 或大小異常,就會中止長度計算,這相較於傳統粗暴的特徵碼搜尋,能提供接近 100% 的準確長度。