標籤:osi 網路架構 ndis 協議驅動 小連接埠驅動
對網路編程感興趣的朋友可能都聽過 OSI 七層模型,下面一張便是在 Windows 下實現的整個協議的結構圖。
Windows 下的 OSI 七層模型的實現結構 +-------------------------------+ | Ws2_32.dll | +-------------------------------+ UserMode | | +-------------------------------+ | msafd.dll | +-------------------------------+ | System Call | | File Operation |---------------------------------------------------------------------- | | +-------------------------------+ | afd.sys | | \Device\Afd | +-------------------------------+ Kernel Mode | File Operation | | IRP | +----------------------------------------+ | tcpip.sys | ( Tdi layer ) --- 傳輸層 | \Device\Tcp \Device\Udp \Device\RawIp | ( Ndis Protocol ) --- 網路層 +----------------------------------------+ | Ndis lib | | | +-------------------------------+ | k57xp32.sys | ( Miniport ) --- 鏈路層 +-------------------------------+ | Net Interface Card | --- 物理層 +-------------------------------+
簡單來講, Windows 對網路部分的實現分為兩部分,使用者態部分和核心態部分。使用者態部分為標準的 socket 調用,一般情況下可以認為有 ws2_32.dll 和 msafd.dll 組成,msafd.dll 為一個服務提供者,主要完成 socket 使用者層的代碼實現, 在核心態 socket 的實現由 afd.sys 實現,它主要建立裝置 \Device\Afd 來與 msafd.dll 進行互動,完成
socket 的建立等其它操作。
tcp/ip 協議的傳輸層和網路層實現是在 tcpip.sys 裡完成的,它主要完成兩部分工作,傳輸層實現和網路層實現,在傳輸層部分完成 TCP, UDP, RawIp 的綁定,串連等功能,主要服務於 afd.sys 發下來的 TDI 命令,然後進入到網路層,來完成路由以及 IP 包的構成,網路層部分相當於一個 Ndis 協議驅動,一般來講它會綁定所有的網卡來監聽和發送 IP 包。
鏈路層在筆者的電腦上是由 k57xp32.sys 驅動完成,不同的網卡此驅動可能不同,它相當於一個 Ndis Miniport 驅動,和 Ndis 協議驅動一樣,都是運行在 Ndis 庫營造的一個運行環境中,主要完成例如以內網資料包的構成,操作網卡發送資料包,以及註冊中斷接收資料包以及其它資訊的工作。
物理層,當然由網卡硬體來實現。
有了上面清晰的結構之後,我們要開發一些業務就會非常明白的知道它工作在哪裡,比如 TDI 防火牆,就可以直接附加到 tcpip.sys 建立的幾個命名裝置對象上面,就可以監聽到 afd.sys 發下來的 TDI 命令,進而可以攔截,一些 socket 建立,綁定,發送和接收的命令,從而完成防火牆的功能。當然,如果別人直接註冊一個協議驅動,然後直接進行發包,那麼這個防火牆就不能對這樣的操作對待監控,比如直接發 ARP 包到區域網路中,就可以造成攻擊。但是如果你的防火牆工作在鏈表層上面,即註冊一個中介層驅動來完成防火牆的功能,那麼就又可以攔截掉我剛才假設的那種操作,所以如果一個 Ndis 中介層驅動來完成防火牆功能,那麼就可以有更大的監控範圍。再比如,想實現一個虛擬網卡,那麼就可以完成一個 Ndis 小連接埠驅動,來讓其它協議對你進行綁定,一些應用程式就可以直接選擇這張網卡進行資料處理,便可完成一些特殊工作了。
總之,有多靈活的思路,就可以完成多靈活的功能。
Windows 實現的 OSI 七層模型結構圖