張輝
摘 要:論文提供了一種Windows防火墻設(shè)計方案,它是基于Windows 2000操作系統(tǒng)、DDK for Windows 2000工具開發(fā)包以及VC++6.0等平臺而開發(fā)的程序。該程序按照功能模式劃分,可分為兩大塊內(nèi)容,一個是Filter_Hook Driver驅(qū)動,另一個就是用戶操作界面了。在這里,F(xiàn)ilter_Hook Driver驅(qū)動的作用是注冊過濾鉤子回調(diào)函數(shù),并且按照用戶提供的過濾規(guī)則進(jìn)行數(shù)據(jù)包的過濾;用戶操作界面的作用是實現(xiàn)用戶自定義去增添與刪減過濾規(guī)則,用戶并且可以自行以文件形式來保存增添進(jìn)來的過濾規(guī)則。
關(guān)鍵詞:網(wǎng)絡(luò)驅(qū)動;防火墻;回調(diào)函數(shù)
中圖分類號: TP309 文獻(xiàn)標(biāo)識碼:B
1 引言
Internet的高速發(fā)展對人們的生活習(xí)慣、事物認(rèn)知都產(chǎn)生了巨大的改變。人們體驗著互聯(lián)網(wǎng)在生活上所帶來的全新感知,習(xí)慣著信息時代所帶來的各種的便利。然而,網(wǎng)絡(luò)在給大家?guī)砩畋憷耐瑫r,也給人們的安全帶來了威脅。防火墻作為一種重要的網(wǎng)絡(luò)安全技術(shù),越來越發(fā)揮著重要的作用。
防火墻的作用是按用戶自定義的規(guī)則來過濾對其所抓取的數(shù)據(jù)包,因此防火墻設(shè)計的核心任務(wù)就是要實現(xiàn)對數(shù)據(jù)包的抓取。抓取數(shù)據(jù)包也有很多方法,比較簡單的方法是使用一個基于Windows平臺的免費公共網(wǎng)絡(luò)訪問系統(tǒng)—Winpcap(Windows Packet Capture),但Winpcap的主要功能是獨立于主機協(xié)議(如TCP/IP)去發(fā)送和接收原始數(shù)據(jù)的。這就意味著,Winpcap并不能夠阻塞、過濾或者控制其它的應(yīng)用程序?qū)?shù)據(jù)包的接收和發(fā)送,它的作用僅僅是監(jiān)聽網(wǎng)絡(luò)上傳送的數(shù)據(jù)包。使用Win2000 DDK中提供的Filter-Hook Driver驅(qū)動(過濾鉤子驅(qū)動)來實現(xiàn)數(shù)對據(jù)包的過濾是一個更好的選擇[1,2]。
2 程序設(shè)計方案
如圖1所示,基于網(wǎng)絡(luò)驅(qū)動的Windows防火墻設(shè)計可以分成兩個部分,用戶界面代碼部分和過濾鉤子驅(qū)動代碼部分。而過濾鉤子驅(qū)動代碼部分又是依賴于網(wǎng)絡(luò)適配器模塊,網(wǎng)絡(luò)適配器模塊是基于IP Filter_Hook代碼和網(wǎng)絡(luò)適配器代碼兩部分。也就是說只要將IP Filter_Filter代碼以及網(wǎng)絡(luò)適配器驅(qū)動代碼做出編寫,那么這個設(shè)計的過濾鉤子驅(qū)動代碼部分也就能夠有了大概的輪廓;在用戶界面代碼部分,只要通過基礎(chǔ)的代碼編寫出簡易的用戶界面即可。
利用在Windows 2000 DDK中所介紹的Filter-Hook Driver驅(qū)動來實現(xiàn)對所有的進(jìn)出接口的數(shù)據(jù)進(jìn)行過濾。這其中主要是包含這些過程:首先開始先要確定并且搭建Kernel模式Filter-Hook Driver驅(qū)動,接下來就是要獲取所有指向IP Filter Driver驅(qū)動的指針,然后就要運用前面所獲取到的指針,來進(jìn)行發(fā)送有不同類型的IRP(一種規(guī)范化的技術(shù)文檔)將過濾函數(shù)實現(xiàn)安裝,再接著將抓取到的數(shù)據(jù)準(zhǔn)備過濾,最后在過濾數(shù)據(jù)完成以后,將能夠過濾函數(shù)撤消掉[3]。
在用戶界面代碼部分所涉及到的內(nèi)容其實就是用戶能夠看到的程序界面,也就是用戶和防火墻進(jìn)行對話的對象。它負(fù)責(zé)管理用戶自己定義的過濾規(guī)則,并且與數(shù)據(jù)Filter_Hook驅(qū)動功能來實現(xiàn)互相通信。還有就是主要利用Filter_Hook Driver驅(qū)動模塊的輸出接口所提供的對象指針來實現(xiàn)注冊過濾函數(shù),撤消過濾函數(shù),安裝新的過濾規(guī)則,清除所有規(guī)則這四個功能。
3 Filter_Hook Driver驅(qū)動的實現(xiàn)
3.1 創(chuàng)建Kernel模式驅(qū)動
首先需要通過Filter_Hook Driver驅(qū)動程序來設(shè)置回調(diào)函數(shù),在過濾鉤子驅(qū)動程序作為該驅(qū)動程序的主體,并且通過系統(tǒng)提供的IPFilter Driver驅(qū)動注冊這些回調(diào)函數(shù),做完這些之后,IP Filter_Driver驅(qū)動就可以通過濾器鉤子來想辦法去處理傳入或者傳出的數(shù)據(jù)包。PacketFilterExtensionPtr數(shù)據(jù)類型的定義是用來定義注冊過的過濾鉤子驅(qū)動。
Filter_Hook Driver驅(qū)動函數(shù)會對這些傳進(jìn)來以及傳出去的數(shù)據(jù)包來做一些不一樣的處理動作。開始是將數(shù)據(jù)包的專屬信息和IP Filter Driver驅(qū)動提供給過Filter Hook的信息來做一次對比,通過這個來對比,數(shù)據(jù)包接下來該做怎樣的處理。接下來,在Filter_Hook Driver驅(qū)動對數(shù)據(jù)包做完檢測之后,就去回復(fù)響應(yīng)代碼或者將PF_PASS給IP Filter_Hook,并且告知IP Filter_Hook驅(qū)動對數(shù)據(jù)包來做出處理[4]。
3.2 設(shè)置和清除Filter_Hook
通過Driver Entry函數(shù)來自定義驅(qū)動初始化的部分以及驅(qū)動卸載的部分。Filter_Hook Driver驅(qū)動程序在設(shè)置Filter Hook回調(diào)函數(shù)的時候,并且對IP Filter Hook驅(qū)動的每個傳入IP數(shù)據(jù)包或者傳出的IP數(shù)據(jù)包發(fā)出通知,讓它調(diào)來使用鉤子回調(diào)函數(shù)。Filter Hook會先清除之前注冊的過濾函數(shù)。Filter Hook驅(qū)動首先需要將設(shè)備對象的指針作為IP過濾器驅(qū)動來創(chuàng)建一個IRP,之后,F(xiàn)ilter_Hook Driver驅(qū)動把這個IRP發(fā)送給IP Filter Hook驅(qū)動,這樣是為了記錄并且清除回調(diào)函數(shù)[5]。
對Filter_Hook Driver驅(qū)動的設(shè)置或者清除回歸函數(shù)的方式描述:想要獲得IP Filter Hook驅(qū)動的對象指針,F(xiàn)ilter_Hook Driver驅(qū)動函數(shù)就需要調(diào)用IoGet函數(shù)。在這次調(diào)用中,F(xiàn)ilter_Hook Driver驅(qū)動傳遞了指向緩沖區(qū)的指針以及容納返回的文件和設(shè)備的指針。Filter_Hook Driver驅(qū)動程序想要建立一個IRP,需要使用PF_SET_EXTENSION_POINTER控制碼,并且把它提交給IP Filter Hook驅(qū)動程序來實現(xiàn),通常情況下,F(xiàn)ilter-hook驅(qū)動程序建立所需的IRP都是通過調(diào)用IoBuildDeviceIoControlRequest函數(shù)。
END_MESSAGE_MAP()
CFirewallApp::CFirewallApp()
{}
CFirewallApp theApp;
SetRegistryKey(_T("FirewallApp"));
if (!ProcessShellCommand(cmdInfo))
return FALSE;
enum { IDD = IDD_ABOUTBOX };
protected:
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
在這次調(diào)用之中,過濾器鉤子驅(qū)動發(fā)送了指定值的IOCTL_PF_SET_EXTENSION參數(shù)以及包括了PF_SET_EXTENSION_HOOK_INFO結(jié)構(gòu)的緩沖區(qū)域。同時為了設(shè)置Filter_Hook,這個結(jié)構(gòu)還包含有設(shè)置Filter_Hook回調(diào)函數(shù)地址的信息。這個控制碼也被用來清除回調(diào)函數(shù)從IP Filter Hook的程序之中[6,7]。
3.3 實現(xiàn)FILTER_HOOK
將兩個或者兩個以上的過濾規(guī)則連在一起的鏈表稱之為過濾列表,在這個程序里它定自義了一個CFilterList的結(jié)構(gòu),也就是將指針指向后一個過濾規(guī)則的pNext指針添加到每個規(guī)則上面,通過這種辦法就能夠把兩個或者兩個以上的過濾規(guī)則連在一起形成過濾列表。而需要做的就是去記錄首地址就能夠來整理這些所有的過濾規(guī)則。在鉤子回調(diào)函數(shù)中,當(dāng)有數(shù)據(jù)包需要通過時,就得去遍歷整個列表。
函數(shù)開始過濾,首先將保重的內(nèi)容復(fù)制到共享的內(nèi)存中,接著來判斷是否符合IP規(guī)則。如果符合IP規(guī)則,那么就對IP規(guī)則去做出處理,并且接著選取下條過濾規(guī)則,來做出判斷。如果不符合IP規(guī)則的,就再去檢查看是否符合ICMP規(guī)則,如果符合ICMP的規(guī)則,那么就按ICMP規(guī)則來處理,并且選取下一條規(guī)則,來做出判斷。如果ICMP規(guī)則也不符合的話,那么久去判斷看是否符合TCP規(guī)則,如果符合TCP規(guī)則的話,那么就按照TCP的規(guī)則來處理,并且選取下一條規(guī)則。但是,要是不符合的話,那么就檢查看是否符合UDP規(guī)則,如果符合UDP的規(guī)則的話,那么就按照UDP的規(guī)則來處理,并且來選取下一條規(guī)則。像上面的情況一樣,如果不符合規(guī)則,那么就結(jié)束規(guī)則的過濾。
通過CDriver類向驅(qū)動程序來發(fā)送這些設(shè)備控制代碼用戶程序的主要的實現(xiàn)。程序在初始化時通過加載Filter_Hook Driver驅(qū)動,然后當(dāng)點擊開始按鈕時向驅(qū)動發(fā)送START_IP_HOOK來安裝過濾鉤子;點擊停止按鈕時發(fā)送STOP_IP_HOOK控制代碼來清除過濾鉤子;點擊添加過濾規(guī)則選項時,就會彈出添加規(guī)則對話框,來為使用者提供添加過濾規(guī)則的輸入界面;點擊刪除選項時則會實現(xiàn)刪除所選定的過濾規(guī)則的功能;當(dāng)使用者點擊安裝規(guī)則選項和卸載規(guī)則選項時,則會分別發(fā)送控制代碼ADD_FILTER和CLEAR_FILTER來實現(xiàn)過濾規(guī)則的加載或者卸載。
4 結(jié)束語
本文運用了Filter-Hook Driver技術(shù),設(shè)計了使用者自動添加、刪除過濾規(guī)則,同時可以按照使用者已有的過濾規(guī)則完成數(shù)據(jù)包過濾等的功能。然而,經(jīng)過檢測使用者明顯可以觀察到,當(dāng)使用者添加了比較多的過濾規(guī)則并進(jìn)行數(shù)據(jù)過濾時,其反應(yīng)的速度就會變的比較慢,因此使用者還需要努力對過濾規(guī)則對比算法做出進(jìn)一步的改進(jìn)。此外,還可以增加像日志功能這樣的一系列類似的功能,日志功能是一項比較重要的功能,只有通過防火墻日志,使用者才可以更好的對防火墻做維護以及管理。
基金項目:
1. 山西省教育科學(xué)“十三五”規(guī)劃2016年度課題“網(wǎng)絡(luò)工程專業(yè)一體化實踐教學(xué)體系的實踐研究”(項目編號:GH-16186)。
2. 2016年山西省信息化基金項目“基于知識工程的網(wǎng)絡(luò)信息安全支撐服務(wù)研究”。
參考文獻(xiàn)
[1] 王文鵬,黃俊.對BM模式匹配算法的一種改進(jìn)[J].計算機工程與用,2011,47(32):108-111.
[2] 殷超,李大興.基于改進(jìn)BMSU法的確定型有窮自動機的設(shè)計[J].微計算機信息,2008,24(3-1):215-216.
[3] 賀龍濤,方濱興,胡銘矜.對BM串匹配算法的一個改進(jìn)[J].計算機應(yīng)用,2003,23(3):6-8.
[4] S.Wu, U.Manber A fast algorithm for multi-pattern searching In Technical Report, TR-94-17 Dept. of Computer Science, University of Arizona 1994.
[5] 殷麗華,方濱興,張宏莉.快速的多模式匹配算法[J].哈爾濱工業(yè)大學(xué)學(xué)報,2007,39(12):1926-1929.
[6] Gary Plumbridge, Jack Whitham, Neil Audsley. Blueshell: a platform for rapid prototyping of multiprocessor NoCs and accelerators [J]. ACM SIGARCH Computer Architecture News, 2013,41(5): 107-117.
[7] Karthik Lakshmanan, Dionisio De Niz, Ragunathan Raj, Gabriel Moreno. Overload provisioning in mixed-criticality cyber-physical systems [J]. ACM Transactions on Embedded Computing Systems, 2012,11(4): 83-85.