摘要:實現對移動存儲設備的加密,保護信息隱蔽,防止隱私洩露。
關鍵字:移動存儲設備加密安全
當你的U盤,移動硬盤遺失了,被盜了,或者是遺忘在公共場所,裡面的資料就會完全被別人窺探,如果涉及一些隱私,機密,那後果是很嚴重的。本課題就是在這樣一個情況下產生的。這裡剖析的只是一個最初的演示原型,詳細設計,以及一些細節可以參考源代碼。源代碼在WinXP,VC6.0編譯通過。
1、訪問注冊表讀取計算機上的移動存儲設備
在注冊表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum
下面可以看到計算機當前的狀態,這裡可以看到所有的存儲設備的情況,包括計算機的硬盤,通過情況下,名稱為0的是計算機硬盤,所以在列出的選擇設備時,會把名稱為0的屏蔽,不然太危險,一旦造成系統的破壞,後果會很麻煩。對注冊表的讀寫:
HKEY hkey;
char sz[256];
DWORD dwtype,sl = 256;
for(int i=1;i<8;i++)
{
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum",\
NULL, KEY_ALL_ACCESS, &hkey)==ERROR_SUCCESS)
{
CString id;
id.Format("%d",i);
if(RegQueryValueEx(hkey,id,NULL,&dwtype,(LPBYTE)sz,&sl)==ERROR_SUCCESS)
{
CString str=(CString)sz;
m_select.AddString(sz);
}
}
}
RegCloseKey(hkey);
2、對磁盤的扇區的操作
Windows 操作系統在很大程度上采取了訪問安全保護機制(例如,在Windows操作系統下不能直接訪問物理內存、不能使用各種DOS、BIOS中斷等等),其實Windows在采取“實保護”措施的同時也提供了另外的一種有別於在DOS下訪問硬件設備的方法,即把所有的硬件設備全部看做“文件”,並允許按照對文件的讀寫方式來對其進行數據存取訪問。對於磁盤扇區的讀寫,可以通過C++的CreateFile()函數來實現。由MSDN可查詢到該函數原型:
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile );
由於訪問的是事實上已經存在的磁盤扇區,因此只能以OPEN_EXISTING標志設置dwCreationDisposition參數指出將要打開已經存在的文件(設備)。至於其他參數的使用與操作普通文件時的用法相同。
使用的時候,如果需要定位到某一個具體的扇區,可以使用SetFilePointer()函數:
DWORD SetFilePointer(HANDLE hFile,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod);
在定位到要訪問的扇區開始位置後就可以通過ReadFile()或WriteFile()函數實施相應的讀寫訪問了,具體操作與文件讀寫並沒有什麼太大的差別。最後,在完成訪問操作後以CloseHandle()關閉文件句柄釋放資源,從而完成一次完整的磁盤扇區數據訪問操作。
int ReadDisk(CString driver,unsigned char *Buf,long addr)
{
HANDLE hDevice;
BOOL bResult;
DWORD bytesread;
hDevice=CreateFile(driver,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if(hDevice==INVALID_HANDLE_VALUE)
{
AfxMessageBox("Error!");
return 0;
}
if(addr!=0)
{
SetFilePointer(hDevice,512*addr,NULL,NULL);
}
bResult=ReadFile(hDevice,Buf,512,&bytesread,NULL);
if((bResult==FALSE)||(bytesread<512))
{
AfxMessageBox("Error!");
return 0;
}
CloseHandle(hDevice);
return 1;
}
3、用RC4加密算法對磁盤加密。
/* RC4加密,KEY是密鑰,此處Key[]="MobileStorageSecurity",後期可以用戶輸入的密碼作為密鑰 */
RC4_KEY rc4_key;
build_rc4_key(Key,strlen((char*)Key),&rc4_key);
rc4_handler(MBRBuf,strlen((char*)MBRBuf),&rc4_key);
4、U盤插入計算機時的自動感知
LRESULT CRawDiskDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if ( WM_DEVICECHANGE == message && FALSE == bCopy )
{
//刷新設備列表
}
return CDialog::WindowProc(message, wParam, lParam);
}
後期改進
這樣就必須要求在電腦上有這個程序,所以在後期采用同樣的原理,將這個程序放在U盤裡,在加密的時候實現對自身的屏蔽,這樣大大提高程序的易用性。
可以讓用戶輸入密碼,將密碼作為密鑰去加密和解密。
這個只是對一個磁盤最初的512字節加密,後期可以通過對扇區的定位和計算,對目錄表及數據加密。
本文配套源碼