隨身碟、外接硬碟遺失竊取導致隱私外洩風險極高。本文實作一個原型級移動儲存加密工具:掃描登錄表列舉裝置、開啟實體磁碟讀寫扇區、以 RC4 加密 MBR (前 512 位元組)、監聽 WM_DEVICECHANGE 自動偵測插拔。程式碼在 WinXP + VC6.0 編譯通過,僅供技術研究參考。
路徑:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum
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);
}
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;
}
⚠️ 需管理員權限執行。寫入錯誤扇區會導致檔案系統損壞,**務必備份測試**。
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。
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);
}
PhysicalDriveN。本文展示移動儲存加密的最核心技術棧:登錄表裝置列舉、CreateFile 實體存取、RC4 流加密、WM_DEVICECHANGE 熱插拔感知。雖原型功能極簡且有嚴重安全缺口,但為理解「透明加密」、「全盤加密」、「硬體加密」等進階主題奠定基礎。**切勿在真實資料上直接測試此原型程式碼。** 完整原始碼請下載附件。