国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 應用 > 軟件技巧 > 正文

Windows平臺內核級文件訪問

2024-07-16 17:58:54
字體:
來源:轉載
供稿:網友

在windows平臺下,應用程序通常使用API函數來進行文件訪問,創建,打開,讀寫文件。從kernel32的CreateFile/ReadFile/WriteFile函數,到本地系統服務,再到FileSystem及其FilterDriver,經歷了很多層次。在每個層次上,都存在著安全防護軟件,病毒或者后門作監視或者過濾的機會。作為安全產品開發者,我們需要比別人走得更遠,因此我們需要一個底層的“windows平臺內核級文件訪問”的方法來確保我們能夠看到正確的干凈的文件系統。

  直接訪問FSD的內核級別文件訪問

  FSD(FileSystemDriver)層是文件API函數經過本地系統服務層(native API)最后到達的驅動層次。如果我們可以模仿操作系統,在我們自己的驅動程序里直接向FSD發送IRP,就可以繞過那些native API 和win32 API了,也就可以繞過設置在這些層次上面的API鉤子等監控措施。

  文件的Create和Open

  文件的Create和Open可以通過發送IRP_MJ_CREATE給FSD,或者調用IoCreateFile函數來完成。Create和Open的區別實際上在于IoCreateFile/IRP_MJ_CREATE的一個參數Disposition的取值。

  通過發送IRP_MJ_CREATE給FSD的方法與此類似,可以參考IFSDDK document的IRP_MJ_CREATE說明。不同于上面方法的是需要自己創建一個FILE_OBJECT,好于上面方法的是這種方法不需要一個HANDLE,HANDLE是線程依賴的,FileObject則是線程無關。

  文件的Read和Write

  我們通過給FSD發送IRP_MJ_READ來讀取文件,給FSD發送IRP_MJ_WRITE來改寫文件。

  如果我們是通過一個HANDLE來執行(如使用IoCreateFile打開的文件),就要先用ObReferenceObjectByHandle函數來獲得這個Handle對應的FileObject。我們只能給FileObject發送IRP。

  之后我們使用IoAllocateIrp分配一個IRP。根據FileObject->DeviceObject->Flags的值,我們判斷目標文件系統使用什么樣的IO方式。

  對每種不同的IO方式使用不同的地址傳遞方式。隨后我們填充IRP內的各個參數域,就可以發送IRP了。

  接著要考慮如果IRP不能及時完成,會異步的返回的情況,我們安裝一個CompletionRoutine,在CompletionRoutine里面設置一個事件為已激活,通知我們的主線程讀取或者寫入操作已經完成。

  現在可以發送IRP了。如果不采取特殊的措施的話,IRP發送目標是FileObject對應的DeviceObject。發送后,等待IRP的完成并且釋放資源,返回。

  文件的Delete

  Delete實際上是通過向FSD發送IRP_MJ_SET_INFORMATION的IRP,并把IrpSp->Parameters.SetFile.FileInformationClass設置為FileDispositionInformation,用一個FILE_DISPOSITION_INFORMATION結構填充buffer來執行的。

  文件的Rename

  類似于Delete,Rename是向FSD發送IRP_MJ_SET_INFORMATION的IRP,把IrpSp->Parameters.SetFile.FileInformationClass設置為FileRenameInformation,填充buffer為FILE_RENAME_INFORMATION結構。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 怀仁县| 金山区| 体育| 长海县| 营口市| 农安县| 贺州市| 五寨县| 嘉善县| 平顶山市| 马龙县| 抚远县| 普兰店市| 华阴市| 昌邑市| 东明县| 黑龙江省| 桃园县| 乌鲁木齐市| 东兴市| 陈巴尔虎旗| 西青区| 老河口市| 睢宁县| 嘉荫县| 桐城市| 邹城市| 霸州市| 鄢陵县| 永修县| 新闻| 丁青县| 中江县| 栾川县| 葫芦岛市| 道真| 伽师县| 本溪| 綦江县| 桃园县| 九龙县|