FineArt News

API Hook V.S. Driver Hook

因為一般的應用程式,都是在軟體公司已經編譯好的執行檔,功能及特性都已經固定,除了原廠的支援,無法再修改功能,而Hook 技術,則是提供第三方的軟體工程師,去”修正”這些原廠執行程式的方案,例如:在Windows上,可以直接使用外接碟,這是Windows出廠時,提供的功能,但是如果我們希望將檔案拷入外接碟時,自動備份拷出的檔案,就必須使用Hook技術,對Windows進行”修正”。

 

瞭解Windows記憶體

一般來說,Hook技分為上層的API Hook及底層的Driver Hook,我們如果要分清楚什麼是API Hook、Driver Hook?什麼是上層、底層?首先必須先對Windows的記憶體分佈有正確的認識,才能進一步瞭解這兩種技術的差異。

Windows等作業系統是使用虛擬記憶體技術,換句話說,所有人看到的記憶體位置都是虛擬的,執行程式時,再由作業系統透過一些演算法對應到真實體的記憶體。

Windows將虛擬記憶體分成上下兩半部,上半部是使用者空間,我們常見的應用程式都在這部份,由下圖可以看出,每個應用程式,都認為自己擁有整個記憶體空間,這樣的應用程式隔離方式,確保不同的程式間,不會產生互相的干擾,舉例來說,下圖的(1)說明了WINWORD.EXE及EXCEL.EXE都認為虛擬位置“0000 1000 0000 0000”這塊記憶體屬於自己,所以 WINWORD.EXE 可以自由修正此區記憶體,但是Excel的此區記憶體則不受影響。

虛擬記憶體的下半部,則是作業系統的核心,我們常見的各種驅動程式、Share Memory、Windows Kernel…等都是在此空間,但這部份的空間,則是真的大家共用,所以萬一有人修正了虛擬位置“8000 1000 0000 0000”這塊記憶體,則是大家都到影響,舉例來說,下圖的(2)說明了,如果我們修改網路封包過濾驅動程式,對網路的封包進行過濾,則所有應用程式如WINWORD.EXE及EXCEL.EXE等,有網路動作時,其網路封包都會被過濾。

 

API Hook

瞭解了Windows記憶體的分佈,就可先看看API Hook技術,承上圖,我們考慮由MyApp.EXE對WINWORD.EXE進行API Hook。

這中間有一些問題要克服,首先是兩個程式都在不同記憶體空間,我們可以想像好像在不同的世界,因此要如何入侵另一個世界,就是首要的課題,通常可以簡單的使用Windows提供的DLL Hook,如:Mouse Hook、Keyboard Hook、CBT Hook…等達成;或是使用一些較高級的技術,例如:CreateProcess、CreateThread…等多種手法強迫將Hook程式(例如:MyHook)”注入”到其他程式的記憶體空間。

其次是,注入成功後,必須在被注入的程式中,找到宿主關鍵的API,並對這些API進行替換,有關這一系列的動作,可以參考精品科技之前發佈的一些文章。

使用一個例子做說明:”MyAPP.EXE希望攔截 Office 的開檔動作”:

見下圖(1),首先必須使用”注入”手段,分別一一入侵WINWORD.EXE及EXCEL.EXE等Office程式,在成功入侵後,會將MyHook放入被入侵程式的記憶體空間。

見下圖(2),再進一步找出每個程式的"OpenFile” API,最後進行API的替代,完成API Hook。

 

Windows認為這種API Hook方式,如果設計得不好,常會造成應用程式的當機,所以自Windows 10 開始,也有反制機制,一個是 CFG ( Control Flow Guard ) 另一個是 CIG ( Code Integrity Guard )。

 

Driver Hook

Driver Hook 有很多種實作方案,我們以一個較常見的Mini Driver來說明,而Mini Driver是什麼呢?簡單的說,是Windows認為每個人都去實作Driver成本效能不划算,而且不可控,容易產生問題,所以將大部份的功能由Windows自己實作完成,將關鍵部份Call Out 給Mini Driver。

由下圖可看出,要攔截網路封包,我們僅須要寫一個 WFP 的My Mini Driver即可。

通常來說,可以有很多同類型的Mini Driver可以掛在一起,例如:對網路封包有興趣的可能不只有我們,防毒軟體通常也會有興趣對網路封包進行攔截,所以Mini Driver之間的順序就變成很重要,有可能上層的Mini Driver攔到的網路封包,不往下丟,那在下層的Mini Driver就會無法看到封包。

此外,Mini Driver因為屬於Windows核心的一部份,所以Windows通常要求Mini Driver必須送微軟簽章,有微軟簽章的Mini Driver,才會被載入核心。

 

雞尾酒式的多層次防護

在真實世界的應用中,問題更複雜,資訊安全的問題,往往不是靠單一技術即可以對應,使用不同技術間的多層次交差混用,才能確保資訊安全。

以網址的防護來說明,我們希望能偵測使用者上網的活動,所以可以設計第一層的關卡,例如:針對Browser等的軟體界面上,使用上層的API Hook技術進行攔截,如此,就可以取得使用者操作Browser的網址及傳送內容。

但很明顯地,這樣的設計還是遠遠不足,例如:如果使用特定連網程式,而不是使用Browser連接外網,或是將上層的主程式刪除( 上層負責API Hook的主程式若是被刪除,則多數的API Hook將會失效)…,這些動作都可迴避使用Hook API的技術攔截上網活動,通常來說成熟的資安軟體,一定會建立第二層或甚至第三層以上的防護,這樣可以避免將蛋都放在同一個籃子中,例如:第二層就可使用Driver Hook攔截上網活動,和API Hook兩者共同合作。

如果是使用X-FORT系統,甚至可以啟動更多層次的防護,就像雞尾酒般整合在一起,透過這樣的交差的保護,可以讓系統更安全,例如:記錄使用者的操作日誌、針對Browser等軟體進行錄影、或是使用應用程式控管來保護電腦不受駭客入侵等。

 

結論

本文件談到有關API Hook及Driver Hook的差異,說明大致的開發流程,以及Windows對這兩技術的限制,在真實世界的應用中,問題更複雜,資訊安全的問題,往往不是靠單一技術即可以對應,X-FORT 可以啟動不同技術間的多層次交差混用,如此才能確保有效控管。