FineArt News

親愛的,「誰」把檔案變不見了

"達文西密碼"一文中,主人公羅柏.蘭登,憑藉著豐富的符號學知識,一步一步地,解開聖杯和錫安會兩千年間守護的祕密,所以瞭解原理,進一步擴展成解決方案,才能協助我們使用檔案系統的"達文西密碼"找出隱藏檔案的兇手。

首先,檔案總管要瀏覽檔案時,會先使用UserMode 中的FindFirst FindNext FindClose 3 個API取得所有的檔案列表(見下圖1),而實際上這3個UserMode API,只是瀏覽檔案API的進入點,它們會將命令往下傳入KernelMode中的檔案系統,這裏裡才是真正處理檔案的地方(見下圖2)。

當真正的檔案系統取得要瀏覽檔案的列表後,就反向往上傳回,我們可以在檔案系統過濾器X這邊(見下圖 3),對回傳的瀏覽檔案列表進行過濾,例如:故意刪除檔案列表中的某一個檔案,不讓它往上傳遞,這樣就可以造成隱藏檔案的假象。

如果不使用上面的方法,也可以在 UserMode 返回的檔案列表中動手腳(當初是由FindFirst FindNext FindClose 3 個API進入),我們也可以依樣畫葫蘆,當這3個UserMode API取回檔案列表後,進行過濾(見下圖4),這樣也同樣可以造成隱藏檔案的假象。

最後,就是應用程式本身(檔案總管),可以在取得的檔案列表顯示給使用者之前,再進行一次過濾,只保留要顯示的檔案列表給使用者看。(見下圖5)

所以,當使用者要瀏覽檔案的時候,我們至少可以有3種方法,攔截整個瀏覽檔案的過程(見上圖3,4,5),這3種方案,分別對應不同的技術實現。

 

如何實作隱藏檔案?

當我們充分的理解,應用程式的整個檔案瀏覽過程,以及檔案瀏覽中可以部署的攔截點,就可以進一步討論,誰把檔案變不見了。

前文討論的攔截點就是如何隱藏檔案的實作方案,基本上的想法,就是透過刪除部份檔案系統傳回的檔案列表。將要隱藏的檔案,由列表中偷偷刪除,也就是傳回一個不完整的列表,這樣,在上層的應用程式,因為拿到不完整的檔案列表,只能顯示我們過濾後的部份,這樣就可以造成隱藏檔案的假象。

上圖5 的實作方案,必須使用KernelMode 中的檔案過濾器,一般來說,會實作一個 MiniFilter,來過濾由真正的檔案系統中(例如:NTFS),傳回的檔案列表。

上圖4 的實作方案,通常會使用 API Hook,去攔截 FindFirst FindNext FindClose 3 個API,並透過修改3 個API的傳回列表,達成隱藏檔案的目地。

上圖4,5 的兩種方案,併不需要修改原始的應用程式,很適合第3 方對檔案進行隱藏,外部的入侵,一般都使用這兩種方案,來隱藏特定的檔案。

上圖的3方案,只適合特定的應用程式,這些應用程式在設計的初期,就已經決定可以隱藏哪些檔案,其中最明顯的例子,就是檔案總管,可以透過其上方的選單,選擇隱藏或顯示Windows的系統檔案。

 

親愛的, '誰'把檔案變不見了

有了前文的理論基礎,我們可以反向思考,如何破解隱藏檔案。

第一步:寫一個KernelMode 中的檔案過濾器 Y(MiniFilter),而且因為檔案過濾器可能很多,所以過濾的順序很重要,要僅量貼近真正的檔案系統,這樣才能在別人(例如: 檔案系統過濾器X)取得過濾檔案列表之前,取到真正的檔案列表A。

第二步:在高階,正常地使用FindFirst FindNext FindClose 3 個API,取到檔案列表B。

第三步:比對檔案列表A、B,如果檔案列表兩者相同,就是沒有隱藏檔案,反之,差異的檔案,就是被隱藏的檔案。

 

結論

事實上,在有心算無心之下,我們很難發現有檔案被隱藏,要觀察檔案是不是被隱藏起來,主要是透過比對檔案列表的方法,基本上我們可以設計一個陷阱,在陷阱之前跟之後,分別產生兩份檔案列表(見上圖)進行比對,如果兩者不同,那就表示在陷阱之中,有隱藏檔案的手段,必須進一步詳查。

上面介紹的,只是破解隱藏檔案,其中一種實作的方案,其實還有很多變形的方案,有興趣讀者的可以依此精神,自行發揮。