FineArt News

檔案導向簡介

如果您使用過 Linux,就會發現:檔案的重新導向是 Linux 系統中很重要的一環,它可以讓我們任意串接各種程式的輸入與輸出、將資料導入檔案或從檔案中導出資料,結合多種 Linux 指令,組成任意的「指令管線」(command pipeline)。

這樣說有點抽象,說的白話一點就是:假如您買了一張火車票,是由新竹通往高雄,因為您信任台鐵,就依車票上的資訊上了車,希望可以直達高雄,但是萬一台鐵系統出了錯呢?可能下車點就會變成台中。

我們每個人都有慣性,認為看到就是現實,但在電腦的世界中,太多虛擬的項目,必須用另一種方式去理解,檔案導向會使用虛擬的手段,欺騙我們的視覺,讓我們以為檔案儲存在虛擬的地方,但真實的檔案,卻是存在別的地方。

 

例子1:檔案總管

如果您使用 Windows 系統,可能會使用檔案總管將檔案存在 [常用]->[桌面],但是實際上並沒有這個目錄,當我們把檔案存到桌面時,實際上卻是轉存入了 C:\Users\USER\Desktop 下面,所以,我們在當案總管下面看到的桌面[常用]->[桌面]是虛擬的目錄,而真實的目錄在C:\Users\下,在不同的使用者登入的情況下,會對應不同的目錄,如下圖,這樣就可以讓每個使用者,都有自己的桌面。

使用者 檔案總管虛擬目錄 真實目錄
Dean [常用]->[桌面] C:\User\Dean\Deesktop
Ellis   C:\User\Ellis\Deesktop

 

例子 2:Junction Directory

我們可以利用「Junction Directory」的方式,來將系統碟裡的目錄指定到其它硬碟。

「Junction Directory」指的是NTFS系統特有連接方式,可以將目錄、檔案使用分身來連結,在儲存資源的共享上有很大幫助。

在 DOS Command 下,我們可以操作 Symbolic Link或Hard Link來達成「Junction Directory」。

以 Symbolic Link 為例,可以在 DOS Command 下操作 mklink 來完成,例如:

mklink /d mklink_target mklink_source

 

其中:mklink_source是一個真實而且已經存在的目錄,而mklink_target不用事先建立,會在執行上述指令後被創建出來,注意:mklink_target是一個虛擬的目錄,而在其中的內容和mklink_source的內容完全一致,例如:在mklink_target中新增或刪除一個檔案,相當於在mklink_sourc中操作。

 

這種方式建立的虛擬目錄,和捷徑建立的目錄不同,我們可以比較一下兩者的資料夾外觀:

捷徑 mklink_target Mklink 產生的虛擬目錄 mklink_target
   

 

檔案導向原理

瞭解了檔案導向,通常會配合虛擬的目錄,讓整個檔案系統更具欺騙性,但這是如何做到的呢?在此之前,我們須要瞭解,一般的程式設計是如何操作開啟檔案,搜尋檔案。

開啟檔案並且讀寫 搜尋檔案  
Open  “C:\Temp\FileA” FindFirst “C:\Temp” // 找到第一個檔案
Read / Write FindNext  //重覆, 找出其他檔案
Close    

 

可以由上看出關鍵點,在搜尋檔案、開啟檔案時,都會分別傳入我們想要開啟的目錄、檔名,以開檔為例:一但我們將Open 攔截,並且在傳入的參數中先加以替換,就可以達成檔案導向的目地,在這種情況下,使用者"以為”開啟了檔案"C:\Temp\FileA”,但實際上卻是開啟了” C:\Temp\FileB”。下面是有否進行檔案導向的比較:

原始 檔案導向Hook  
Open “C:\Temp\FileA” Open “C:\Temp\FileA”  
 ↓ ↳           攔截,替代檔名 “C:\Temp\FileB”
NTFS 開檔 NTFS 開檔       ↲

 

如何實作檔案導向

我們可以理解,在正常的系統中,是不會發生檔案導向的,我們須要以特別的方式,欺騙所有的應用程式(App),而這種特別方式,可以使用下面任一種方案實現。

第一種方案,是使用 API Hook,去攔截應用程式(App)的搜尋檔案、開啟檔案 API,通常這些應用程式會叫用Windows提供的API,而這些Windows API,就是我們要 Hook 的目標。

第二種方案,是使用 Driver 進行檔案系統的攔截,一般我們會採用2種子方案來設計這種Driver,子方案一:是微軟WDM驅動程式架構的微驅動程式(mini driver),這種架構較新,也是微軟建議的設計方案。子方案二:是legacy driver,是一種較傳統的driver 設計方案,我們可以由下圖看出,兩種不同的子方案,在Windows中的 Hook 點。

User Mode

WinWord Explorer
 ↓    ↓  
Open   Open  
 ↳ (1) API Hook Open  ↳ (1) API Hook Open
Windows API Windows API
Kernel Mode  ↓    ↓  
↓  File System  
 ↳  (2) Driver Filter ( Mini 、Legacy )  
   
NTFS

 

結論

檔案導向可以應用的情境很多,例如:沙箱(Sandbox),如果檔案導向設計良好,使用者可以很方便的存取虛擬資料夾,可以為工作上帶來很多方便性。