引言:系統(tǒng)總有崩潰的時候,為降低文件丟失的風險,把重要的大量文件及時備份到另一個磁盤是一項不錯的選擇。近期勒索病毒爆發(fā)引起了全球再聚焦信息安全問題。如何盡量增強硬盤中文檔的安全性,筆者提出一種簡單、實用也很高效的鏡像熱備份方案,并且備份是隱藏的。
每個人的計算機都存有許多的文檔資料,有的已成為重要資產,特別是辦公用計算機更是如此。一般用戶每隔數(shù)年總會因為系統(tǒng)軟件、硬件故障或其他原因而遷移文檔資料,如果所在分區(qū)的磁盤發(fā)生故障則文件丟失。如果遇到類似勒索病毒的破壞情況會更糟,重要的文檔資料都將丟失。為此,本文提出一種具有鏡像熱備份功能,且將備份目的分區(qū)隱藏的方案。
鏡像備份:備份源區(qū)和目標區(qū)的文件名和目錄結構完全一致,便于直觀比較,方便用戶定位要找的文件。
熱備份:備份過程在后臺自動進行。用戶可認為備份不存在,正常在源區(qū)讀寫文件,不影響用戶操作機器。
即時備份:備份程序掃描源區(qū)的時間間隔2秒。
隱藏備份:在程序控制下,備份目標區(qū)只在需要復制文件時短暫可見,平時隱藏,所在分區(qū)不能被訪問,最大限度保證備份文件安全。
為保證正常備份,F(xiàn):分區(qū)的文件不宜太大,應保證能在5分鐘內復制完畢。設置掃描源分區(qū)(F:)時間間隔為2秒。掃描只關心近5分鐘內修改過的文件,如果存在這樣的文件則進一步比較W:分區(qū)是否存在完全一樣的文件,不存在則復制文件。復制結束后,用DeleteVolumeMount PointA("W:\")函數(shù)刪除W:分區(qū)掛載點,則W:分區(qū)隱藏不可用,阻止通過系統(tǒng)訪問備份文件。平時W:分區(qū)一直隱藏,只有F:分區(qū)發(fā)現(xiàn)有5分鐘內修改過的文件才通過SetVolumeMountPoi ntA("W:\",szVolumeName)使W:分區(qū)臨時取消隱藏而可用。在很大程度防止了惡意軟件或非授權人訪問。
1.以BCB為例,建新應用程序,拖放定時器Timer1,設置時間間隔2000。因用到時間函數(shù),Unit1.cpp頭文件加上#include "DateUtils.hpp"。定義3個全局變量:String Arr[50000]用于存放5分內修改過文件名的數(shù)組,最多可存5萬個文件名;int P=0用于數(shù)組指針;char szVolumeName[MAX_PATH]=""用于存放W:分區(qū)內部標識符。自定義2個函數(shù) :Find_File(String) 用于遍歷F:分區(qū),Copy_File(String)用于復制文件。
2.Form1窗體過程
OnShow()過程:
void __fastcallTForm1::FormShow(TObject*Sender)
{ GetVolumeNameForVo lumeMountPointA("W:\",s zVolumeName,MAX_PATH);//獲取W:的內部分區(qū)標識,存入szVolumeName,以便隱藏和取消隱藏W:分區(qū)的操作
ShowMessage(IntTo Str(aa)+"請手工更改目的分區(qū)符號為 W:并重啟備份程序");
OnClose()過程:
程序正常關閉時取消隱藏W:分區(qū),使W:分區(qū)可見。如果程序異常關閉,W:分區(qū)隱藏狀態(tài),則下次啟動時OnShow過程提示“手工更改目的分區(qū)符號為W:”。
3.定時器過程
首先,定時器暫停,Arr[]指針P復位,開始掃描F:分區(qū)。Find_File("F:")返回后,如果P<1,說明沒有需復制的文件,隱藏W:分區(qū),重啟定時器并返回。如果P≥1,可能有需復制的文件,取消W:分區(qū)的隱藏,移動P逐個查找W:分區(qū)中是否存在Arr[]中對應的文件。存在則比較文件寫入時間與系統(tǒng)時間的差值,小于120秒是剛剛復制過的文件放棄復制,大于120秒的進行復制。如果不存在對應文件,則進行復制。復制完畢將Arr[]中對應的值清空。Arr[]隊列處理結束后,再隱藏W:分區(qū),重啟定時器。
4.Find_File(String)過程
本過程通過遞歸運算遍歷F:分區(qū)所有文件,如果文件5分鐘內被修改過,說明文件已更新,可能需要復制備份。將這些文件裝入隊列Arr[],P的值就是文件數(shù)量。遍歷完畢等復制過程。注意一定要過濾“..”目錄,否則遞歸進入死循環(huán)。
5.Copy_File(String)過程
本過程使用標準SHFIL EOPSTRUCT文件復制代碼,較簡單。需說明復制前修改Arr[]中文件的路徑,以保證鏡像復制,代碼為:from=AnsiString(File_Path);to="w:"+File_Path.SubString(3,File_Path.Length());為不干擾用戶正常工作,在后臺復制,復制時不顯示對話框,對已存在文件覆蓋復制,自動新建不存目錄,不顯示復制進度,需設置fFlags參數(shù)。代碼為:fFlags=FOF_NOERRORUI |FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR |FOF_SILENT。