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

移動儲存裝置加密保護:MBR 加密、裝置偵測與自動感知原型實作

     編輯:關於VC++

隨身碟、外接硬碟遺失竊取導致隱私外洩風險極高。本文實作一個原型級移動儲存加密工具:掃描登錄表列舉裝置、開啟實體磁碟讀寫扇區、以 RC4 加密 MBR (前 512 位元組)、監聽 WM_DEVICECHANGE 自動偵測插拔。程式碼在 WinXP + VC6.0 編譯通過,僅供技術研究參考。

1. 登錄表掃描列舉磁碟裝置

路徑:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum

  • 索引 0 通常為系統碟,**程式自動過濾索引 0 避免誤毀系統**
  • 索引 1~N 為外接/內建資料磁碟

HKEY hKey;
char sz[256]; DWORD dwType, sl = 256;
for (int i = 1; i < 8; ++i) { // 從 1 開始跳過系統碟
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
        "SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum",
        0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) {
        CString idx; idx.Format("%d", i);
        if (RegQueryValueEx(hKey, idx, NULL, &dwType, (LPBYTE)sz, &sl) == ERROR_SUCCESS) {
            m_select.AddString(sz); // 列入下拉選單
        }
    }
    RegCloseKey(hKey);
}

2. 實體扇區讀寫:CreateFile + SetFilePointer + ReadFile/WriteFile

Windows 將裝置視為檔案,路徑格式:\\.\PhysicalDriveN 或 \\.\X: (邏輯磁碟)。


int ReadDisk(CString driver, unsigned char* Buf, long sector)
{
    HANDLE hDev = CreateFile(driver, GENERIC_READ|GENERIC_WRITE,
        FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (hDev == INVALID_HANDLE_VALUE) return 0;
    
    if (sector != 0)
        SetFilePointer(hDev, 512 * sector, NULL, FILE_BEGIN);
    
    DWORD bytesRead;
    BOOL ok = ReadFile(hDev, Buf, 512, &bytesRead, NULL);
    CloseHandle(hDev);
    return (ok && bytesRead == 512) ? 1 : 0;
}

int WriteDisk(CString driver, unsigned char* Buf, long sector)
{
    HANDLE hDev = CreateFile(driver, GENERIC_READ|GENERIC_WRITE,
        FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (hDev == INVALID_HANDLE_VALUE) return 0;
    
    if (sector != 0)
        SetFilePointer(hDev, 512 * sector, NULL, FILE_BEGIN);
    
    DWORD bytesWritten;
    BOOL ok = WriteFile(hDev, Buf, 512, &bytesWritten, NULL);
    CloseHandle(hDev);
    return (ok && bytesWritten == 512) ? 1 : 0;
}

⚠️ 需管理員權限執行。寫入錯誤扇區會導致檔案系統損壞,**務必備份測試**。

3. RC4 加密 MBR (Master Boot Record)

MBR 位於第 0 扇區 (512 位元組),包含開機程式碼與分區表。加密後裝置在未解密前無法被 OS 掛載識別,達到隱藏資料效果。


// 密鑰 (生產環境應由使用者輸入密碼衍生)
BYTE Key[] = "MobileStorageSecurity"; 

// 讀取 MBR
BYTE MBRBuf[512];
ReadDisk(driver, MBRBuf, 0);

// RC4 加密
RC4_KEY rc4_key;
build_rc4_key(Key, strlen((char*)Key), &rc4_key);
rc4_handler(MBRBuf, 512, &rc4_key); // 就地加密

// 寫回
WriteDisk(driver, MBRBuf, 0);

解密流程相同 (RC4 對稱),再次執行即還原 MBR。

4. 裝置插拔自動感知:WM_DEVICECHANGE


LRESULT CMyDlg::WindowProc(UINT msg, WPARAM wp, LPARAM lp)
{
    if (msg == WM_DEVICECHANGE && !bBusy) {
        // WPARAM: DBT_DEVICEARRIVAL / DBT_DEVICEREMOVECOMPLETE
        // LPARAM: DEV_BROADCAST_HDR* 含裝置類型/路徑
        RefreshDeviceList(); // 重新掃描登錄表更新下拉選單
    }
    return CDialog::WindowProc(msg, wp, lp);
}

5. 介面操作流程

  1. 啟動程式 → 自動列出可用移動裝置 (排除系統碟)
  2. 選取目標裝置 → 點選「加密」 → 讀取 MBR → RC4 加密 → 寫回 → 提示完成
  3. 裝置插入新電腦 → 磁碟管理顯示「未分配/無法識別」 → 執行程式選取 → 「解密」 → 還原 MBR → 正常掛載

已知限制與安全性警示

  • ❌ **僅加密 MBR (512 bytes)**,分區表被加密導致 OS 無法識別分區,**檔案資料本身未加密**。專業工具 (WinHex、DiskGenius) 仍可讀取後續扇區資料。
  • ❌ **密鑰硬編碼**,無使用者密碼輸入、無金鑰衍生 (PBKDF2)、無完整性驗證 (HMAC)。
  • ❌ **無檔案系統感知**:FAT32/NTFS/exFAT 結構差異大,MBR 加密可能損壞 GPT 磁碟 (GPT 備份在末尾)。
  • ❌ **無備份/恢復機制**:加密失敗或中斷將導致裝置永久不可用。
  • ⚠️ **需管理員權限**,一般使用者無法開啟 PhysicalDriveN。
  • ✅ 原型驗證核心流程:裝置列舉、扇區存取、對稱加密、熱插拔偵測。

後續改進路線圖

  1. 使用者輸入密碼 → PBKDF2-SHA256 衍生金鑰 → AES-256-XTS 全盤加密 (參考 VeraCrypt 架構)
  2. 實作檔案系統層級過濾驅動 (Minifilter) 實現透明加密/解密
  3. 支援 GPT、動態磁碟、BitLocker 相容模式
  4. 將程式打包至隨身碟自帶區 (CD 分區 / 隱藏分區) 實現無安裝跨機使用
  5. 增加硬體加速 (AES-NI)、多執行緒並行加密、進度顯示、暫停/繼續

總結

本文展示移動儲存加密的最核心技術棧:登錄表裝置列舉、CreateFile 實體存取、RC4 流加密、WM_DEVICECHANGE 熱插拔感知。雖原型功能極簡且有嚴重安全缺口,但為理解「透明加密」、「全盤加密」、「硬體加密」等進階主題奠定基礎。**切勿在真實資料上直接測試此原型程式碼。** 完整原始碼請下載附件。

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