1. 程式人生 > >基於檔案過濾驅動的透明加密那點事兒

基於檔案過濾驅動的透明加密那點事兒

     檔案透明加密這點事兒,從2001年開始出現基於API HOOK的方式開始到現在,已經十幾年了,有細心人按技術實現的方式將其細分為4代,分別是基於API HOOK的第一代技術、基於檔案過濾驅動(加清快取)的第二代技術、使用Layerfsd的雙緩衝第三代技術和基於微軟新一代minifilter框架的Layerfsd雙緩衝第四代技術。第一代和第二代的技術劃分基本上沒有異議,所謂的第四代很多人並不認同,認為使用minifilter框架算不上是技術突破,其技術實現仍然是基於Layerfsd的雙緩衝技術,沒有新意。
        我們從2009年開始研究並實現了基於Layerfsd的雙緩衝技術,並應用於自己的產品中,這些本來都是老生長談,只是最近幾天根據使用者反饋修改了幾個BUG,忽然覺得還可以說道說道。Layerfsd的雙緩衝技術最早出現在驅網論壇上的時候,討論可謂是熱烈,隨著一些開發者逐步從理論到實踐,完成了具體的實現之後,就開始了有意無意的技術封鎖,一些技術理論和部分公開的原始碼都無影無蹤,不過從側面也可以看出來,這個技術其實還是有一定的門檻的。其門檻並不在於技術有多難,關鍵在於細節和穩定性,根據理論做出一個實現不難,網上很多號稱出售Layerfsd的雙緩衝技術實現原始碼的,叫價8-40萬的都有,不過都只能算是一個理論研究系統,穩定性都很難保證,更不用說實用性了。
        為了瞭解同行的技術成熟度,我們經常找來同行的產品進行測試,今年上半年測試了兩個驅動,一個驅動是對Visual Studio不相容,每次儲存檔案後都會提示檔案被外部修改,需要再確認一次,都是做這個的,我們當然清楚這個是layerfsd層的檔案時間沒有處理好,不過用VC編譯一個加密的工程原始碼時,總是藍屏,這個應該就是實現者的技術實力問題了,還有對NTFS分割槽還馬馬虎虎,但是隻要操作FAT分割槽的檔案系統就沒有反應,根據我們的經驗應該是內部有死鎖產生。還有一個驅動是不支援動態磁碟系統和可解除安裝的媒體(比如U盤),用WORD開啟的文件,在編輯狀態時居然可以從資源管理器中刪除,這個是致命的layerfsd層檔案許可權管理失敗,和作者溝通這個問題,作者認為這是雙緩衝驅動實現的特徵,只要是使用雙緩衝技術實現的驅動都有這個問題,對此我們不敢苟同。
        這樣的實現買回去也沒辦法用,想做出實用的商業軟體至少還要2-3年的時間開發功能並做好穩定性。如果有錢,可以直接購買OSR的DMK,穩定性有一定的保證,但是要在上面做二次開發實現自己的功能。pfp也公開過一份原始碼,是個半成品系統(現在驅網所有的下載連結都失效了),但是距離實現還有很遠的距離,當然還是有很多人的實現都是基於這個原始碼做的,這個一測試就能感覺出來。
        使用第二代技術實現的商業應用很多,只要能做穩定,基本都有市場,但是這個技術有幾個致命的問題,就是檔案操作效率低下,容易損壞檔案,並且和反病毒軟體不相容。檔案操作效率低下的原因在於為了防止非授信程序訪問檔案系統快取的檔案明文,每次開啟和關閉檔案時都要清理檔案快取。這對相當於遮蔽了系統檔案快取帶來的效能優化,對大檔案的操作影響尤其明顯。我們測試過一個使用這種技術實現的商業軟體,用word開啟一個100多M的大檔案後,用另一個非授信程序每隔15-30秒鐘只讀訪問一次這個檔案(這會促使驅動實現每隔15-30秒鐘就清一次快取),結果卡的基本上沒辦法操作這個word文件,如果是雙緩衝,就沒有這個問題。損壞檔案的原因主要是對於延遲寫入的緩衝檔案,使用者的寫入操作是寫入了快取,但是負責延遲寫入的system程序還沒有將其寫入檔案,此時如果有非授信程序開啟檔案,會導致快取被清除,這導致使用者的修改沒有寫入,很多情況下都會造成檔案資料丟失或檔案格式損壞,與防毒軟體不相容也基本上是這個原因。
        第二代技術的實現,在處理加密檔案標識的問題上也很棘手,我們測試過的很多實現都是使用影子檔案的方式,所謂影子檔案,就是構造一個檔名與加密檔案有一定的關聯的影子檔案,比如在原始檔名前增加一個固定標識的字首,或字尾,或使用一個特殊的副檔名。當開啟一個檔案時,加密驅動首先看看是否存在影子檔案,如果是就說明是一個加密檔案,需要做解密處理。影子檔案的管理也是一個很麻煩的地方,需要在驅動中對IRP_MJ_DIRECTORY_CONTROL進行過濾處理,對上層應用過濾掉這些檔名,使得使用者在資源管理器中看不到這些影子檔案,感覺不到他們的存在。但是隻要使用者停止驅動,這些檔案就原型畢露,一些安全軟體,比如冰刃,可以繞過驅動直接刪除影子檔案,會帶來一些不穩定因素。此外,檔案的複製和刪除都要考慮影子檔案,維護上也挺麻煩的。也有一些商業實現將影子檔案集中在某個系統目錄中進行管理,但是也要解決同名的問題,也不是完美的方案。
        從理論上所,使用雙緩衝技術可以迴避上面提到的清快取問題,同時,雙緩衝也可以解決檔案加密標識的存放問題。雙緩衝技術可以將加密資訊構造成一個特殊的資料塊直接存放在檔案中,至於是放在檔案頭部還是檔案尾部(從理論上說,也可以放在檔案中間某個位置,不過是自找麻煩),不同意見還是很多的,各有各的理論依據,有人認為放在檔案頭部容易破壞檔案,不過這是沒有根據的,如果驅動實現不成熟,這塊資訊放在什麼地方都可能破壞檔案。傾向於將這塊資訊放在檔案尾部的人覺得檔案完成最後的寫入,關閉之前補上一塊加密資訊是順理成章的事情,傾向於將這塊資訊放在檔案頭部的人則是秉承傳統的思想,畢竟很多檔案格式都是將檔案的特殊資訊構造成一個特殊的檔案頭存放的,不過就實現而言,這二者沒有優劣之分。
        雙緩衝技術需要在一個layerfsd層訪問真實檔案,這就帶來一個驅動的(IRP_MJ_CREATE)重入問題,這個解決不好就直接遞迴到棧溢位了。防止重入有多重方法,使用minifilter框架的有個優勢,就是可以直接使用FltCreateFile系列函式繞開驅動直接開啟和讀寫檔案,這個後面再說。如果不使用minifilter框架,常用的兩種方法就是構造影子捲進行檔案訪問,或直接構造IRP進行檔案操作。構造影子卷的原理就是通過影子卷重定向檔案的訪問,因為過濾驅動不會attach影子卷,因此就規避了重入問題。使用影子卷的好處是可以使用ZwCreateFile等核心API直接操作檔案,方便、安全。但是attach物理卷的時候要避開影子卷,一旦不小心attach了影子卷就會死的很慘。直接構造IRP進行檔案操作應該是一個很優雅的方案,但是實現起來需要考慮比較多的細節,網上也有一些現成的原始碼實現,不過或多或少都有一些問題,需要修改一下才能用。關於這方面的資料首先是OSR的“Rolling Your Own - Building IRPs to Perform I/O”一文,此外,還有baiyuanfan的“Windows平臺核心級檔案訪問”一文也有很不錯的介紹。
        minifilter是微軟引入的一個輕量級微過濾驅動模型,簡化了檔案過濾驅動的實現細節,使得微過濾驅動可以忽略一些細枝末節的東西,將注意力集中在業務實現上。這比採用遺留驅動模型的sfilter框架有一定的優勢,但是就透明加密驅動而言,並沒有進步到說使用minifilter框架就比sfilter技術先進的程度,要知道,第二代透明加密技術的驅動也可以用minifilter框架實現,所以鼓吹minifilter+layerfsd更先進是沒有依據的,重要的還是誰的驅動更穩定,畢竟動不動就藍屏,或者損壞檔案是使用者最不能接受的。
        最後要說一些細節問題,比如雙緩衝,所謂的雙緩衝就是對同一個檔案的訪問形成兩個cache快取,對於授信程序,可以使用解密資料的明文cache,對於非授信程序,則使用密文的cache,二者共存且互相不干擾。使用雙緩衝對系統記憶體的使用肯定是會增加的,但是帶來的安全性和檔案訪問效率的提升是不言而喻的。至於cache的實現方式,可以使用windows的檔案快取系統,也可以自己實現檔案快取系統,據我所知,很多資料庫軟體就沒有使用windows的檔案快取系統,而是根據需求自己實現的快取系統。極端的說,你甚至可以不實現快取,所有加密檔案的讀寫都是實時操作實際檔案,不支援一切快取讀寫和fastio,我們在測試時遇到過這樣的實現,也號稱是支援layerfsd的雙緩衝技術,雖然沒有雙緩衝的檔案訪問效率,但是也算是迴避了第二代驅動技術的幾個難題。還有比如授信程序的識別問題,簡單地根據程式檔名稱進行識別是非常幼稚的做法,對程式改個名字就可以欺騙加密驅動得到解密後的明文。還有授信程序的識別問題,對於有的應用程式,通常是一個圖形的前端加上幾個沒有介面的後臺程式配合工作,如果授信程序只有前端的UI程序,還是無法訪問加密檔案,對這種情況也要做程序父子關係的識別和處理。當然還有經典的執行緒注入問題,通過遠端執行緒注入,可以在授信程序中啟動一個執行緒訪問加密檔案,並將解密的明文通過共享記憶體或socket介面傳遞給另一個非授信程序。解決之道就是阻止執行緒注入,核心和應用層都可以做,當然也會對正常需要執行緒注入的程式產生影響,比如本人的TabSiPlus外掛外掛,需要注入到Source Insight程序內部啟動一個tab標籤欄,就因為這個原因與加密軟體產生衝突。對於一些支援外掛的軟體,比如office,還需要對外掛進行識別和遮蔽,方法也很多,方式也很流氓,經常弄得使用者莫名其妙。我的建議是對這種支援外掛的軟體不要做特殊處理,安全性由使用者自己管理,使用者有時候並不是那麼傻,不要什麼事情都替使用者做了。

相關推薦

基於檔案過濾驅動透明加密事兒

     檔案透明加密這點事兒,從2001年開始出現基於API HOOK的方式開始到現在,已經十幾年了,有細心人按技術實現的方式將其細分為4代,分別是基於API HOOK的第一代技術、基於檔案過濾驅動(加清快取)的第二代技術、使用Layerfsd的雙緩衝第三代技術和基於微軟新一代minifilter框架的La

Android視訊加密事兒

前言 最近有需求要做視訊的加密。因為視訊下載到本地後,為了防止二次拷貝和二次上傳到其他渠道,有些還是付費的視訊,因此要對視訊做加密,加密給了二週的研究時間,留下兩週作為開發和測試階段,故事就這樣開始

基於Minifilter的檔案過濾驅動以及與應用層通訊(付程式碼)

前一段時間在做一個檔案過濾系統, 為了配合公司的產品使用,希望對指定目錄禁止訪問。一開始使用的是sfilter的框架,很多事情需要自己做,建立過濾驅動的控制裝置,建立符號連結,設定IRP例程,設定FAST I/O例程,用這個框架做了一半,與應用層通訊比較麻煩,就

【漫畫】https加密事。

這篇文章之前有寫過,不過那篇文章在排版上很差,而且有些小許的錯誤。今天,我重新修改了那篇文章。算是那篇文章的修訂版。 背景 不知道從哪天開始,一禪也陷入了程式設計這條道路..... 對稱加密 在每次傳送真實資料之前,伺服器先生成一把金鑰,然後先把金鑰傳輸給客戶端。之後伺服器給客戶

加密小事

幾個月前,我們前端被通知要在請求頭上加幾個請求頭,都是加密的內容,目的是解決前後資料的安全性。之前一點不理解,一直覺得前端沒有祕密可言,安全的事情交給後臺就完事了。。。   然後最近看了一些書,發現自己有點年輕,傳輸的資料沒有加密就傳送給後臺,只要中間人拿到請求的引數token後,就可以為所

檔案重定向(採用檔案過濾驅動實現)

Windows的I/O管理器提供了一個方便的方法來重定向一個檔案物件。通常使用檔案過濾驅動(在檔案開啟和檔案建立的操作中)實現該方法。操作方法如下:1、在IRP_MJ_CREATE的分發函式中,獲得FILE_OBJET的FileName屬性。2、用目標檔案的完整路徑替換原有的

iOS VPN描述檔案事兒

天朝的情況大家都瞭解,VPN是大家必備的工具。用過的VPN中目前比較穩定的是雲梯VPN,但是在iPhone上使用的過程中有個麻煩:在不同的網路環境下各個線路的穩定性都不同,經常需要切換幾條線路才連得上。而使用雲梯預設的VPN描述檔案裡面帶了一大坨日本、美國、英國、新加坡

[CKEditor事兒]使用java開發ckeditor的檔案上傳功能

關於CKEditor的使用,網路上有無數的文章,這裡不再贅述。而關於java支援的檔案上傳功能,網路上同樣有千千萬萬的文章,但是遍歷十幾二十篇就會發現,千篇一律的抄襲,各種爬蟲程式帶來的網際網路資訊垃圾給我們的資訊獲取帶來很大的障礙。那些使用java開發CKEditor上傳和

wince中的檔案過濾驅動(FSDSPY)

wince中的檔案過濾系統(FSDSPY) 在wince中實現隱藏檔案,隱藏資料夾,保護檔案不被刪除,阻止建立目錄注意:所講一切只對HardDisk有效,ROM上的目錄不在此驅動範圍內。 首先,wince5.0中提供了驅動的公共模組,位置所在%_WINCEROOT%/pu

HTTPS加密事--輕松秒懂HTTPS非對稱加密

服務 背景 .... .com 找到 得到 對數 方便 技術 本文轉載自微信公眾號(苦逼的碼農),原文地址: https://mp.weixin.qq.com/s/j-ss95ItMnWsZHLpUGBMkQ 用漫畫的形式解釋技術問題是不是有眼前一亮的感覺呢?以後自己的

《開源框架事兒19》:特斯拉建“樁”與開源的生命力

充電站 otto 期權 eas gb2 平臺 程序 蘋果 名詞 在美國的矽谷,在中國的中關村,很多的技術先驅者懷揣夢想。用激情不懈地追求著他們宏遠的目標和巨大的個人財富。開源。正在成為這個時代眼下最火熱的名詞之中的一個。開源精神,作為一種合作協同的驅動力,正在發展為一種更

《開源框架事兒25》:對框架模板引擎實現方式的改造實錄

port 內嵌 代碼調試 iter put 文件路徑 children nts fault 點滴悟透設計思想,Tiny模板引擎優化實錄! 增加框架設計興趣小組:http://bbs.tinygroup.org/group-113-1.html Tiny模板引擎的實

關於LOG事兒

java;源碼時代日誌,作為記錄系統中硬件、軟件和系統問題的信息,同時還可以監視系統中發生的事件,是產品運維中非常重要的數據之一,用戶可以通過它來檢查錯誤發生的原因,或者尋找受到攻擊時攻擊者留下的痕跡。日誌根據程序和不同領域,可分為消息日誌,事件日誌,數據庫日誌等等。對於Java工程師而言,程序代碼的日誌是由

談談源碼管理事兒(一)——源碼管理十誡(轉)

我不 evel .html 文件夾 jetbrains enable thum XML 構建 引言: 若是還有能夠毫無偏見地涉及各個編程語言。比源碼管理軟件更必要的工具。我倒是非常想見識一下。源碼管理軟件是我們工作的必備工具,是很多開發團隊的血液。那為什麽我們都

css中關於居中的事兒

效果圖 單元格 meta 得到 部分 邊距 絕對定位 lin ble   關於居中,無論是水平居中,還是垂直居中都有很多方式,下面我來介紹一些常用的。 第一部分:水平居中   1.實現行內元素的居中。方法:在行內元素外面的塊元素的樣式中添加:text-align:cen

MVC之前的事兒 ---- 系列文章

需要 cnblogs post omx pip 實現原理 內容 activator div MVC之前的那點事兒系列,是筆者在2012年初閱讀MVC3源碼的時候整理的,主要講述的是從HTTP請求道進入MVCHandler之前的內容,包括了原創,翻譯,轉載,整理等各類型文

php curl事兒

func utf8 格式 姓名 url orm peer div 是否 curl是最常用功能之一初始化句柄 $ch = curl_init(); post 傳$data 1. 如果$data是字符串,則Content-Type是application/x-ww

反編譯事兒

kms ros ogr files 位置 file bsp 所在 命令 1.ildasm.exe 所在文件夾位置 C:\Program Files (x86)\Microsoft SDKs\Windows 2.ilasm.exe 所在文件夾位置:cd C:\Windows

Maven 事兒(轉)

做到 conn active cep ant tab name www color 0. 前言 Jason Van Zyl,在 Java 十大風雲人物排行榜上或許會看到他。 這兄弟是幹嘛的? 他就是 Maven 的創始人,人們都尊稱他為“Maven 他爸&

聊聊Cisco 3650交換機系統升級事兒

roc ase necessary 文件 -i 文章 ota catalyst ive 說起思科的交換機升級,大多數人想到的是以下幾步:(1)把系統.bin文件通過TFTP或是FTP上傳到交換機中(2)將原有.bin文件刪除,重啟(或是手動設置引導順序)(3)重啟後升級完成