隨著網絡安全問題日益嚴重
網絡安全產品也被人們重視起來
防火牆作為最早出現的網絡安全產品和使用量最大的安全產品
也受到用戶和研發機構的青睐
從防火牆的應用角度來看基本上可以分為兩種
網絡級的防火牆和個人防火牆
Windows操作系統作為使用最為廣泛的PC操作系統
因此在Windows操作系統下開發的個人防火牆產品數不勝數
國外比較著名的有AtGuard
Outpost Firewall
ZoneAlarm
Tiny Personal Firewall
Norton Personal Firewall以及Sygate Personal Firewall等
國內用的比較多的有天網防火牆等產品
所有基於Windows操作系統的個人防火牆核心技術點在於Windows操作系統下網絡數據包攔截技術
本文主要講述的是Windows操作系統下網絡數據包攔截的技術
首先讀者應該對Windows網絡體系結構有一定了解
並且對開發Windows驅動程序有一定了解
Windows 網絡驅動程序結構
圖
顯示了Windows
下的網絡驅動程序結構
微軟和
Com公司在
年制定了一套開發Windows下網絡驅動程序的標准
稱為NDIS( Network Driver Interface Specification)
NDIS為網絡驅動的開發提供了一套標准的接口
使得網絡驅動程序的跨平台性更好
NDIS提供以下幾個層次的接口
?
NDIS小端口驅動(Miniport driver)
這也就是我們常說的網卡驅動
?
NDIS 協議驅動(Protocol driver)
例如TCPIP協議驅動
?
NDIS 中間層驅動(Intermediate driver)
這是基於鏈路層和IP層之間的驅動
從圖
中我們可以很清楚地看到網絡驅動的分層結構
這就給我們提供了攔截網絡數據包的基本思路
總的來說
要攔截Windows下的網絡數據包可以在兩個層面進行
用戶態(user
mode)和內核態(kernel
mode)
用戶態下的網絡數據包攔截
在用戶態下進行網絡數據包攔截有以下幾種方法
) Winsock Layered Service Provider (LSP)
這種方法在MSDN裡有很詳細的文檔
並且給出了一個例子(SPI
CPP)
這種方法的好處是可以獲得調用Winsock的進程詳細信息
這就可以用來實現QoS
數據流加密等目的
但是
如果應用程序直接通過TDI(Transport Driver Inface)調用TCPIP來發送數據包
這種方法就無能為力了
對於一些木馬和病毒來說要實現通過TDI直接調用TCPIP是一件很容易的事情
因此
大多數的個人防火牆都不使用這種方法
國內也有使用該方法實現的個人防火牆
例如Xfilter()
) Windows
包過濾接口
Windows
IPHLP API提供了安裝包過濾器的功能
但是
包過濾的規則有很多限制
對於個人防火牆來說是遠遠不夠的
) 替換系統自帶的WINSOCK動態連接庫
這種方法可以在很多文章裡面找到詳細的實現細節
很顯然
在用戶態下進行數據包攔截最致命的缺點就是只能在Winsock層次上進行
而對於網絡協議棧中底層協議的數據包無法進行處理
對於一些木馬和病毒來說很容易避開這個層次的防火牆
利用驅動程序攔截網絡數據包
大多數的個人防火牆都是利用網絡驅動程序來實現的
從圖
中我們馬上可以想到可以從以下幾個方面來做文章
?
TDI過濾驅動程序(TDI Filter Driver)
?
NDIS中間層驅動程序(NDIS Intermediate Driver)
?
Win
k Filter
Hook Driver
?
NDIS Hook Driver
以下我們大體介紹這幾種方法
具體的實現細節請參見Win
k DDK文檔
TDI過濾驅動程序
當應用程序要發送或接收網絡數據包的時候
都是通過與協議驅動所提供的接口來進行的
協議驅動提供了一套系統預定義的標准接口來和應用程序之間進行交互
在Windows
/NT下
ip
tcp
udp是在一個驅動程序裡實現的
叫做tcp
sys
這個驅動程序創建了幾個設備
DeviceRawIp
DeviceUdp
DeviceTcp
DeviceIp
DeviceMULTICAST
應用程序所有的網絡數據操作都是通過這幾個設備進行的
因此
我們只需要開發一個過濾驅動來截獲這些交互的接口
就可以實現網絡數據包的攔截
TDI層的網絡數據攔截還可以得到操作網絡數據包的進程詳細信息
這也是個人防火牆的一個重要功能
NDIS中間層驅動
中間層驅動介於協議層驅動和小端口驅動之間
它能夠截獲所有的網絡數據包(如果是以太網那就是以太幀)
NDIS中間層驅動的應用很廣泛
不僅僅是個人防火牆
還可以用來實現VPN
NAT
PPPOverEthernet以及VLan
中間層驅動的概念是在Window NT SP
之後才有的
因此對於Windows
x來說無法直接利用中間層驅動的功能
Windows DDK提供了兩個著名的中間層驅動例子
Passthru以及Mux
開發人員可以在Passthru的基礎上進行開發
Mux則實現了VLan功能
目前個人防火牆的產品還很少用到這種技術
主要的原因在於中間層驅動的安裝過於復雜
尤其是在Windows NT下
Windows
下可以通過程序實現自動安裝
但是如果驅動沒有經過數字簽名的話
系統會提示用戶是否繼續安裝
中間層驅動功能強大
應該是今後個人防火牆技術的趨勢所在
特別是一些附加功能的實現
Win
k Filter
Hook Driver
這是從Windows
開始系統所提供的一種驅動程序
該驅動程序主要是利用ipfiltdrv
sys所提供的功能來攔截網絡數據包
Filter
Hook Driver在結構非常簡單
易於實現
但是正因為其結構過於簡單
並且依賴於ipfiltdrv
sys
Microsfot並不推薦使用Filter
Hook Driver
NDIS Hook Driver
這是目前大多數個人防火牆所使用的方法
Hook的概念在Windows
x下非常流行
而且實現也很容易
在Windows
x下
驅動程序(VxD)通過使用Hook_Device_Service可以掛接NDIS所提供的所有服務
在Windows NT/
下面如何實現Hook呢?有兩種不同的思路
) 通過修改NDIS
SYS的Export Table
在Windows NT/
下
可執行文件(包括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被加載之前
另外
Windows
還提供了系統文件保護機制
因此在修改ndis
sys還需要通過修改注冊表屏蔽系統文件保護機制
) 向系統注冊假協議(fake protocol)
在Windows內核中
所有已注冊的協議是通過一個單向的協議鏈表來維護的
這個單向鏈表保存了所有已注冊協議的NDIS_PROTOCOL_BLOCK結構的地址
在這個結構中保存了協議驅動所指定的相應的派發函數的地址如RECEIVE_HANDLER等
並且
每個協議驅動還對應一個NDIS_OPEN_BLOCK的單向鏈表來維護其所綁定的網卡信息
當協議驅動調用NdisRegisterProtocol之後
NDIS總是會把新注冊的協議放在協議鏈表的表頭並返回這張表
所以只要我們注冊一個新的協議通過新協議注冊返回的鏈表頭就可以輕而易舉的遍歷系統中所有協議表
但是
如果要成功地掛接派發函數
還需要對協議所對應的NDIS_OPEN_BLOCK結構裡的派發函數進行掛接
因為NDIS並不是直接調用協議驅動在NDIS_PROTOCOL_CHARACTERISTICS所注冊的派發函數地址
而是調用NDIS_OPEN_BLOCK裡的派發函數
值得注意的是
在Windows
x/Me/NT的DDK中
NDIS_PROTOCOL_BLOCK的定義是很明確的
而在Windows
/xp的DDK中
並沒有該結構的詳細定義
也就是說該結構在Windows
/xp下是非公開的
因此開發人員需要利用各種調試工具來發掘該結構的詳細定義
也正是因為如此
這種方法對平台的依賴性比較大
需要在程序中判斷不同的操作系統版本而使用不同的結構定義
總結
本文重點描述了在WindowsNT/
/xp下個人防火牆核心技術
網絡數據包攔截技術
分析了各種可能的方法以及各種方法的優缺點
實際上許多個人防火牆結合了幾種不同的技術來在不同層面上進行網絡數據包攔截
值得說明的是
網絡數據包攔截技術不僅僅可以用來開發個人防火牆
還可以用來開發其他的產品
From:http://tw.wingwit.com/Article/Network/201311/30082.html