摘要:針對(duì)傳統(tǒng)利用中斷方式的磁盤保護(hù)有不少安全隱患,分析了一種基于磁盤過濾驅(qū)動(dòng)的硬盤保護(hù)工作機(jī)制。該機(jī)制的核心思想是在對(duì)上層操作系統(tǒng)透明的情況下,重定向?qū)Υ疟P操作的I/O請(qǐng)求包,在重啟系統(tǒng)后自動(dòng)清除緩存數(shù)據(jù)。由于工作在操作系統(tǒng)內(nèi)核層增強(qiáng)了保護(hù)功能的安全性。
關(guān)鍵詞:中斷;過濾驅(qū)動(dòng);硬盤保護(hù);I/ O 請(qǐng)求包
中圖分類號(hào):TP334文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2009)35-10106-02
The Technology of Hard-disk Protection Method Based on Disk Filter Driver
WEI Xi-san1,2, DONG Wei2
(1.Computer School of Wuhan University, Wuhan 430072, China; 2.Computer Teaching Center, Xiangfan University, Xiangfan 441053, China )
Abstract: The traditional method of disk protection using interrupted many security risks, analysis of a filter driver for hard disk-based protection mechanism. The core idea of the mechanism is operating in the upper transparent circumstances, the redirection operation of the disk I/O request packet, in the reboot the system automatically clear the cache data. As a result of the operating system kernel layer of enhanced security protection.
Key words: INT; filter driver; hard-disk protection; IRP
傳統(tǒng)的硬盤保護(hù)軟/硬件,主要是攔截和接管INT13H中斷,比如現(xiàn)有常見的還原卡就是在引導(dǎo)系統(tǒng)前就預(yù)先修改中斷表,用自己的處理函數(shù)替換了正常的INT13H,在上層系統(tǒng)對(duì)磁盤進(jìn)行存取時(shí),進(jìn)行相應(yīng)的偏移,這種保護(hù)技術(shù)幾乎兼容所有的操作系統(tǒng),并且對(duì)硬盤上的數(shù)據(jù)能起到完整的保護(hù)作用,但它消耗大量的存儲(chǔ)空間(和被保護(hù)空間為1:1),不兼容特殊工作的硬盤(如SCSI硬盤),保護(hù)空間大小有限制(如DOS兼容模式的2.1G,LBA28位尋址的137G限制),并且容易被破解(找到原始的IHT13H的地址,修改即可)。
本文介紹了一種基于磁盤過濾驅(qū)動(dòng)的硬盤保護(hù)(還原)技術(shù),利用微軟本身的系統(tǒng)架構(gòu),對(duì)系統(tǒng)中讀寫磁盤的操作進(jìn)行檢測(cè)和過濾,以達(dá)到對(duì)磁盤數(shù)據(jù)的保護(hù)。
1 磁盤過濾驅(qū)動(dòng)的原理
微軟的Windows在內(nèi)核里對(duì)設(shè)備對(duì)象的管理是分層的,同時(shí),用戶對(duì)任何設(shè)備的訪問都最終會(huì)以IRP(I/O請(qǐng)求包)的形式發(fā)送到目標(biāo)設(shè)備對(duì)象驅(qū)動(dòng)中。
用戶按一定的規(guī)范編寫并安全驅(qū)動(dòng),由系統(tǒng)在特定時(shí)候加載,使用戶層在對(duì)某些設(shè)備進(jìn)行的操作請(qǐng)求按一定的次序,一層又一層地經(jīng)過這些驅(qū)動(dòng),每一層的驅(qū)動(dòng)可以選擇對(duì)這些請(qǐng)求進(jìn)行修改、下傳或者是拋棄。
通常使用一個(gè)磁盤過濾驅(qū)動(dòng),建立一個(gè)磁盤過濾設(shè)備,Attach到磁盤卷設(shè)備,即Device\\HarddiskVolumeX(X為數(shù)字)上,這樣可以監(jiān)控系統(tǒng)對(duì)磁盤數(shù)據(jù)的讀寫、重定向等。
這種硬盤保護(hù)技術(shù)的優(yōu)點(diǎn)在于:因?yàn)檫^濾驅(qū)動(dòng)介于磁盤驅(qū)動(dòng)和用戶層之間,所以它是設(shè)備無關(guān)的,不用考慮當(dāng)前機(jī)器上安裝的是多大的磁盤,也不用考慮磁盤是IDE的還是SCSI的,因?yàn)檫@些工作都由更底層的磁盤驅(qū)動(dòng)來完成了。系統(tǒng)會(huì)把用戶級(jí)對(duì)文件的讀寫操作轉(zhuǎn)化成IRP,交由內(nèi)核的磁盤對(duì)象,內(nèi)核再根據(jù)設(shè)備棧上掛著的驅(qū)動(dòng)順序,一個(gè)個(gè)地把IRP發(fā)給它們。因?yàn)橛沈?qū)動(dòng)完成,可以在驅(qū)動(dòng)中做稍微復(fù)雜的計(jì)算,實(shí)現(xiàn)以下功能:使用比被保護(hù)區(qū)要小的存儲(chǔ)區(qū),存儲(chǔ)區(qū)可以不連續(xù),還可以指定存儲(chǔ)區(qū)的有效期等功能。
2 具體實(shí)現(xiàn)
微軟自帶的系統(tǒng)還原系統(tǒng)主要是基于文件系統(tǒng)的過濾功能,通過安裝的文件系統(tǒng)過濾驅(qū)動(dòng)sr.sys,配合Srrstr.dll、Srsvc.dll、Srclient.dll,監(jiān)聽系統(tǒng)以及某些應(yīng)用程序文件的改變,并使用寫時(shí)拷貝(copy on write)技術(shù),自動(dòng)創(chuàng)建易于識(shí)別的還原點(diǎn)。這種系統(tǒng)還原只要跳過文件系統(tǒng)的讀寫操作保護(hù)就會(huì)失效。
而基于磁盤過濾驅(qū)動(dòng)的保護(hù)系統(tǒng)要對(duì)所包含的分區(qū)或磁盤的讀寫都經(jīng)過過濾處理,并不會(huì)真正修改物理磁盤上的真實(shí)數(shù)據(jù)。重啟系統(tǒng)后,所有緩存的數(shù)據(jù)被丟棄,系統(tǒng)重新回到原來設(shè)置的初始狀態(tài)。
系統(tǒng)加載文件系統(tǒng)后,按照正常運(yùn)行,下一步是加載磁盤驅(qū)動(dòng)。如需要保護(hù)分區(qū),就在這里進(jìn)行掛接磁盤驅(qū)動(dòng)。在文件系統(tǒng)加載后磁盤驅(qū)動(dòng)加載前,截?cái)嗖僮鳎尤胱约旱倪^濾驅(qū)動(dòng),這樣再掛接磁盤驅(qū)動(dòng)繼續(xù)進(jìn)行系統(tǒng)啟動(dòng)。
一個(gè)完整的磁盤過濾驅(qū)動(dòng)的例子可以參考微軟DDK里的一個(gè)例子:\\src\\storage\\filters\\diskperf。
首先要考慮多線程和多CPU,有時(shí)候可能會(huì)有多個(gè)對(duì)磁盤的讀寫IRP同時(shí)到達(dá)了驅(qū)動(dòng)內(nèi)部,要考慮到對(duì)存儲(chǔ)區(qū)的轉(zhuǎn)存應(yīng)該互斥進(jìn)行,這時(shí)可以對(duì)IRP進(jìn)行排隊(duì)。在創(chuàng)建驅(qū)動(dòng)對(duì)象的時(shí)候指定DriverStartIo例程。另外IRP_MJ_WRITE和IRP_MJ_READ都要進(jìn)行排隊(duì),兩者的IRP類似,可以將兩者的例程指定為同一個(gè):
……
DriverObject->DriverStartIo = DFIoStart;
DriverObject->MajorFunction[IRP_MJ_READ]= DFReadWrite;
DriverObject->MajorFunction[IRP_MJ_WRITE] = DFReadWrite;
……
在IRP_MJ_WRITE和IRP_MJ_READ例程里把接收到的IRP投遞到StartIO隊(duì)列
NTSTATUS DFReadWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{ IoMarkIrpPending(Irp);
IoStartPacket(DeviceObject, Irp, 0, NULL);
return STATUS_PENDING; }
在StartIo例程里,處理完一個(gè)IO事件以后要用IoStartNextPacket函數(shù)申請(qǐng)下一個(gè)IO事件
void DFIoStart(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{……
IoStartNextPacket(DeviceObject, TRUE);
……}
對(duì)IRP排完序,接下來就要對(duì)IRP包的數(shù)據(jù)進(jìn)行移位和存寫,這里有兩種實(shí)現(xiàn)方式:備份保護(hù)和映射保護(hù)。
備份保護(hù)是最常用的保護(hù)方法。如圖2所示,假設(shè)用戶想要對(duì)扇區(qū)10的數(shù)據(jù)進(jìn)行保護(hù),數(shù)據(jù)將被備份到另一個(gè)區(qū)域,這里假設(shè)這個(gè)區(qū)域是扇區(qū)100,那么當(dāng)用戶再進(jìn)行操作時(shí),實(shí)際還是對(duì)扇區(qū)10進(jìn)行操作,如果扇區(qū)10遭到破壞,那么恢復(fù)的時(shí)候?qū)?huì)把扇區(qū)100的數(shù)據(jù)重新拷貝到一個(gè)暫存區(qū)扇區(qū)10。
備份保護(hù)要做兩方面的事情:
1) 判斷是否需要保護(hù);
2) 記錄備份到的扇區(qū)信息。
如:建立一個(gè)索引表格記錄扇區(qū)10->扇區(qū)100這個(gè)關(guān)系。
優(yōu)點(diǎn):簡(jiǎn)單,安全。
缺點(diǎn):占用空間太多。因?yàn)橐粋€(gè)扇區(qū)只能存儲(chǔ)512字節(jié),但是每次記錄索引表格備份關(guān)系的時(shí)候都要用到8個(gè)字節(jié),這樣磁盤空間被大量占用。
解決方法:建立有效數(shù)據(jù)位圖,這樣可以把索引表格縮小。
除了備份保護(hù),還有一種映射保護(hù)。
同樣,假設(shè)需要保護(hù)的扇區(qū)是扇區(qū)10,那么這個(gè)扇區(qū)將被保護(hù)起來,當(dāng)用戶進(jìn)行寫操作的時(shí)候,表面上看,用戶還是對(duì)扇區(qū)10進(jìn)行操作,其實(shí)數(shù)據(jù)已經(jīng)被寫到別的扇區(qū),比如是扇區(qū)100,那么用戶再對(duì)扇區(qū)10進(jìn)行操作的時(shí)候,就會(huì)被轉(zhuǎn)移到扇區(qū)100。如果用戶想恢復(fù)數(shù)據(jù),直接就是恢復(fù)的扇區(qū)10的數(shù)據(jù)。
圖4是用戶進(jìn)行讀操作的過程,當(dāng)數(shù)據(jù)進(jìn)入后,首先要讀取保護(hù)位圖,查看模塊是否被保護(hù),如果被保護(hù),進(jìn)入映射表查找數(shù)據(jù)存儲(chǔ)的模塊。
同時(shí),為了防止應(yīng)用程序直接存取物理磁盤設(shè)備,即\\Device\\HarddiskX\\DRX,繞過磁盤卷的過濾驅(qū)動(dòng),通常還會(huì)再創(chuàng)建一個(gè)磁盤過濾設(shè)備,并Attach到物理磁盤設(shè)備上,來過濾對(duì)真實(shí)物理磁盤設(shè)備的讀寫 。
3 結(jié)束語
目前的硬盤保護(hù)卡(還原卡)多使用磁盤過濾驅(qū)動(dòng)來做數(shù)據(jù)還原和保護(hù)。由于它工作在內(nèi)核層,所以破解的難度系數(shù)高,工作穩(wěn)定。但隨著機(jī)器狗等更多能穿透保護(hù)的病毒出現(xiàn),使得這種保護(hù)不是一勞永逸。今后在更底層比如直接端口IO監(jiān)控上還有完善的空間。
參考文獻(xiàn):
[1] MJ0011,還原系統(tǒng)保護(hù)攻防[EB/OL].http://hi.baidu.com/mj0011/blog.
[2] 張帆,史彩成.Windows驅(qū)動(dòng)開發(fā)技術(shù)詳解[M].北京:電子工業(yè)出版社,2008.
[3] 劉蓬.用DDK開發(fā)WDM驅(qū)動(dòng)程序[J].計(jì)算機(jī)應(yīng)用,2003(S2).
[4] 彭海云,胡洪安.磁盤免疫系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].河南大學(xué)學(xué)報(bào):自然科學(xué)版,2009,39(3).
[5] Cant C.Windows WDM 設(shè)備驅(qū)動(dòng)程序開發(fā)指南[M].孫義,馬莉波,譯.北京:機(jī)械工業(yè)出版社,2000.