張 民,李正生,吳 寧,譚 瑩
(1.第二炮兵工程大學(xué)一系,陜西 西安 710025;2.中國人民解放軍96623部隊(duì) 江西 上饒 334000)
隨著計(jì)算機(jī)技術(shù)的發(fā)展和互聯(lián)網(wǎng)應(yīng)用技術(shù)的日益普及,人類社會正步入信息化時(shí)代。網(wǎng)絡(luò)這把雙刃劍在帶給人們方便的同時(shí),也對信息安全帶來了挑戰(zhàn)。近年來,網(wǎng)絡(luò)失、泄密事件頻發(fā)。重要國家、軍事秘密的泄露、重要商業(yè)信息的丟失和個(gè)人隱私的曝光等安全問題,給國家、軍隊(duì)、企業(yè)和個(gè)人造成不可挽回的損失。如何解決網(wǎng)絡(luò)失、泄密的問題,成了擺在我們面前的一個(gè)十分棘手的問題。
防水墻是從防火墻的概念中演變出來的,防火墻是防止外部威脅向內(nèi)部延伸,而防水墻技術(shù)是防止信息從內(nèi)部向外部擴(kuò)散。防水墻系統(tǒng)的設(shè)計(jì)理念是保護(hù)用戶的敏感信息不被非法外傳、防止泄密事件發(fā)生,從而保證內(nèi)部的安全[1]。
防水墻按照應(yīng)用來講可以分為企業(yè)級和個(gè)人防水墻2種,個(gè)人防水墻應(yīng)用于規(guī)模較小的個(gè)人計(jì)算機(jī)。文中所設(shè)計(jì)的就是應(yīng)用于個(gè)人計(jì)算機(jī)的個(gè)人防水墻,其數(shù)據(jù)包處理過程如圖1所示,當(dāng)本地計(jì)算機(jī)向外發(fā)送數(shù)據(jù)時(shí),僅對本機(jī)發(fā)送的HTTP請求的數(shù)據(jù)包進(jìn)行發(fā)送,而阻止其他數(shù)據(jù)包的向外發(fā)送,從而達(dá)到防止計(jì)算機(jī)內(nèi)部資料通過HTTP協(xié)議向外泄露的目的。
圖1 數(shù)據(jù)包處理流程圖Fig.1 Data packet processing flow chart
文中所設(shè)計(jì)的個(gè)人防水墻的核心技術(shù)是對數(shù)據(jù)包的截獲、分析和處理技術(shù)。Windows操作系統(tǒng)下的數(shù)據(jù)包攔截技術(shù)從攔截分層上來說可以分為用戶級和內(nèi)核級兩類,在用戶層有Windows2000SPI等,在內(nèi)核層主要包括TDI過濾驅(qū)動程序,NDIS中間層過濾驅(qū)動程序,NDIS-HOOK驅(qū)動程序等。其中NDIS-HOOK技術(shù)以其編程方便,接口簡單,思路明確,性能穩(wěn)定,靈活度更高,功能強(qiáng)大,安全性高,安裝簡單等特點(diǎn)為大家所廣泛使用。
NDIS(network driver interface specification)是 microsoft和3Com公司開發(fā)的網(wǎng)絡(luò)驅(qū)動程序接口規(guī)范[2]。NDIS橫跨傳輸層、網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層,為傳輸層提供標(biāo)準(zhǔn)的網(wǎng)絡(luò)接口,所有的傳輸層驅(qū)動程序都需要調(diào)用NDIS接口來訪問網(wǎng)絡(luò),如圖2所示。在Windows下編寫網(wǎng)絡(luò)驅(qū)動程序時(shí),利用NDIS規(guī)范只要調(diào)用NDIS函數(shù)而不用考慮其他接口問題,為網(wǎng)絡(luò)驅(qū)動的開發(fā)提供了簡便的方法。
圖2 NDIS拓?fù)浣Y(jié)構(gòu)Fig.2 NDIS topology
NDIS支持編寫3種類型的驅(qū)動程序:Miniport驅(qū)動程序、中間驅(qū)動程序和Protocol驅(qū)動程序。其結(jié)構(gòu)[3]如圖3所示,Miniport驅(qū)動程序可以通過DNIS接口可以完成對網(wǎng)卡的操作,同時(shí)也可以被上層的驅(qū)動程序調(diào)用,來實(shí)現(xiàn)對網(wǎng)卡的操作。中間驅(qū)動程序在Miniport驅(qū)動程序和Protocol驅(qū)動程序之間,在其上下兩端分別具有一個(gè)Miniport驅(qū)動接口和一個(gè)Protocol驅(qū)動接口,上方的Miniport驅(qū)動接口與上層的Protocol驅(qū)動接口連接,下方的Protocol驅(qū)動接口與下層的Miniport驅(qū)動接口連接,相當(dāng)于在Miniport驅(qū)動程序和Protocol驅(qū)動程序之間加了一個(gè)過渡層。Protocol驅(qū)動程序與Miniport驅(qū)動程序連接,可供底層驅(qū)動程序調(diào)用[3]。
圖3 NDIS中間驅(qū)動程序拓?fù)浣Y(jié)構(gòu)Fig.3 NDIS intermediate driver topology
NDIS的數(shù)據(jù)包處理過程當(dāng)上層驅(qū)動請求發(fā)送數(shù)據(jù)包時(shí),調(diào)用Ndis send/Ndis Send Packets函數(shù),請求NDIS發(fā)送數(shù)據(jù)包,NDIS則調(diào)用NDIS中間層驅(qū)動的Miniport Send/Miniport Send Packets,NDIS中間層驅(qū)動再調(diào)用 Ndis Send/Ndis Send Packets請求底層發(fā)送數(shù)據(jù)包,底層Miniport Send/Miniport Send Packets通過NDIS接口控制物理網(wǎng)絡(luò)設(shè)備,將數(shù)據(jù)發(fā)送出去。NDIS數(shù)據(jù)包發(fā)送流程圖如圖4所示。
圖4 NDIS數(shù)據(jù)包發(fā)送流程圖Fig.4 NDIS send the packet flow
在上層請求發(fā)送數(shù)據(jù)包時(shí),上層的驅(qū)動分配了相應(yīng)的內(nèi)存空間,當(dāng)完成數(shù)據(jù)包的發(fā)送之后,系統(tǒng)應(yīng)該及時(shí)的釋放其分配的內(nèi)存空間,所以,在上層調(diào)用Ndis Send/Ndis Send Packets后,返回是除NDIS_STATUS_PENDING以外的任何值時(shí),上層驅(qū)動就可以釋放資源。因?yàn)槿绻玫椒祷氐慕Y(jié)果是NDIS_STATUS_PENDING的話,說明下層驅(qū)動還沒有完成發(fā)送請求,等下層驅(qū)動最終完成發(fā)送請求時(shí),下層驅(qū)動將調(diào)用Ndis MSend Complete請求NDIS通知上層可以釋放資源。然后系統(tǒng)調(diào)用上層驅(qū)動注冊的Protocol Send Complete函數(shù),釋放內(nèi)存資源。
NDIS-HOOK的重點(diǎn)是如何獲得特定協(xié)議對應(yīng)NDIS_PROTOCOL_BLOCK指針,獲得了該指針,接下來就可以替換該協(xié)議所注冊的收發(fā)函數(shù),而達(dá)到攔截網(wǎng)絡(luò)數(shù)據(jù)的目的。
在WindowsNT/2000下實(shí)現(xiàn)Hook目前主要有兩種不同的思路[5]:
1)修改 NDIS.SYS的 Export Table。在 WindowsNT/2000下,可執(zhí)行文件都符合 PE(Portable Executable)格式,所有向其它操作系統(tǒng)提供接口的驅(qū)動程序都有Export Table,因此只要修改NDIS.SYS所提供的 NDIS Register Protocol、NDIS DeRegister Protocol、NDIS Open Adapter、NDIS Close Adapter和NDIS Send函數(shù)的起始地址,就能實(shí)現(xiàn)對NDIS API的掛接。
2)注冊假協(xié)議(Bogus Protocol)。NDIS 調(diào)用 Ndis Register Protocol(),向系統(tǒng)注冊一個(gè)協(xié)議并將該協(xié)議作為一個(gè)鏈表節(jié)點(diǎn)插入到“協(xié)議鏈表”的頭部,最后返回該鏈表頭的地址。我們可以通過調(diào)用Ndis Register Protocol()向系統(tǒng)注冊一個(gè)新的協(xié)議,就能輕易地得到“協(xié)議鏈表”的首地址,通過訪問這個(gè)鏈表,就能修改其中關(guān)鍵函數(shù)的地址。通過調(diào)用Ndis Register Protocol()中的結(jié)構(gòu)頭指針可以遍歷所有NDIS_OPEN_BLOCK。一般需要掛鉤的函數(shù)主要在NDIS_OPEN_BLOCK中。
目前注冊假協(xié)議的方法應(yīng)用比較廣泛,文中采用了這種方法。
在發(fā)送數(shù)據(jù)包的時(shí)候,系統(tǒng)調(diào)用Ndis Send[6]函數(shù)
其中OUT PNDIS_STATUS Status返回函數(shù)調(diào)用結(jié)果。IN NDIS_HANDLE Ndis Binding Handle是由Ndis Open Adapter返回的識別目標(biāo)網(wǎng)卡或虛擬設(shè)備的句柄,其實(shí)質(zhì)就是目標(biāo)網(wǎng)卡或者虛擬設(shè)備的NDIS_OPEN_BLOCK指針。IN PNDIS_PACKET Packet指向需要發(fā)送的數(shù)據(jù)包。調(diào)用Ndis Send函數(shù),系統(tǒng)會把數(shù)據(jù)包通過IN NDIS_HANDLE Ndis Binding Handle指向的NDIS_OPEN_BLOCK結(jié)構(gòu)中記錄的Protocol Send函數(shù)發(fā)送。
用注冊假協(xié)議法發(fā)送特定數(shù)據(jù)包的步驟,如圖5所示。
圖5 NDIS-HOOK發(fā)送數(shù)據(jù)包的流程Fig.5 NDIS-HOOK send the packet flow
大致可以分為以下3步:
1)調(diào)用Register Bogus NDIS Protocol函數(shù),注冊假協(xié)議獲得指針;
2)調(diào)用 Hook Existing NDIS Protocols函數(shù),遍歷鏈表,完成程序掛鉤;
3)最后調(diào)用NDIS Send Handler發(fā)送數(shù)據(jù),完成數(shù)據(jù)的處理和發(fā)送。
所以在防水墻系統(tǒng)的設(shè)計(jì)中只要對防水墻的數(shù)據(jù)包處理程序進(jìn)行掛鉤處理,即可實(shí)現(xiàn)在Windows系統(tǒng)下對數(shù)據(jù)包的處理,實(shí)現(xiàn)防水墻的功能,達(dá)到防止非法數(shù)據(jù)傳輸?shù)哪康摹?/p>
文中簡要的介紹了防水墻技術(shù),對NDIS-HOOK技術(shù)進(jìn)行了詳細(xì)的研究,根據(jù)防水墻的特點(diǎn)著重研究了運(yùn)用HDISHOOK的數(shù)據(jù)包發(fā)送攔截技術(shù)。設(shè)想了在Windows系統(tǒng)下的個(gè)人防水墻系統(tǒng)中運(yùn)用HDIS-HOOK數(shù)據(jù)包過濾技術(shù)的方法。本文研究內(nèi)容有著廣泛的應(yīng)用前景。
[1]陳尚義.“內(nèi)鬼”克星:中軟防水墻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防火墻與網(wǎng)絡(luò)封包截獲技術(shù) [M].北京:電子工業(yè)出版社,2002.
[3]高澤勝,陶宏才.基于NDIS-HOOK技術(shù)的個(gè)人防火墻的研究與實(shí)現(xiàn)[J].成都信息工程學(xué)院學(xué)報(bào),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網(wǎng)絡(luò)封包截獲技術(shù)實(shí)現(xiàn)[J].微處理機(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的網(wǎng)絡(luò)數(shù)據(jù)包攔截和發(fā)送技術(shù)研究[J].計(jì)算機(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.