Windows下的個人防火牆-網絡數據包攔截技術概覽


隨 着網絡安全問題日益嚴重,網絡安全產品也被人們重視起來。防火牆作爲最早出現的網絡安全產品和使用量最大的安全產品,也受到用戶和研發機構的青睞。從防火 牆的應用角度來看基本上可以分爲兩種:網絡級的防火牆和個人防火牆。Windows操作系統作爲使用最爲廣泛的PC操作系統,因此在Windows操作系 統下開發的個人防火牆產品數不勝數。國外比較著名的有AtGuard,Outpost Firewall,ZoneAlarm, Tiny Personal Firewall,Norton Personal Firewall以及 Sygate Personal Firewall等,國內用的比較多的有天網防火牆等產品。 

 

所有基於Windows操作系統的 個人防火牆核心技術點在於Windows操作系統下網絡數據包攔截技術。本文主要講述的是Windows操作系統下網絡數據包攔截的技術。首先讀者應該對 Windows網絡體系結構有一定了解,並且對開發Windows驅動程序有一定了解。 

Windows 網絡驅動程序結構 

圖1顯示了Windows 2000下的網絡驅動程序結構。 

微 軟和3Com公司在1989年制定了一套開發Windows下網絡驅動程序的標準,稱爲NDIS ( Network Driver Interface Specification)。NDIS爲網絡驅動的開發提供了一套標準的接口,使得網絡驅動程 序的跨平臺性更好。NDIS提供以下幾個層次的接口: 

?1、NDIS小端口驅動(Miniport driver)。這也就是我們常說的網卡驅動。 

?2、NDIS 協議驅動(Protocol driver)。例如TCPIP協議驅動。 

?3、NDIS 中間層驅動(Intermediate driver)。這是基於鏈路層和IP層之間的驅動。 

從圖1中我們可以很清楚地看到網絡驅動的分層結構,這就給我們提供了攔截網絡數據包的基本思路。 

總的來說,要攔截Windows下的網絡數據包可以在兩個層面進行:用戶態(user-mode)和內核態(kernel-mode) 

用戶態下的網絡數據包攔截 

在用戶態下進行網絡數據包攔截有以下幾種方法: 

1)  Winsock Layered Service Provider (LSP)。這種方法在MSDN裏有很詳細的文檔,並且給出了一個例子 (SPI.CPP)。這種方法的好處是可以獲得調用Winsock的進程詳細信息。這就可以用來實現QoS,數據流加密等目的。但是,如果應用程序直接通 過TDI(Transport Driver Inface)調用TCPIP來發送數據包,這種方法就無能爲力了。對於一些木馬和病毒來說要實現通過 TDI直接調用TCPIP是一件很容易的事情。因此,大多數的個人防火牆都不使用這種方法。國內也有使用該方法實現的個人防火牆,例如Xfilterhttp://www.xfilter.com/)。 

2) Windows 2000 包過濾接口。Windows 2000 IPHLP API提供了安裝包過濾器的功能。但是,包過濾的規則有很多限制,對於個人防火牆來說是遠遠不夠的。 

3) 替換系統自帶的WINSOCK動態連接庫。這種方法可以在很多文章裏面找到詳細的實現細節。 

很顯然,在用戶態下進行數據包攔截最致命的缺點就是只能在Winsock層次上進行,而對於網絡協議棧中底層協議的數據包無法進行處理。對於一些木馬和病毒來說很容易避開這個層次的防火牆。 


利用驅動程序攔截網絡數據包 

大多數的個人防火牆都是利用網絡驅動程序來實現的。從圖1中我們馬上可以想到可以從以下幾個方面來做文章: 

? 1、TDI過濾驅動程序(TDI Filter Driver) 

? 2、NDIS中間層驅動程序(NDIS Intermediate Driver) 

? 3、Win2k Filter-Hook Driver 

? 4、NDIS Hook Driver 

以下我們大體介紹這幾種方法。具體的實現細節請參見Win2k DDK文檔。 

TDI 過濾驅動程序。當應用程序要發送或接收網絡數據包的時候,都是通過與協議驅動所提供的接口來進行的。協議驅動提供了一套系統預定義的標準接口來和應用程序 之間進行交互。在Windows 2000/NT下,ip,tcp,udp是在一個驅動程序裏實現的,叫做tcp.sys,這個驅動程序創建了幾個設備: DeviceRawIp,DeviceUdp,DeviceTcp,DeviceIp, DeviceMULTICAST。應用程序所有的網絡數據操作都 是通過這幾個設備進行的。因此,我們只需要開發一個過濾驅動來截獲這些交互的接口,就可以實現網絡數據包的攔截。TDI層的網絡數據攔截還可以得到操作網 絡數據包的進程詳細信息,這也是個人防火牆的一個重要功能。 

NDIS中間層驅動。中間層驅動介於協議層驅動和小端口驅動之間,它能夠截獲 所有的網絡數據包(如果是以太網那就是以太幀)。NDIS中間層驅動的應用很廣泛,不僅僅是個人防火牆,還可以用來實現VPN,NAT, PPPOverEthernet以及VLan。中間層驅動的概念是在Window NT SP4之後纔有的,因此對於Windows9x來說無法直接利用 中間層驅動的功能。Windows DDK提供了兩個著名的中間層驅動例子:Passthru以及Mux。開發人員可以在Passthru的基礎上進行開 發,Mux則實現了VLan功能。目前個人防火牆的產品還很少用到這種技術,主要的原因在於中間層驅動的安裝過於複雜,尤其是在Windows NT下。 Windows 2000下可以通過程序實現自動安裝,但是如果驅動沒有經過數字簽名的話,系統會提示用戶是否繼續安裝。中間層驅動功能強大,應該是今後 個人防火牆技術的趨勢所在,特別是一些附加功能的實現。 

Win2k Filter-Hook Driver。這是從 Windows2000開始系統所提供的一種驅動程序,該驅動程序主要是利用ipfiltdrv.sys所提供的功能來攔截網絡數據包。Filter- Hook Driver在結構非常簡單,易於實現。但是正因爲其結構過於簡單,並且依賴於ipfiltdrv.sys,Microsfot並不推薦使用 Filter-Hook Driver。 

NDIS Hook Driver。這是目前大多數個人防火牆所使用的方法。Hook的概念在 Windows9x下非常流行,而且實現也很容易。在Windows9x下,驅動程序(VxD)通過使用Hook_Device_Service可以掛接 NDIS所提供的所有服務。在Windows NT/2000下面如何實現Hook呢?有兩種不同的思路: 

1) 通過修改 NDIS.SYS的Export Table。在Windows NT/2000下,可執行文件(包括DLL以及SYS)都是遵從PE (Portable Executable)格式的。所有向其他操作系統組件提供接口的驅動程序都有Export Table,因此只要修改 NDIS.SYS的Export Table就可以實現對關鍵NDIS API的掛接。由於協議驅動程序在系統啓動的時候會調用 NdisRegisterProtocol來向系統進行協議註冊,因此這種方法關鍵在於修改NDIS.SYS所提供的 NdisRegisterProtocol/NdisDeRegisterProtocol/NdisOpenAdapter/NdisCloseAdapter/NdisSend 函數的起始地址。我們知道,在用戶態模式要修改PE文件格式可以用一些API來實現,而NDIS.SYS位於系統的核心內存區,因此要修改 NDIS.SYS就不得不通過寫驅動程序來實現,也就要求我們對PE文件格式有比較深入的瞭解。使用這種方法還要注意驅動程序的加載次序,顯然 Hook Driver必須在NDIS.SYS被加載之後,而在協議驅動程序如tcpip.sys被加載之前。另外,Windows2000還提供了系統 文件保護機制,因此在修改ndis.sys還需要通過修改註冊表屏蔽系統文件保護機制。 

2) 向系統註冊假協議 (fake protocol)。在Windows內核中,所有已註冊的協議是通過一個單向的協議鏈表來維護的。這個單向鏈表保存了所有已註冊協議的 NDIS_PROTOCOL_BLOCK結構的地址,在這個結構中保存了協議驅動所指定的相應的派發函數的地址如RECEIVE_HANDLER等。並 且,每個協議驅動還對應一個NDIS_OPEN_BLOCK的單向鏈表來維護其所綁定的網卡信息。當協議驅動調用 NdisRegisterProtocol之後,NDIS總是會把新註冊的協議放在協議鏈表的表頭並返回這張表,所以只要我們註冊一個新的協議通過新協議 註冊返回的鏈表頭就可以輕而易舉的遍歷系統中所有協議表。但是,如果要成功地掛接派發函數,還需要對協議所對應的NDIS_OPEN_BLOCK結構裏的 派發函數進行掛接,因爲NDIS並不是直接調用協議驅動在NDIS_PROTOCOL_CHARACTERISTICS所註冊的派發函數地址,而是調用 NDIS_OPEN_BLOCK裏的派發函數。值得注意的是,在Windows9x/Me/NT的DDK中,NDIS_PROTOCOL_BLOCK的定 義是很明確的,而在Windows 2000/xp的DDK中,並沒有該結構的詳細定義,也就是說該結構在Windows2000/xp下是非公開的,因 此開發人員需要利用各種調試工具來發掘該結構的詳細定義。也正是因爲如此,這種方法對平臺的依賴性比較大,需要在程序中判斷不同的操作系統版本而使用不同 的結構定義。 

總結 

本文重點描述了在WindowsNT/2000/xp下個人防火牆核心技術-網絡數據包攔截技術,分析 了各種可能的方法以及各種方法的優缺點,實際上許多個人防火牆結合了幾種不同的技術來在不同層面上進行網絡數據包攔截。值得說明的是,網絡數據包攔截技術 不僅僅可以用來開發個人防火牆,還可以用來開發其他的產品。 

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章