1. 程式人生 > >NDIS截獲資料包學習筆記(一)

NDIS截獲資料包學習筆記(一)

  網路驅動程式介面規範(NDIS)是微軟為網路介面卡(NIC)的區域網驅動程式提供的一種標準應用程式介面(API)。NDIS 適用於伺服器或工作站。NDIS 標準支援計算機通過不同的通訊協議與網路相連,如:TCP/IP、IPX、NetBIOS、AppleTalk 等。

  NDIS 在資料鏈路層(第二層)的媒體控制層(MAC)執行其功能。NIC 硬體實現過程與媒體訪問控制(MAC)裝置驅動程式緊密相關,這樣利用通用程式設計介面,可以訪問同一媒體(如乙太網)的所有網路介面卡。其次 NDIS 還具有關於網路驅動程式硬體的功能庫,主要用於 MAC 驅動和更高階的協議驅動(如 TCP/IP)。利用功能庫的各種功能支援,使得 MAC 和協議驅動的開發過程變得相對簡單,同時在某種程度上,掩蓋了平臺的依賴特性。此外通過 NDIS,也可以幫助網路驅動程式維護狀態資訊和引數,包括聯接或其它系統值中涉及的指標功能、控制代碼及引數塊等。

  NDIS 支援以下網路驅動型別:

  • 小埠驅動(Miniport Driver)
  • 中間層驅動(Intermediate Driver)
  • 協議驅動(Protocol Driver)

<?XML:NAMESPACE PREFIX = O />

 

2006123231219115.GIF


Miniport driverNDIS微埠網絡卡驅動,位於最底層,直接操縱網絡卡並且對高層驅動提供介面,也是我們常說的網絡卡驅動。

Intermediate driversNDIS中間層驅動(IMD驅動),這是界於鏈路層和網路層之間的驅動,這就是今天的主角,位於13之間

Protocol driversNDIS協議驅動,高層協議驅動,俗稱為

TDI(傳輸驅動程式介面),高於前面兩層,直接面向用戶級,為使用者提供網路服務,也就是絕大多數程式所用到的網路介面。例如TCP/IP協議驅動。

IMD驅動

IMD中間層,它的實質很簡單,最經典的描述莫過於下面的話:

An intermediate driver is typically layered over one or more NDIS NIC drivers and under a transport driver (possibly multilayered) that supports TDI at its upper edge.

An NDIS intermediate driver exports MiniportXxx functions at its upper edge and ProtocolXxx functions at its lower edge.

(見DDK文件)

中間層插入網絡卡和協議層之間,對上面的協議層表現為一個虛擬的微埠網絡卡結構,而對下面的網絡卡則表現為一個協議層的結構。所以,無論是網絡卡接收並上傳的資料報,還是上層要下送至網絡卡傳送的資料報,無一例外地要經過中間層。所以,我們可以在中間層加入我們想要過濾的資料報的特徵,實現基於中間層驅動的核心級包過濾。這樣做的優勢非常明顯,首先,在驅動級別上做過濾,無須組包,速度快,效率自然就高;其次,所有的資料報無一例外,只要網絡卡上傳的資料報均可以截獲,避免了使用者級無法得到所有資料報的缺點。當然,世界上沒有完美的事情。IMD包過濾技術也存在其不可避免的缺點,與作業系統版本關係密切,與硬體聯絡大,可移植性低。我在除錯這個驅動的時候,就碰到了無數次藍屏,無數次重啟動,進了幾次安全模式,甚至還為此重新安裝了一次系統。

總的來說,要攔截Windows下的網路資料包可以在兩個層面進行:使用者態(user-mode)和核心態(kernel-mode

使用者態下的網路資料包攔截

在使用者態下進行網路資料包攔截有以下幾種方法:

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

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

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

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

利用驅動程式攔截網路資料包

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

1TDI過濾驅動程式(TDI Filter Driver

2NDIS中間層驅動程式(NDIS Intermediate Driver

3Win2k Filter-Hook Driver

4NDIS Hook Driver

 

TDI過濾驅動程式。當應用程式要傳送或接收網路資料包的時候,都是通過與協議驅動所提供的介面來進行的。協議驅動提供了一套系統預定義的標準介面來和應用程式之間進行互動。在Windows 2000/NT下,ip,tcp,udp是在一個驅動程式裡實現的,叫做tcp.sys,這個驅動程式建立了幾個裝置:DeviceRawIpDeviceUdpDeviceTcpDeviceIp DeviceMULTICAST。應用程式所有的網路資料操作都是通過這幾個裝置進行的。因此,我們只需要開發一個過濾驅動來截獲這些互動的介面,就可以實現網路資料包的攔截。TDI層的網路資料攔截還可以得到操作網路資料包的程序詳細資訊,這也是個人防火牆的一個重要功能。

 

NDIS中間層驅動。中間層驅動介於協議層驅動和小埠驅動之間,它能夠截獲所有的網路資料包(如果是乙太網那就是以太幀)。NDIS中間層驅動的應用很廣泛,不僅僅是個人防火牆,還可以用來實現VPNNATPPPOverEthernet以及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.sysMicrosfot並不推薦使用Filter-Hook Driver

 

NDIS Hook Driver。這是目前大多數個人防火牆所使用的方法。Hook的概念在Windows9x下非常流行,而且實現也很容易。