張 民,李正生,吳 寧,譚 瑩
(1.第二炮兵工程大學一系,陜西 西安 710025;2.中國人民解放軍96623部隊 江西 上饒 334000)
隨著計算機技術的發展和互聯網應用技術的日益普及,人類社會正步入信息化時代。網絡這把雙刃劍在帶給人們方便的同時,也對信息安全帶來了挑戰。近年來,網絡失、泄密事件頻發。重要國家、軍事秘密的泄露、重要商業信息的丟失和個人隱私的曝光等安全問題,給國家、軍隊、企業和個人造成不可挽回的損失。如何解決網絡失、泄密的問題,成了擺在我們面前的一個十分棘手的問題。
防水墻是從防火墻的概念中演變出來的,防火墻是防止外部威脅向內部延伸,而防水墻技術是防止信息從內部向外部擴散。防水墻系統的設計理念是保護用戶的敏感信息不被非法外傳、防止泄密事件發生,從而保證內部的安全[1]。
防水墻按照應用來講可以分為企業級和個人防水墻2種,個人防水墻應用于規模較小的個人計算機。文中所設計的就是應用于個人計算機的個人防水墻,其數據包處理過程如圖1所示,當本地計算機向外發送數據時,僅對本機發送的HTTP請求的數據包進行發送,而阻止其他數據包的向外發送,從而達到防止計算機內部資料通過HTTP協議向外泄露的目的。

圖1 數據包處理流程圖Fig.1 Data packet processing flow chart
文中所設計的個人防水墻的核心技術是對數據包的截獲、分析和處理技術。Windows操作系統下的數據包攔截技術從攔截分層上來說可以分為用戶級和內核級兩類,在用戶層有Windows2000SPI等,在內核層主要包括TDI過濾驅動程序,NDIS中間層過濾驅動程序,NDIS-HOOK驅動程序等。其中NDIS-HOOK技術以其編程方便,接口簡單,思路明確,性能穩定,靈活度更高,功能強大,安全性高,安裝簡單等特點為大家所廣泛使用。
NDIS(network driver interface specification)是 microsoft和3Com公司開發的網絡驅動程序接口規范[2]。NDIS橫跨傳輸層、網絡層和數據鏈路層,為傳輸層提供標準的網絡接口,所有的傳輸層驅動程序都需要調用NDIS接口來訪問網絡,如圖2所示。在Windows下編寫網絡驅動程序時,利用NDIS規范只要調用NDIS函數而不用考慮其他接口問題,為網絡驅動的開發提供了簡便的方法。

圖2 NDIS拓撲結構Fig.2 NDIS topology
NDIS支持編寫3種類型的驅動程序:Miniport驅動程序、中間驅動程序和Protocol驅動程序。其結構[3]如圖3所示,Miniport驅動程序可以通過DNIS接口可以完成對網卡的操作,同時也可以被上層的驅動程序調用,來實現對網卡的操作。中間驅動程序在Miniport驅動程序和Protocol驅動程序之間,在其上下兩端分別具有一個Miniport驅動接口和一個Protocol驅動接口,上方的Miniport驅動接口與上層的Protocol驅動接口連接,下方的Protocol驅動接口與下層的Miniport驅動接口連接,相當于在Miniport驅動程序和Protocol驅動程序之間加了一個過渡層。Protocol驅動程序與Miniport驅動程序連接,可供底層驅動程序調用[3]。

圖3 NDIS中間驅動程序拓撲結構Fig.3 NDIS intermediate driver topology
NDIS的數據包處理過程當上層驅動請求發送數據包時,調用Ndis send/Ndis Send Packets函數,請求NDIS發送數據包,NDIS則調用NDIS中間層驅動的Miniport Send/Miniport Send Packets,NDIS中間層驅動再調用 Ndis Send/Ndis Send Packets請求底層發送數據包,底層Miniport Send/Miniport Send Packets通過NDIS接口控制物理網絡設備,將數據發送出去。NDIS數據包發送流程圖如圖4所示。

圖4 NDIS數據包發送流程圖Fig.4 NDIS send the packet flow
在上層請求發送數據包時,上層的驅動分配了相應的內存空間,當完成數據包的發送之后,系統應該及時的釋放其分配的內存空間,所以,在上層調用Ndis Send/Ndis Send Packets后,返回是除NDIS_STATUS_PENDING以外的任何值時,上層驅動就可以釋放資源。因為如果得到返回的結果是NDIS_STATUS_PENDING的話,說明下層驅動還沒有完成發送請求,等下層驅動最終完成發送請求時,下層驅動將調用Ndis MSend Complete請求NDIS通知上層可以釋放資源。然后系統調用上層驅動注冊的Protocol Send Complete函數,釋放內存資源。
NDIS-HOOK的重點是如何獲得特定協議對應NDIS_PROTOCOL_BLOCK指針,獲得了該指針,接下來就可以替換該協議所注冊的收發函數,而達到攔截網絡數據的目的。
在WindowsNT/2000下實現Hook目前主要有兩種不同的思路[5]:
1)修改 NDIS.SYS的 Export Table。在 WindowsNT/2000下,可執行文件都符合 PE(Portable Executable)格式,所有向其它操作系統提供接口的驅動程序都有Export Table,因此只要修改NDIS.SYS所提供的 NDIS Register Protocol、NDIS DeRegister Protocol、NDIS Open Adapter、NDIS Close Adapter和NDIS Send函數的起始地址,就能實現對NDIS API的掛接。
2)注冊假協議(Bogus Protocol)。NDIS 調用 Ndis Register Protocol(),向系統注冊一個協議并將該協議作為一個鏈表節點插入到“協議鏈表”的頭部,最后返回該鏈表頭的地址。我們可以通過調用Ndis Register Protocol()向系統注冊一個新的協議,就能輕易地得到“協議鏈表”的首地址,通過訪問這個鏈表,就能修改其中關鍵函數的地址。通過調用Ndis Register Protocol()中的結構頭指針可以遍歷所有NDIS_OPEN_BLOCK。一般需要掛鉤的函數主要在NDIS_OPEN_BLOCK中。
目前注冊假協議的方法應用比較廣泛,文中采用了這種方法。
在發送數據包的時候,系統調用Ndis Send[6]函數

其中OUT PNDIS_STATUS Status返回函數調用結果。IN NDIS_HANDLE Ndis Binding Handle是由Ndis Open Adapter返回的識別目標網卡或虛擬設備的句柄,其實質就是目標網卡或者虛擬設備的NDIS_OPEN_BLOCK指針。IN PNDIS_PACKET Packet指向需要發送的數據包。調用Ndis Send函數,系統會把數據包通過IN NDIS_HANDLE Ndis Binding Handle指向的NDIS_OPEN_BLOCK結構中記錄的Protocol Send函數發送。
用注冊假協議法發送特定數據包的步驟,如圖5所示。

圖5 NDIS-HOOK發送數據包的流程Fig.5 NDIS-HOOK send the packet flow
大致可以分為以下3步:
1)調用Register Bogus NDIS Protocol函數,注冊假協議獲得指針;
2)調用 Hook Existing NDIS Protocols函數,遍歷鏈表,完成程序掛鉤;
3)最后調用NDIS Send Handler發送數據,完成數據的處理和發送。
所以在防水墻系統的設計中只要對防水墻的數據包處理程序進行掛鉤處理,即可實現在Windows系統下對數據包的處理,實現防水墻的功能,達到防止非法數據傳輸的目的。
文中簡要的介紹了防水墻技術,對NDIS-HOOK技術進行了詳細的研究,根據防水墻的特點著重研究了運用HDISHOOK的數據包發送攔截技術。設想了在Windows系統下的個人防水墻系統中運用HDIS-HOOK數據包過濾技術的方法。本文研究內容有著廣泛的應用前景。
[1]陳尚義.“內鬼”克星:中軟防水墻Waterbox[J].信息安全與通信保密,2010(1):48-49.CHEN SHANG-yi. “Ghost”nemesis:waterwall of Chinasoft Waterbox[J].Information Security and Communications Privacy,2010(1):48-49.
[2]朱雁輝.Window防火墻與網絡封包截獲技術 [M].北京:電子工業出版社,2002.
[3]高澤勝,陶宏才.基于NDIS-HOOK技術的個人防火墻的研究與實現[J].成都信息工程學院學報,2004(19):327-331.GAO Ze-sheng,TAO Hong-cai.Research and implementation of personal firewall based on NDIS-HOOK[J].Journal of Chendu University of Information Technology,2004(19):327-331.
[4]Microsoft Windows 2000Driver Development Kit[S].Microsoft Press,2001.
[5]劉靜,裘國永.NDIS-HOOK網絡封包截獲技術實現[J].微處理機,2008(5):51-56.LIU Jing,QIU Guo-yong.The implementation of network packets capturing technology based on NDIS-HOOK[J].Micro Processors,2008(5):51-56.
[6]李智鵬,李舟軍,忽朝儉,等.基于NDIS-HOOK的網絡數據包攔截和發送技術研究[J].計算機安全,2010(1):5-8.LI Zhi-peng,LI Zhou-jun,HU Chao-jian,et al.Research technology of network packet intercepting and sending based on NDIS-HOOK[J].Computer Security,2010(1):5-8.