?? windows下的個人防火墻-網絡數據包攔截技術概覽.txt
字號:
發信人: glees (針葉林), 信區: Hacker
標 題: ◆ Windows下的個人防火墻-網絡數據包攔截技術概覽
發信站: 哈工大紫丁香 (2002年03月01日20:00:50 星期五), 站內信件
隨著網絡安全問題日益嚴重,網絡安全產品也被人們重視起來。防火墻作為最早
出現的網絡安全產品和使用量最大的安全產品,也受到用戶和研發機構的青睞。從
防火墻的應用角度來看基本上可以分為兩種:網絡級的防火墻和個人防火墻。
Windows操作系統作為使用最為廣泛的PC操作系統,因此在Windows操作系統下開發
的個人防火墻產品數不勝數。國外比較著名的有AtGuard,Outpost Firewall,
ZoneAlarm,Tiny Personal Firewall,Norton Personal Firewall以及Sygate
Personal Firewall等,國內用的比較多的有天網防火墻等產品。
所有基于Windows操作系統的個人防火墻核心技術點在于Windows操作系統下網
絡數據包攔截技術。本文主要講述的是Windows操作系統下網絡數據包攔截的技術
。首先讀者應該對Windows網絡體系結構有一定了解,并且對開發Windows驅動程序
有一定了解
微軟和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是一
件很容易的事情。因此,大多數的個人防火墻都不使用這種方法。國內也有使用該
方法實現的個人防火墻,例如Xfilter(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,這個驅動程序創建了幾個設備:\Device\RawIp,
\Device\Udp,\Device\Tcp,\Device\Ip, \Device\MULTICAST。應用程序所有的
網絡數據操作都是通過這幾個設備進行的。因此,我們只需要開發一個過濾驅動來
截獲這些交互的接口,就可以實現網絡數據包的攔截。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/NdisCloseAda
pter/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下個人防火墻核心技術-網絡數據包攔截
技術,分析了各種可能的方法以及各種方法的優缺點,實際上許多個人防火墻結合
了幾種不同的技術來在不同層面上進行網絡數據包攔截。值得說明的是,網絡數據
包攔截技術不僅僅可以用來開發個人防火墻,還可以用來開發其他的產品。
--
世界上有兩件東西能夠深深地震撼人們的心靈
一件是我們心中崇高的道德準則
另一件是我們頭頂上燦爛的星空
——伊曼努爾·康德
※ 來源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.230.221]
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -