《Windows內核安全與驅動編程》-第十一章文件系統的過濾與監控-day1

文件系統的過濾與監控

​ 文件系統過來吧的目標,是捕獲Windows系統對文件的種種操作行爲,比如文件的創建、打開、讀寫、目錄的創建、打開、枚舉、改名、刪除等。捕獲這些操作,能夠實現許多強大的功能,比如檢查病毒、數據加密、數據備份、安全監控等。

​ 不要把文件系統驅動和存儲驅動和混淆。硬盤是典型的存儲設備,只負責數據的讀與寫;而文件系統則不管數據是如何讀寫到硬盤或其他設備上的,它只負責數據是如何在硬盤的平坦空間內組織成文件和目錄的。

​ 文件和目錄都是很複雜的信息集合。比如一個文件至少有文件名、內容、大小、各種屬性等,這些信息在硬盤實際空間中的保存結構和組織方式極其複雜。此外還有目錄,目錄是可以嵌套的。一個目錄的刪除移動都涉及其下的所有子目錄和文件的刪除移動。因此文件系統本身是極爲複雜的系統,文件系統的過濾也同樣縣的複雜。

​ 一般來說,能在存儲設備的層次上完成的功能就不在文件系統上完成。但是一旦涉及區分目錄,比如要求對指定的某個目錄下的文件可以加密,這時就需要文件系統過濾了。文件系統過濾最典型的應用是防毒軟件。這類軟件一般都代有文件過濾驅動,當Windows上任何軟件試圖寫一個文件的時候,防毒軟件都會過濾其寫入的內容,檢查其中是否有病毒的特徵碼。

11.1 文件系統的設備對象

11.1.1 控制設備與卷對象

​ 首先介紹文件系統的驅動會生成哪些設備對象。像FAST\NTFS這樣的文件系統(FS)主要生成兩類設備。首先文件系統驅動往往本身生成一個控制設備(COD),這個設備的主要任務是修改整個驅動的內部配置。因此一般的說,一個文件系統只對應一個COD。

​ 而另一類設備是這個文件系統的卷設備。一般一個卷對應一個邏輯盤。一個FS可能有多個加載的卷,也可能一個都沒有。例如,如果計算機上有C、D、E、F四個邏輯盤,則有四個卷設備。實際上,“C:”是設備的符號鏈接名,而不是真正的設備名。我們可以使用專門查看符號鏈接的工具來查看,比如“C:”的設備名爲“\Device\HarddiskVolume1”。

​ 注意,這個卷設備本身並不是文件系統驅動生成的,而是卷管理器生成的。但是當有一個卷使用了某種文件系統時,則該文件系統會對應地爲該設備生成一個沒有名字的設備對象,本章將它叫做文件系統的卷設備。即本章中所說的“卷設備”都特質文件系統的卷設備,並常用的卷設備的符號鏈接或者它們的名字。比如,如果C:、D: 是NTFS,則C:、D: 爲NTFS的兩個卷設備對象。

​ 但是這只是一種稱呼。實際上我們在打開設備的時候,並不會去打開設備的真正的名字,因爲那樣打開的是一個真正的卷設備。所以我們綁定文件系統的卷設備,並不適用名字來解決的。

​ 這裏可以看出,文件系統驅動是針對每個捲來生成一個設備對象的,而不是針對每個文件的。實際上,對文件的讀寫IRP都發送到卷設備對象上了。

​ 本章,我們需要關心的兩類設備:控制設備和卷設備。發送給控制設備的請求一般都是文件系統控制IRP(IRP_MJ_FILE_SYSTEM_CONTROL);而發送給卷設備的IRP一般則是文件操作IRP。過濾的目標最終是爲了得到文件操作IRP,但是控制設備的IRP一般用來捕獲卷設備的生成信息。換句話說,最終目標是爲了綁定文件系統的卷設備,但是前提是先綁定文件系控制設備。

11.1.2 生成自己的一個控制設備

​ 首先還是DriverEntry,進入的第一步是生成這個驅動自己使用的CDO。這非常重要!因爲文件系統過濾驅動往往必須和外界的應用程序通信。而通信的主要接口就是這個控制設備。

​ 控制設備生成在路徑“Fi了System\Filters”下。

NTSTATUS DriverEntry(
	IN	PDRIVER_OBJECT DriverObject,
	IN	PUNICODE_string RegistryPath
)
{
    //頂一個Unicode字符串
    UNICODE_STRING	nameString;
    RtlInitUnicodeString(&nameString,L"\\FileSystem\\Fileters\\SFilter");
    
    //生成控制設備
    status = IoCreateDevice(
    	DriverObject,
    	0,			//沒有設備拓展
    	&nameString,
    	FILE_DEVICE_DISK_FILE_SYSTEM,	//設備類型
    	FILE_DEVICE_SECURE_OPEN,
    	FALSE,
    	&gSFilterControDeviceObject
    )
    //如果生成失敗
    if(!NT_SUCCESS(status)){
        KdPrint(("生成控制設備失敗,status = %08x\n",status))
        return status;
    }
    return status;
}

​ 這段代碼目前只能生成一個控制涉筆,還沒有對文件系統已經有的設備對象進行綁定。下回繼續講解文件系統過濾所需要注意的分發函數。

總結

本節主要講了文件系統中的兩類重要的設備對象:控制設備與卷設備。尤其要注意的是這裏的卷設備與平常的卷設備並不是一個意義的卷設備,而是單獨屬於文件系統的一類卷設備。而控制設備主要作用爲文件系統過濾驅動與外界通信的接口。

明日計劃

11.2 文件系統的分發函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章