最近看了許多關於防火牆的包攔截方式,有比較全的,但依然不是很清楚,現將各個網絡上的資源整理下。
網絡防火牆都是基於數據包的攔截技術之上的。在 Windows 下,數據包的攔截方式有很多種,其原理和實現方式也千差萬別。總的來說,可分為“用戶級”和“內核級”數據包攔截兩大類。
用戶級下的數據包攔截方式有:
- Winsock Layered Service Provider (LSP)
- Win2K 包過濾接口 (Win2K Packet Filtering Interface)
- 替換 Winsock 動態鏈接庫 (Winsock Replacement DLL)
- 掛鈎WinsockAPI
內核級下的數據包攔截方式有:
- TDI過濾驅動程序 (TDI-Filter Driver)
- NDIS中間層驅動程序 (NDIS Intermediate Driver)
- Win2K Filter-Hook Driver
- Win2K Firewall-Hook Driver
- NDIS-Hook Driver
下面再說說各種截包方式的特點:
1)Winsock Layered Service Provider (LSP)
該方式也稱為 SPI (Service Provider Interface) 截包技術。SPI是由 Winsock2 提供的一個 接口,它需要用戶機上安裝有 Winsock 2.0。Winsock2 SPI 工作在 API 之下的 Driver 之上,可以截獲所有基於 Socket 的網絡數據包。
優點:以DLL形式存在,編程方便,調試簡單。數據封包比較完整,未做切片,便於做內容過濾。
缺點:攔截不夠嚴密,對於不用 Socket 的網絡通訊則無法攔截 (如 ICMP),木馬病毒很容易繞過。
這種技術的典型代表有費爾個人防火牆(xfilter)的早期版本,天網個人防火牆的早期版本等。
2)Win2000 Packet Filtering Interface
這是 Win2000 中一組 API 提供的功能 (PfCreateInterface, PfAddFiltersToInterface, ...),主要是運用頭文件IPHlpApi.h中的接口函數。
優點:接口簡單,不用改動客戶機和主機上的應用程序,與應用層無關,實現起來不是非常難。
缺點:功能過於簡單,只能提供IP和端口的過濾,可能無法滿足防火牆的復雜需求。處於 API 層,木馬病毒容易繞過。只能在 Win2K 以上(含)系統中使用。
3)Winsock Replacement DLL
這種方法通過替換系統 Winsock 庫的部分導出函數,實現數據報的監聽和攔截。Windows提供了許多用於網絡連接的API函數,這些函數通過一些DLL(動態鏈接庫)文件導出,在WindowsXP系統中它是“ws2_32.dll”。
由於DLL文件是通過文件名來查找目標文件的,因此我們可以編寫一個DLL文件,然后將系統中的“ws2_32.dll”文件改為其它名字如“bak_ws2_32.dll”,再將自己編寫的文件命名為“ws2_32.dll”,當然我們必須自己導出“ws2_32.dll”中的所有導出函數。這樣當應用程序調用WinsockAPI時,它實際調用的是我們自己編寫的DLL文件,這就給了我們一個進行過濾的機會。我們可以返回失敗,也可以直接調用“bak_ws2_32.dll”中的同名函數來轉發。
這種方法的缺點之一是工作量太大,因為“ws2_32.dll”提供的導出函數多達上百個;另一個缺點就是要考慮系統版本的問題,移植性太差。因為每次當系統版本改變后,Windows都可能會對一些系統文件進行修改,這就迫使我們必須自己考慮到所有的系統版本。二是由於工作在 Winsock 層,所以木馬病毒容易繞過。
4)掛鈎WinsockAPI
掛鈎WinsockAPI沒有了替換系統文件的麻煩,因為我們可以僅考慮自己關注的API函數,對其它函數不作處理。
但是采用何種方法掛鈎卻是一個問題。
如果在用戶模式下進行掛鈎,那么為了實現全局有效,我們必須把HOOK用的DLL文件注入到所有進程中,這可能導致某些進程崩潰。
如果在內核模式下進行掛鈎,由於WinsockAPI沒有經過SSDT的轉發,我們無法使用較為穩定的SSDTHOOK,而只能使用inlinehook。inlinehook相對SSDTHOOK來說不夠穩定,而且我們不得不考慮各個函數的不同實現,通常還需要反匯編引擎的輔助才能實現掛鈎。
5)TDI-Filter Driver
TDI 的全稱是 Transport Driver Interface。傳輸層過濾驅動程序通過創建一個或多個設備對象直接掛接到一個現有的驅動程序之上。當有應用程序或其它驅動程序調用這個設備對象時,會首先映射到過濾驅動程序上,然后由過濾驅動程序再傳遞給原來的設備對象。
當應用程序需要進行發送或接收網絡數據包的時候,都是通過協議驅動所提供的接口來進行的。協議驅動提供了一套系統預定義的標准接口來和應用程序之間進行交互。在Windows2000/NT下,IP、TCP、UDP是在一個驅動程序里實現的,叫做“TCPIP.sys”,這個驅動程序創建了幾個特殊設備:\Device\RawIp、\Device\Udp、\Device\Tcp、\Device\Ip、\Device\MultiCast,應用程序所有的網絡數據操作都是通過這幾個設備進行的。因此,我們只需要開發一個過濾驅動來截獲這些交互的接口,就可以實現網絡數據包的攔截。TDI層的網絡數據攔截還可以得到操作網絡數據包的進程詳細信息,這也是個人防火牆的一個重要功能。
優點:能獲取到當前進程的詳細信息,這對開發防火牆尤其有用。
缺點:驅動位於 tcpip.sys 之上,所以沒有機會得到那些由 tcpip.sys 直接處理的包,比如ICMP。TDI驅動需要重啟系統方能生效。
6)NDIS Intermediate Driver
NDIS的全稱是NetworkDriverInterfaceSpecification,即網絡驅動接口規范,也稱之為 IM Driver。它是微軟為網絡接口卡(NIC)的局域網驅動程序提供的一種標准應用程序接口(API)。NDIS適用於服務器或工作站。NDIS標准支持計算機通過不同的通信協議與網絡相連,如:TCP/IP、IPX、NetBIOS、AppleTalk等。
NDIS支持以下網絡驅動類型:小端口驅動(MiniportDriver)、中間層驅動(IntermediateDriver)、協議驅動(ProtocolDriver)。
中間層驅動介於協議層驅動和小端口驅動之間,它能夠截獲所有的網絡數據包(如果是以太網那就是以太幀)。NDIS中間層驅動的應用很廣泛,不僅僅是個人防火牆,還可以用來實現VPN,NAT,PPPOverEthernet以及VLan。它主要是在網絡層和鏈路層之間對所有的數據包進行檢查,因而具有強大的過濾功能。它能截獲所有的數據包。可參考DDK中附帶的例子Passthru,中間層驅動的概念是在WindowNTSP4之后才有的,因此對於Windows9x來說無法直接利用中間層驅動的功能。
優點:功能非常強大,應用面廣泛,不僅僅是防火牆,還可以用來實現VPN,NAT 和 VLan 等。
缺點:編程復雜,難度較大。中間層驅動的概念是在 WinNT SP4 之后才有的,因此 Win9X 無法使用。不容易安裝,自動化安裝太困難。
中間層驅動功能強大,目前很多商業級別的個人防火牆都是使用的這種技術,例如卡巴斯基反黑客(KasperskyAnti-Hacker)防火牆。
7)Win2000 Filter-Hook Driver
這是從 Win2000開始提供的一種機制,該機制主要利用 ipfiltdrv.sys 所提供的功能來攔截網絡數據包。Filter-Hook Driver 的結構非常簡單,易於實現。但是正因為其結構過於簡單,並且依賴於 ipfiltdrv.sys,微軟並不推薦使用。
可參考 CodeProject 上的例子:http://www.codeproject.com/KB/IP/drvfltip.aspx
優點:結構簡單,易於實現;能截獲所有的IP包(包括ICMP包)。
缺點:工作於內核進程中,無法取得當前應用程序進程的信息;雖能截獲所有IP包,但無法取得數據包的以太幀(Ethernet Frame);只能在 Win2000 以上(含)系統中使用。
8)Win2000 Firewall-Hook Driver
這是一種和 Win2000 Filter-Hook Driver 差不多的機制,所不同的是,Firewall-Hook Driver 能在 IP Driver 上掛接多個回調函數,所以和前者相比,它引起沖突的可能性更小一些。
可參考 CodeProject 上的例子:http://www.codeproject.com/KB/IP/FwHookDrv.aspx這種方式的優缺點和 Win2000 Filter-Hook Driver 基本相同。
9)NDIS-Hook Driver
NDIS-HOOK Driver也是應用比較常見的一種方法。它的實現原理是安裝鈎子到ndis.sys中,替換其中的某些關鍵函數,從而達到截包的目的。
它相比NDIS中間層驅動來說優點更多,例如它安裝簡單,可即時安裝和卸載驅動,無需重啟系統;同樣能截獲所有的IP包,而且能同時取得數據包的以太幀(EthernetFrame);能在Win98及其以上的系統中使用等。
優點:安裝簡單,可即時安裝和卸載驅動,無需重啟系統。能截獲所有的IP包,同時能取得數據包的以太幀(Ethernet Frame)。安全性高,木馬病毒不容易穿透。在大多數情況下,能獲取到當前應用程序的進程信息。能在 Win98 以上(含)系統中使用。
缺點:接收數據包、或偶爾發送數據包時,驅動工作在內核進程中,無法獲得應用程序進程信息。
使用這種技術的防火牆代表有Comodo防火牆(ComodoFirewallPro)等,但它的開發需要對驅動編程非常熟悉,難度較大。