一個包過濾型個人防火墻軟件的開發(fā)_第1頁
一個包過濾型個人防火墻軟件的開發(fā)_第2頁
一個包過濾型個人防火墻軟件的開發(fā)_第3頁
一個包過濾型個人防火墻軟件的開發(fā)_第4頁
一個包過濾型個人防火墻軟件的開發(fā)_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

畢業(yè)設(shè)計(論文)畢業(yè)設(shè)計(論文) 題目:題目: 一個包過濾型防火墻軟件的開發(fā)一個包過濾型防火墻軟件的開發(fā) 學生姓名:學生姓名: 學學 號:號: 班班 級級: 專專 業(yè):業(yè): 指導教師:指導教師: 2011 年年 6 月月 一個包過濾型防火墻軟件的開發(fā)一個包過濾型防火墻軟件的開發(fā) 學學生生姓姓名名 : 學學 號:號: 班班 級:級: 所所在在院院 (系系): 指指導導教教師師 : 完完成成日日期期 : 2010 年年 6 月月 一個包過濾型個人防火墻軟件的開發(fā) 摘 要 隨著病毒、木馬、黑客攻擊等問題的出現(xiàn),網(wǎng)絡(luò)安全形勢日漸嚴峻,網(wǎng)絡(luò) 安全產(chǎn)品也被人們重視起來。防火墻作為最早出現(xiàn)的網(wǎng)絡(luò)安全產(chǎn)品和使用量最 大的安全產(chǎn)品,也受到用戶和研發(fā)機構(gòu)的青睞。防火墻放置在外部網(wǎng)絡(luò)與計算 機之間作為隔離設(shè)備,可以識別并屏蔽非法請求,有效防止跨越權(quán)限的數(shù)據(jù)訪 問。 本文使用 VC+ 6.0 作為開發(fā)工具實現(xiàn)了一個包過濾型個人防火墻軟件。系 統(tǒng)主要包括兩大模塊,一是核心模塊設(shè)計,即 DLL 工程,實現(xiàn)了封包截獲、管 制動作和協(xié)議封包的解析任務(wù)。其中實現(xiàn)網(wǎng)絡(luò)封包截獲功能主要是利用 Winsock 2 SPI 技術(shù),此后再利用控管規(guī)則對過往封包進行合法性檢查和過濾, 方法是首先利用 Winsock 2 SPI 技術(shù)建立 winsock 鉤子,用它來截獲 winsock 的 調(diào)用,然后作出相應(yīng)動作處理,動作處理需通過控管規(guī)則的檢查后,確定 socket 連接是否允許通過,而控管規(guī)則由用戶層設(shè)置;二是用戶模塊設(shè)計,即 EXE 工程,實現(xiàn)用戶界面和負責與 DLL 模塊的通信,提供了 3 個主要界面, 即封包監(jiān)視、控管規(guī)則、控管規(guī)則設(shè)置。最后通過測試和應(yīng)用,基本達到了預(yù) 期的設(shè)計,解決了終端用戶的網(wǎng)絡(luò)連接安全問題。 關(guān)鍵詞: 網(wǎng)絡(luò)安全;網(wǎng)絡(luò)協(xié)議封包;個人防火墻;動態(tài)鏈接庫;Winsock 2 SPI; The Design of A Personal Firewall Based on Packet Filter Abstract With computer viruses, Trojans, hacker attacks and other problems, the network security situation is increasingly grim, network security products are also paid attention. Network firewall appeared as the first security products and be used most widely, are concerned by the user and R Second, the user module design, the EXE project, responsible for achieving the user interface and DLL The communications module provides three main interfaces, namely, packet monitoring, control rules, control rules set. After testing and application, the design achieve the expected to solve the security problems of users network connection. Key words: Network Security;Network Protocol Packets;Personal Firewall;DLL; Winsock 2 SPI; 目錄目錄 1 引言 .1 1.1課題背景與意義.1 1.2課題目標.1 1.3課題的研究方法.1 2 WINSOCK 2 SPI 編程技術(shù).3 2.1WINSOCK 2 SPI 基礎(chǔ).3 2.2傳輸服務(wù)提供者.3 2.3開發(fā)平臺與開發(fā)工具.4 3 系統(tǒng)總體分析與設(shè)計 .5 3.1系統(tǒng)功能定義.5 3.2模塊劃分.5 3.2.1 模塊劃分原則.5 3.2.2 模塊結(jié)構(gòu).6 3.2.3 模塊接口定義.7 3.3程序工作流程圖.8 3.4控管規(guī)則文件結(jié)構(gòu)設(shè)計.9 3.4.1 控管規(guī)則文件需要存儲的內(nèi)容.9 3.4.2 控管規(guī)則文件結(jié)構(gòu).11 3.5界面設(shè)計.11 3.5.1 制定界面風格.11 3.5.2 界面設(shè)計文檔.12 3.6編碼規(guī)則.16 4 核心功能的實現(xiàn) .17 4.1封包截獲.17 4.2訪問控管.21 4.2.1 對服務(wù)提供者函數(shù)做管制的函數(shù).21 4.2.2 封包處理函數(shù).22 4.2.3 管制函數(shù).23 4.2.4 設(shè)置函數(shù).27 5 系統(tǒng)測試 .28 5.1 測試方法概述.28 5.2 測試用例及測試結(jié)果.28 6 結(jié)束語.34 6.1 總結(jié).34 6.2 展望.34 參考文獻.35 致 謝.37 1 引言 1.1課題背景與意義 隨著網(wǎng)絡(luò)在各領(lǐng)域應(yīng)用的越來越廣泛,網(wǎng)絡(luò)安全問題得到了更多的關(guān)注。 計算機病毒攻擊可以導致電腦系統(tǒng)癱瘓;而木馬和黑客攻擊可致使重要信息被 竊取,造成不可估量的損失。所以人們開始尋求如何能在電腦和網(wǎng)絡(luò)間添加一 種可靠保護體系。防火墻就此應(yīng)運而生。顧名思義,防火墻能夠在計算機和網(wǎng) 絡(luò)間形成一道過濾屏障,保證被認可的行為順利執(zhí)行,而危險行為則被屏蔽。 從而很大程度上增加了網(wǎng)絡(luò)的安全性。 1.2課題目標 現(xiàn)在防火墻的花樣與種類繁多,讓人眼花繚亂。但是防火墻的主要功能是 防止外部網(wǎng)絡(luò)的攻擊以達到保護主機的目的。哪些未知的網(wǎng)絡(luò) IP 可能對主機產(chǎn) 生攻擊可能是未可知的,只有試驗過才知道。所以現(xiàn)在防火墻一般與防病毒軟 件配合使用。這樣才能安全的保護主機。 實現(xiàn)的主要的核心功能如下定義: (1) 根據(jù)應(yīng)用程序訪問規(guī)則可對應(yīng)用程序連網(wǎng)動作進行過濾; (2) 對應(yīng)用程序訪問規(guī)則具有自學習功能; (3) 可實時監(jiān)控、監(jiān)視網(wǎng)絡(luò)活動。 1.3課題的研究方法 本課題由兩大模塊構(gòu)成,分別為 DLL 模塊和 EXE 模塊。 首先利用 Winsock 2 SPI 技術(shù)建立 winsock 鉤子用來截獲 winsock 調(diào)用從而 攔截 TCP/IP 封包,并做相應(yīng)處理。然后設(shè)置控管規(guī)則訪問控制,通過控管規(guī)則 的檢查認證,確定 socket 連接是否允許通過。在此之后是 TCP/IP 的封包分析, 利用 TIP/IP 的封包結(jié)構(gòu)分析截獲的數(shù)據(jù),提取需要的數(shù)據(jù)。這些封裝在 DLL 里 面【1】。 EXE 模塊主要是用戶頁面的制作。這里介紹與 DLL 模塊通信的地方。EXE 中與 DLL 直接通信的小模塊主要有兩個。一個是完成應(yīng)用程序初始化的類 CPropertyApp,它繼承自 CWinApp,是 EXE 的入口,其實里面封裝了 WinMain 函數(shù);另一個是主窗口模塊 CMainFrame,這個主窗口并不是 EXE 顯示出來的 那個屬性頁窗口,而是一個隱藏的窗口,它繼承自 CMrameWnd,是一個無模 式窗口,他隱藏顯示,充當接受機,用來接受 DLL 及其他模塊發(fā)送過來的消息, 然后對消息進行相應(yīng)的處理。 每一個連網(wǎng)的程序連網(wǎng)之前都會建立一個 Socket 連接。這時鉤子程序就會 起作用,把截獲的底層服務(wù)進行“過濾” ,及先調(diào)用自定義的函數(shù)再轉(zhuǎn)給下層服 務(wù)提供者函數(shù)【2】。本文將這一層實現(xiàn)封包過濾的,把規(guī)則與功能寫到這一層。 本層的實現(xiàn)是本課題的核心。 2 WINSOCK 2 SPI 編程技術(shù)編程技術(shù) Winsock 2 是 Windows Sockets 的 2.0 版本,在此之前的版本是 1.1。與 1.1 版本相比,2.0 版本引入了一種新的叫做 SPI 的編程接口。利用這種技術(shù)可以在 Socket 中插入一曾層,從而可以完成諸如擴展 TCP/IP 協(xié)議棧,網(wǎng)絡(luò)安全控制等 功能,所以這是一個非常強大而且有用的接口,下面介紹這種編程技術(shù)。 2.1 WINSOCK 2 SPI 基礎(chǔ) Winsock 是為上層應(yīng)用程序提供的一種標準網(wǎng)絡(luò)接口,上層應(yīng)用程序不用 關(guān)心 Winsock 實現(xiàn)的細節(jié),它為上層應(yīng)用程序提供透明的服務(wù)。 Winsock 2 引入的一個新的功能就是打破服務(wù)提供者的透明,讓開發(fā)者可 以編寫自己的服務(wù)提供者接口程序,即 SPI 程序。SPI 以動態(tài)鏈接庫的形式存 在,它工作在應(yīng)用層,為上層 API 調(diào)用接口函數(shù)【3】。Winsock 2 是一個接口, 不是一個協(xié)議。作為接口,它只能發(fā)現(xiàn)和利用底層傳輸協(xié)議完成通信。 自己編寫的 SPI 程序安裝到系統(tǒng)之后,所有的 Winsock 請求都會發(fā)送到這 個程序并由它完成網(wǎng)絡(luò)調(diào)用。由于系統(tǒng)提供的 SPI 已經(jīng)可以完成網(wǎng)絡(luò)傳輸功能, 所以自己編寫的 SPI 沒有必要重新編寫這部分功能。一般可以直接調(diào)用系統(tǒng)函 數(shù)完成網(wǎng)絡(luò)傳輸,這樣工作的效果就是“鉤子程序。 Winsock 2 SPI 除了有完成網(wǎng)絡(luò)傳輸?shù)膫鬏敺?wù)提供者,還有提供友好名稱 服務(wù)的名字空間服務(wù)提供者。傳輸服務(wù)提供者能夠提供建立通信、傳輸數(shù)據(jù)、 流量控制和錯誤控制等服務(wù)。名字空間服務(wù)提供者把一個網(wǎng)絡(luò)協(xié)議的地址屬性 和一個或多個用戶友好名稱關(guān)聯(lián)起來,這樣可以起用與協(xié)議無關(guān)的名字解析方 案。 2.2 傳輸服務(wù)提供者 傳輸服務(wù)提供者又分為基礎(chǔ)服務(wù)提供者和分層服務(wù)提供者?;A(chǔ)服務(wù)提供 者和分層服務(wù)提供者都開放相同的 SPI 接口,所不同的是基礎(chǔ)服務(wù)提供者位于 提供者的最底層。所以編寫基礎(chǔ)服務(wù)提供者和分層服務(wù)提供者基本相同。但安 裝是卻需要將基礎(chǔ)服務(wù)提供者安裝在服務(wù)提供者加載順序鏈的最底端,而分層 服務(wù)提供者則根據(jù)需要分布在順序鏈的中間。 2.3 開發(fā)平臺與開發(fā)工具 開發(fā)平臺如題說明,以 Windows 平臺為主,重點討論開發(fā)工具的選擇。 根據(jù)不同的工程選擇不同的開發(fā)工具,可以有效地提高工作效率。不同的 開發(fā)工具各有各的優(yōu)點同時又各有各的不足,在開發(fā)中要揚長避短。 目前常用的 Windows 開發(fā)工具有 VS 5.0/6.0、VS.net(包括 VB、BC、VFP、VJ、C#等一組開發(fā)工具) 、delphi、C+ Builder,JBuilder、PB 等【4】。 在這些開發(fā)工具里面,VFP 和 PB 一般用來專門開發(fā)數(shù)據(jù)庫系統(tǒng),它們具 有靈活的數(shù)據(jù)庫接口。 VB 和 Delphi 既可以方便地做出復(fù)雜的數(shù)據(jù)庫管理系統(tǒng),又能輕松地完成 操作系統(tǒng)級的任務(wù)。最優(yōu)秀的是很容易做出漂亮的界面。 VC 和 Borland C+著重于系統(tǒng)編程,它們開放接口較多,也最為靈活,而 且編譯出的程序體積較小,所以比較適合做系統(tǒng)工具類軟件。缺點是短時間不 容易掌握。其中 Borland 使用的 VCL 類庫是為 Delphi 準備的,并不是真正用 C+實現(xiàn)的。 VJ、Jbuilder 和 Java 語言主要面向互聯(lián)網(wǎng)應(yīng)用。最大的優(yōu)勢是跨平臺。 本課題為防火墻軟件,較多的使用系統(tǒng)接口,而且界面簡單。另外,防火 墻主要傳播渠道是互聯(lián)網(wǎng),這就要求體積應(yīng)盡量的小,安裝盡量方便。所以選 擇 VC 為開發(fā)工具。 3 系統(tǒng)總體分析與設(shè)計 3.1 系統(tǒng)功能定義 本設(shè)計實現(xiàn)的具體功能描述如下: (1) 封包監(jiān)視 提供封包監(jiān)視頁面。 提供清空監(jiān)視列表,停止/開始監(jiān)視及停止/開始滾動功能。 (2) 控管規(guī)則設(shè)置 手工添加,刪除及修改控管規(guī)則。 自學習添加控管規(guī)則。 控管規(guī)則中目的網(wǎng)絡(luò) IP 地址段的設(shè)置。 提供控管規(guī)則設(shè)置頁面。 (3) 封包過濾 DLL 給出設(shè)置工作模式和設(shè)置控管規(guī)則的接口函數(shù)。工作模式分為 3 種形式:放行所有,拒絕所有和過濾。 DLL 根據(jù)工作模式和控管規(guī)則對過往封包進行過濾。 DLL 將通過的網(wǎng)絡(luò)封包通知 EXE 取走 。 3.2 模塊劃分 3.2.1 模塊劃分原則 模塊劃分是系統(tǒng)分析中非常重要的一部分,下面是模塊劃分時的基本原則。 (1) 獨立性:讓模塊直接內(nèi)的關(guān)系減到最少。理想的狀態(tài)就是模塊之間沒 有關(guān)系,但這種情況不符合現(xiàn)實。既然是同一個工程,模塊之間自然都會存在 一定的聯(lián)系,只要想辦法讓模塊之間的關(guān)系盡量簡單就可以了。 (2) 接口簡單化:讓模塊之間的接口盡量單純、簡單、易用。即讓公用函 數(shù)和公用變量盡量地少。 (3) 分層處理:吸取 Windows 操作系統(tǒng)對模塊做分層處理的經(jīng)驗。建立一 些中間模塊,讓兩端的模塊來完成相互調(diào)用的透明化。 (4) 容易合并:容易將劃分的模塊進行合并。例如將一個工程的各個功能 模塊分別設(shè)計成可執(zhí)行文件,然后用一個總模塊將這些模塊關(guān)聯(lián)起來組成一個 工程。這種情況下,對模塊獨立性要求較高,模塊之間幾乎沒有任何關(guān)系。 (5) 可測試性:盡量使每個模塊都可以單獨進行測試6。 上面的 5 條是參考原則,既然是參考原則就不會完全執(zhí)行,完全按照一個 教條去執(zhí)行真的很困難。只要在做模塊劃分的時候能經(jīng)常記起這些原則,然后 稍加注意就 OK 了。另外,在這 5 條原則中,第一條是根本,能把這一條做好, 下面的一些就容易實現(xiàn)了。在做模塊劃分時一定要始終貫穿獨立性的思想。 3.2.2 模塊結(jié)構(gòu) 根據(jù) 3.1 節(jié)的功能定義和 3.2 節(jié)的工作流程圖,需要對模塊做進一步細化, 得出更詳細的模塊結(jié)構(gòu)。這些模塊結(jié)構(gòu)是編程的藍本,在編寫代碼的過程中, 就要以這些結(jié)構(gòu)為指導。 (1) 模塊 1.1:用戶界面,3.5 節(jié)詳細說明。 (2) 模塊 1.2:EXE 的安裝模塊, 。建立 CXInstall 類,C+源文件 Install.h 和 Install.cpp。安裝函數(shù) InstallProvider 和卸載函數(shù) RemoveProvider (3) 模塊 1.3:EXE 讀寫控管規(guī)則模塊,建立 CAclFile 類,C+源文件 File.h 和 File.cpp。讀控管規(guī)則文件 ReadAcl,保存控管規(guī)則文件 SaveAcl,增加 一條控管規(guī)則 AddAcl 和刪除一條控管規(guī)則 DelAcl。 (4) 模塊 1.4:EXE 設(shè)置 DLL 的控管規(guī)則模塊,設(shè)置控管規(guī)則單獨的函數(shù), 調(diào)用模塊 1.3 讀寫控管規(guī)則模塊得到控管規(guī)則數(shù)據(jù),調(diào)用 DLL 的函數(shù) FloControl 設(shè)置 DLL 的控管規(guī)則。 (5) 模塊 1.5:EXE 設(shè)置 DLL 的工作模式,設(shè)置工作模式單獨的函數(shù),調(diào) 用模塊 1.3 讀寫控管規(guī)則模塊得到控管規(guī)則數(shù)據(jù),調(diào)用 DLL 的函數(shù) FloControl 設(shè)置 DLL 的工作模式。 (6) 模塊 2.1:DLL 封包過濾模塊,有分為 3 塊,2.1.1 一組 Winsock 2SPI 鉤子函數(shù) C+源文件 TcpipDog.h 和 TcpipDog.cpp;模塊 2.1.2 根據(jù)控管規(guī)則判 斷是否可以通行的類 CCheckAcl,C+源文件 CheckAcl.h 和 CheckAcl.cpp;模 塊 2.1.3 對網(wǎng)絡(luò)數(shù)據(jù)包進行分析的類 CProtocolInfo,C+源文件 ProtocolInfo.h 和 ProtocolInfo.cpp。 模塊 2.1.1:服務(wù)提供者函數(shù)模塊,入口函數(shù) WSPSartup,發(fā)送詢問消 息到 EXE,由 EXE 提供詢問界面函數(shù) QueryAccess。截獲的 8 個服務(wù)提供者函 數(shù)。設(shè)置工作模式、控管規(guī)則等設(shè)備工作接口函數(shù) FloControl。 模塊 2.1.2:訪問控管模塊,通過檢查工作模式和控管規(guī)則得到是否放 行的函數(shù) GerAccessInfo。 模塊 2.1.3:協(xié)議解析模塊,得到協(xié)議信息處理函數(shù) GetProtocolInfo (7) 模塊 2.2:DLL 更改控管規(guī)則模塊,設(shè)置 DLL 控管規(guī)則數(shù)據(jù) SetAcl, 設(shè)置控管規(guī)則 m_Aclfile,設(shè)置工作模式 m_iWorkMode。 (8) 模塊 2.3:DLL 更改工作模式模塊,設(shè)置 DLL 工作模式函數(shù) SetWorkMode。 3.2.3 模塊接口定義 模塊之間接口有 3 種方式: (1) 函數(shù)接口 函數(shù)接口是最常用而且獨立性和封裝性最好的接口方式7。函數(shù)之間通過 參數(shù)傳遞進行模塊之間的通信,處理過程保持相互獨立,函數(shù)處理完成把處理 結(jié)果返回到調(diào)用模塊。如果每個函數(shù)都有單獨的接口,那么,函數(shù)多了,接口 也就多了,也就越來越復(fù)雜了。C+利用類的餓概念解決這個問題。類可以將 一組函數(shù)和變量封裝起來,這樣就將許許多多的函數(shù)轉(zhuǎn)化成一個對象的形式。 外部模塊使用這個類的實例來引用封裝在里面的成員函數(shù)個變量。把功能相似、 相關(guān)的函數(shù)分成一組,然后封裝在一起,使接口間的關(guān)系清晰了很多。類的成 員函數(shù)和成員變量有公有和私有之分。對于公有函數(shù)和變量,外部模塊可以直 接調(diào)用;對于私有函數(shù)和變量,外部模塊則不能直接調(diào)用。利用這種特性,可 以把一些只在類里面使用的函數(shù)定義為私有函數(shù);把外部模塊需要直接調(diào)用的 函數(shù)定義為公有函數(shù)。類似于 DLL 的導出函數(shù)(Export) ,這樣,模塊之間的 直接接觸就會進一步減小,獨立性更進一步增加。 (2) 全局變量接口 全局變量接口是一種不提倡的方式。雖然它使用起來確實很過癮。全局變 量多了非常容易出問題。任何地方都可能會對全局變量進行賦值,變量的可控 性大大降低,不知道什么時候變量的值就被莫名其妙地改掉了。當然,只要不 被那些模塊執(zhí)行的先后順序和循環(huán)語句弄昏頭,還是可以使用全局變量的。雖 然不提倡使用,但是有些地方使用全局變量與是不可避免的,而且有時候可以 減少很多麻煩。使用全局變量的時候需要注意一點,讀取變量的多少和位置對 程序穩(wěn)定性的影響并不很大,關(guān)鍵是盡量讓賦值的地方單一,改變變量的次數(shù) 和位置應(yīng)盡量得到控制。 (3) Windows 消息接口 Windows 消息接口是一種特殊的接口形式,它是基于 Windows 操作系統(tǒng)的 消息機制8。這種接口形式適合于應(yīng)用程序之間。應(yīng)用程序是相對獨立的模塊, 如果這兩個模塊需要通信,則消息接口就是一種理想型的選擇。這種接口類似 于函數(shù)接口,只不過通過操作系統(tǒng)的消息機制來中轉(zhuǎn)一下。Windows 消息接口 也是一種接口方式,特別是 DLL 和 EXE 之間經(jīng)常用到。在 DLL 與 EXE 之間 通信使用消息是一種優(yōu)勢,多個應(yīng)用程序雖然調(diào)用同一個 DLL,但是它們都擁 有獨立的模塊副本。這時候如果這些模塊副本都需要讓同一個應(yīng)用程序做一件 事時,就不好處理,因為 DLL 的重要性和應(yīng)用程序保護機制導致這些模塊副本 無法直接調(diào)用同一個應(yīng)用程序的執(zhí)行模塊。這時候就可以通過消息的方式來解 決。發(fā)送消息是基于窗口句柄的,只要得到這個窗口句柄,不同的 DLL 副本都 向同一個窗口句柄發(fā)送消息,自然所有的消息都可以被同一個應(yīng)用程序接收9。 以上 3 種接口方式以函數(shù)接口為優(yōu)先進行考慮,以增強模塊的獨立性和可 讀性。 3.3 程序工作流程圖 Winsock 2 SPI 是一個 DLL 程序,它工作在 API 和 DRIVER 之間,為上層 應(yīng)用程序提供服務(wù)【5】。EXE 與 DLL 構(gòu)成軟件的主體,也是編寫軟件的主要工 作。流程圖如圖 3.1 所示。 模塊1.1.1 控管規(guī)則 輸入界面接口 模塊1.1.2 封包監(jiān) 視界面接口 模塊1.3 讀寫控管 規(guī)則 模塊1.4 設(shè)置控管 規(guī)則 模塊1.5 設(shè)置工作 模式 控管規(guī)則文件 (.cfg) 模塊2.2 控 管規(guī)則 模塊2.3 工 作模式 用戶界面(EXE) 模塊1.2 安裝 Winsock 2SPI (DLL) 模塊 2.1 封 包 過 濾 模塊1.1 用戶界面接口 圖 3.1 防火墻工作流程圖 3.4 控管規(guī)則文件結(jié)構(gòu)設(shè)計 控管規(guī)則文件用來存儲控管規(guī)則數(shù)據(jù),命名為 acl.cfg;該數(shù)據(jù)文件為二進 制文件。 3.4.1 控管規(guī)則文件需要存儲的內(nèi)容 控管規(guī)則文件需要存儲的內(nèi)容如下: (1) 系統(tǒng)設(shè)置 (2) 控管設(shè)置 (3) 控管規(guī)則附加數(shù)據(jù),授權(quán)訪問的遠端網(wǎng)絡(luò) IP 地址記錄 a.控管規(guī)則記錄結(jié)構(gòu)說明 (1) 規(guī)則編號字段是控管規(guī)則的唯一性編號。保留字段,沒有使用。 (2) 應(yīng)用程序名稱及路徑字段用來保持應(yīng)用程序的名稱和路徑。 (3) 遠端網(wǎng)絡(luò)類型,數(shù)值的含義如下。 0:表示所有網(wǎng)絡(luò) 1:局域網(wǎng) 2:約束的網(wǎng)絡(luò)(自定義) 3:信任的網(wǎng)絡(luò)(自定義) 4:自定義的網(wǎng)絡(luò)(自定義) 模塊 1.1 用戶界面接口 (4) 管制動作,數(shù)值的含義如下。 0:放行 1:拒絕 (5) 進出方向,數(shù)值的含義如下。 0:出 1:入 2:雙向 (6) 服務(wù)類型,數(shù)值的含義如下。 0:全部 1:TCP(端口為任意,可編輯) 2:UDP(端口為任意,可編輯) 3:FTP(端口為 21,不可編輯) 4:TELNET(端口為 23,不可編輯) 5:HTTP(端口為任意,可編輯) 6:NNTP(端口為 119,不可編輯) 7:POP3(端口為 110,不可編輯) 8:SMTP(端口為 25,不可編輯) (7) 服務(wù)端口,數(shù)值的含義如下。 0:表示全部 其他值:表示端口值 b.授權(quán)訪問的遠端 IP 地址記錄結(jié)構(gòu) 授權(quán)訪問的遠端網(wǎng)絡(luò) IP 地址結(jié)構(gòu)如表 1 所示。 表 1 授權(quán)訪問的遠端網(wǎng)絡(luò) IP 地址段記錄結(jié)構(gòu) 字段 類型 長度 開始 IP 無符號長整型 4 結(jié)束 IP無符號長整型 4 3.4.2 控管規(guī)則文件結(jié)構(gòu) 根據(jù)需要存儲的內(nèi)容將控管規(guī)則文件劃分為 3 段。 文件頭用來存儲系統(tǒng)設(shè)置,IP 地址范圍記錄和控管規(guī)則記錄的地址偏移量 及其他信息10;IP 地址范圍記錄存儲區(qū)用來存儲 IP 地址范圍記錄;控管規(guī)則 記錄存儲區(qū)用來存儲控管規(guī)則記錄。 a. 控管規(guī)則結(jié)構(gòu) 控管規(guī)則結(jié)構(gòu)如表 2 所示。 表 2 控管規(guī)則記錄結(jié)構(gòu)表 08162432404856 控管規(guī)則編號應(yīng)用程序路徑和名稱 遠端網(wǎng)絡(luò)動作方向服務(wù)類型端口 b. IP 地址結(jié)構(gòu) IP 地址段記錄結(jié)構(gòu)如表 3 所示。 表 3 IP 地址段記錄結(jié)構(gòu)表 08162432404856 開始 IP 地址結(jié)束 IP 地址 開始 IP 地址結(jié)束 IP 地址 3.5 界面設(shè)計 3.5.1 制定界面風格 界面上反映的功能有:封包監(jiān)視、控管規(guī)則設(shè)置。這是兩個平行的功能, 所以選用 Windows 的屬性頁。 3.5.2 界面設(shè)計文檔 界面設(shè)計如下所示。 a. 封包監(jiān)視界面 封包監(jiān)視界面用來顯示截獲的網(wǎng)絡(luò)封包。每個網(wǎng)絡(luò)封包的具體內(nèi)容根據(jù)實 際需要而定。如圖 3.2。 圖 3.2 封包監(jiān)視界面 封包的字段有: (1) 應(yīng)用程序路徑和名稱 (2) 管制動作(放行或拒絕) (3) 訪問起始/結(jié)束時間 (4) 使用網(wǎng)絡(luò)協(xié)議 (5) 進/出流量 (6) 本地和遠端 IP 地址/端口 (7) 備注信息 封包監(jiān)視界面實時接收 DLL 發(fā)送過來的網(wǎng)絡(luò)封包并立刻顯示。 在封包監(jiān)視界面上設(shè)計了幾個附加按鈕。 “停止/開始滾動”用來設(shè)置監(jiān)視 列表是否自動滾動;“開始/停止監(jiān)視”用來設(shè)置是否實時監(jiān)視;“清除”按鈕 用來清除當前列表。這些功能按鈕方面操作。 b. 控管規(guī)則界面 控管規(guī)則界面用來顯示和設(shè)置控管規(guī)則(如圖 3.3) 。需要說明的是,應(yīng)用 程序設(shè)置的優(yōu)先級高于控管規(guī)則設(shè)置,只是在應(yīng)用程序設(shè)置為詢問時,下面的 控管規(guī)則設(shè)置才有效。 圖 3.3 控管規(guī)則界面 控管規(guī)則的設(shè)計目的是為了制訂對網(wǎng)絡(luò)訪問的控制,所以控管規(guī)則的字段 可以決定防火墻防范的嚴密性和靈活程度??毓芤?guī)則的記錄結(jié)構(gòu)為: 應(yīng)用程序 遠端網(wǎng)絡(luò) 管制動作 進出方向 協(xié)議類型 使用端口 控管規(guī)則界面給出了“增加” 、 “刪除” 、 “修改”3 個功能按鈕用來對控管 規(guī)則進行不同的操作。其中選擇增加和修改時都會彈出控管規(guī)則設(shè)置界面。 (1) 控管規(guī)則設(shè)置界面 控管規(guī)則設(shè)置界面是用來設(shè)置控管規(guī)則的各個字段(如圖 3.4) 。在“應(yīng)用 程序”欄輸入或選擇要進行控管的應(yīng)用程序的完整路徑和文件名。 “遠端網(wǎng)絡(luò)”用 IP 地址范圍表示,用來定義網(wǎng)絡(luò)類型的 IP 地址范圍。本 軟件工劃分為 5 個類型:所有網(wǎng)絡(luò)、局域網(wǎng)、受約束的網(wǎng)絡(luò)、信任的網(wǎng)絡(luò)和自 定義網(wǎng)絡(luò)。 “動作”用來確定符合這一條控管規(guī)則的網(wǎng)絡(luò)訪問動作是放行還是拒絕。 “方向”用來確定這一條控管規(guī)則適合于網(wǎng)絡(luò)訪問的連接方向。本機向遠 端服務(wù)器發(fā)出連接請求就是出;遠端主機向本機發(fā)出連接請求則為進。 “類型”是控管規(guī)則約定的協(xié)議類型。 “端口”是協(xié)議所使用的端口。 圖 3.4 控管規(guī)則設(shè)置界面 (2) 網(wǎng)絡(luò)設(shè)置界面 網(wǎng)絡(luò)設(shè)置界面用來對各種網(wǎng)絡(luò)類型的 IP 地址段進行設(shè)置(如圖 3.5) ,在上 節(jié)有關(guān)于遠端網(wǎng)絡(luò)類型的介紹。在這個界面上提供對 IP 地址段的增加、修改和 刪除功能 圖 3.5 網(wǎng)絡(luò)設(shè)置界面 3.6 編碼規(guī)則 變量命名規(guī)則如下: (1) 變量采用代表中文意思的英文單詞或單詞組合。 (2) 變量一般不用縮寫,用英文單詞全稱。較長的更為習慣的縮寫。 (3) 自定義全局變量用 m_開頭。 (4) 自定義過程變量不用 m_開頭。 (5) 變量的前綴用變量類型的第一個字母標志變量類型。如,指針類型在 前面多加一個字母 P。 (6) 如果是對象,前綴用對象的名稱,第一個字母大寫。 (7) 變量中有多個單詞時,單詞的第一個字母大寫,其余用小寫。 (8) 有了自己的編碼規(guī)則后,不會出現(xiàn)自己的弄不清楚自己定義的函數(shù)之 類的是什么意思。不知道函數(shù)是干什么的。以至于思維混亂。 4 核心功能的實現(xiàn) 本課題的核心功能實現(xiàn)封裝在 DLL 里面。下面分析 DLL 的主要內(nèi)容。 4.1 封包截獲 BOOL WINAPI DllMain 是 DLL 的入口函數(shù),系統(tǒng)調(diào)用時的標準接口12。 做一些初始化工作。主要工作是得到調(diào)用這個程序的進程路徑和名稱并設(shè)置 DLL 調(diào)用次數(shù)的計數(shù)器。 WSPStartup 是 Windows Sockets 應(yīng)用程序調(diào)用 SPI 的初始化函數(shù)。是服務(wù) 提供者的標準入口函數(shù)。這里的工作是根據(jù) lpProtocolInfo 找出已經(jīng)被替換的服 務(wù)提供者路徑,然后加載,并利用被替換服務(wù)提供者的 WSPStartup 得到 30 個 服務(wù)函數(shù)指針。需要先保存這些函數(shù)指針,然后將 lpProcTable 結(jié)構(gòu)中的 30 個 服務(wù)函數(shù)指針都設(shè)置成自己的。這樣,相應(yīng)的函數(shù)請求會首先經(jīng)過我們自己的 函數(shù),然后用這些函數(shù)可以做適當?shù)奶幚?,再調(diào)用原來的,將請求轉(zhuǎn)發(fā),完成 整個通信。 int WSPAPI WSPStartup( WORDwVersionRequested, LPWSPDATAlpWSPData, LPWSAPROTOCOL_INFOWlpProtocolInfo, WSPUPCALLTABLEupcallTable, LPWSPPROC_TABLElpProcTable ) ODS(_T(WSPStartup.); if(!m_CheckAcl.m_bIsWin9x TCHARsLibraryPath512; LPWSPSTARTUP WSPStartupFunc = NULL; HMODULEhLibraryHandle= NULL; INT ErrorCode = 0; if(!GetHookProvider(lpProtocolInfo,sLibraryPath)| (hLibraryHandle =LoadLibrary(sLibraryPath)=NULL|(WSPStartupFunc=(LPWSPSTARTUP)GetPr ocAddress(hLibraryHandle, WSPStartup) = NULL) return WSAEPROVIDERFAILEDINIT; if(ErrorCode=WSPStartupFunc(wVersionRequested,lpWSPData,lpProtocolInfo, upcallTable, lpProcTable) != ERROR_SUCCESS) return ErrorCode; if( !lpProcTable-lpWSPAccept | !lpProcTable-lpWSPAddressToString | !lpProcTable-lpWSPAsyncSelect | !lpProcTable-lpWSPBind | !lpProcTable-lpWSPCancelBlockingCall | !lpProcTable-lpWSPCleanup | !lpProcTable-lpWSPCloseSocket | !lpProcTable-lpWSPConnect | !lpProcTable-lpWSPDuplicateSocket | !lpProcTable-lpWSPEnumNetworkEvents | !lpProcTable-lpWSPEventSelect | !lpProcTable-lpWSPGetOverlappedResult | !lpProcTable-lpWSPGetPeerName | !lpProcTable-lpWSPGetSockName | !lpProcTable-lpWSPGetSockOpt | !lpProcTable-lpWSPGetQOSByName | !lpProcTable-lpWSPIoctl | !lpProcTable-lpWSPJoinLeaf | !lpProcTable-lpWSPListen | !lpProcTable-lpWSPRecv | !lpProcTable-lpWSPRecvDisconnect | !lpProcTable-lpWSPRecvFrom | !lpProcTable-lpWSPSelect | !lpProcTable-lpWSPSend | !lpProcTable-lpWSPSendDisconnect | !lpProcTable-lpWSPSendTo | !lpProcTable-lpWSPSetSockOpt | !lpProcTable-lpWSPShutdown | !lpProcTable-lpWSPSocket | !lpProcTable-lpWSPStringToAddress ) return WSAEINVALIDPROCTABLE; EnterCriticalSection( NextProcTable = *lpProcTable; lpProcTable-lpWSPSocket= WSPSocket; lpProcTable-lpWSPCloseSocket= WSPCloseSocket; lpProcTable-lpWSPConnect= WSPConnect; lpProcTable-lpWSPAccept= WSPAccept; lpProcTable-lpWSPSend= WSPSend; lpProcTable-lpWSPSendTo= WSPSendTo; lpProcTable-lpWSPRecv= WSPRecv; lpProcTable-lpWSPRecvFrom= WSPRecvFrom; /以上是我們截獲并要用自己定義的函數(shù)。 LeaveCriticalSection( return 0; XfIoControl 是供 EXE 調(diào)用的。用來設(shè)置 DLL 的配置信息和得到 DLL 的反 饋信息,這個函數(shù)為 EXE 提供接口,EXE 通過這個函數(shù)來設(shè)置工作模式,或 得到截獲的網(wǎng)絡(luò)封包信息。 QueryAccess 是在應(yīng)用程序提交連網(wǎng)請求時,如果發(fā)現(xiàn)控管規(guī)則中沒有關(guān)于 這個應(yīng)用程序的控管規(guī)則,并且工作模式為詢問,則向擁護發(fā)出詢問,是否讓 這個程序通行。 GetHookProvider 用來讀取注冊表得到系統(tǒng)的 SPI 的 DLL 路徑和文件信息。 這個信息是安裝時自己寫入的。根據(jù) pProtocolInfo 信息取出自己保存的、已經(jīng) 被本程序替換的服務(wù)提供者路徑。 GetRightEntryIdItem 是供 GetHookProvider()調(diào)用的擴展函數(shù),用來得到 保存系統(tǒng)服務(wù)提供者路徑的注冊表鍵名。及得到已經(jīng)被本程序替換的服務(wù)提供 者的 dwCatalogEntryId。 XfShutdown 調(diào)用系統(tǒng)服務(wù)提供者函數(shù) WSPShutdown,關(guān)閉一個 Socket 連 接。并設(shè)置相應(yīng)的錯誤代碼。 截獲的服務(wù)提供者函數(shù): 過濾 WSPSocket。WSPSocket 是用來創(chuàng)建 Socket 的函數(shù)【15】,首先調(diào)用底 層函數(shù)得到新創(chuàng)建的 Socket,然后設(shè)置新建 Socket 的協(xié)議信息,并調(diào)用自定義 函數(shù) CheckSocket 為這個 Socket 建立 Session,然后保存相應(yīng)的信息。 過濾 WSPCloseSocket。轉(zhuǎn)發(fā)之前首先調(diào)用自定義函數(shù) CheckCloseSocket 刪 除相應(yīng)的 Session。 過濾 WSPConnect。當一個 Socket 建立連接后調(diào)用這個函數(shù),轉(zhuǎn)發(fā)之前先 調(diào)用訪問控制函數(shù) CheckConnect,檢查是否放行。如果不放行,返回錯誤;如 果放行,調(diào)用底層 WSPConnect 函數(shù)進行轉(zhuǎn)發(fā)。 過濾 WSPAccept。用來接受一個連接請求。首先調(diào)用底層函數(shù),然后對連 接的合法性進行檢查,如果不允許通過,關(guān)閉這個連接 過濾 WSPSend。這個函數(shù)用來發(fā)送面向連接的數(shù)據(jù),先檢查是否允許通過, 然后進行轉(zhuǎn)發(fā)。 過濾 WSPSendTo。這個函數(shù)用來發(fā)送面向無連接的數(shù)據(jù),先檢查是否允許 通過,然后進行轉(zhuǎn)發(fā)。 過濾 WSPRecv。這個函數(shù)用來接收面向連接的數(shù)據(jù)。首先判斷是不是重疊 操作并且設(shè)置回調(diào)函數(shù)。如果設(shè)置,則用自定義函數(shù) AddOverlapped 保存參數(shù) 信息,然后用自己的回調(diào)函數(shù)代替原來的并轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)后根據(jù)返回值判斷操作 是否成功,如果成功,則調(diào)用控管函數(shù)對操作的合法性進行判斷;否則直接返 回。 過濾 WSPRecvFrom。這個函數(shù)用來接收面向連接的數(shù)據(jù)。首先判斷是不是 重疊操作并且設(shè)置回調(diào)函數(shù)。如果設(shè)置,則用自定義函數(shù) AddOverlapped 保存 參數(shù)信息,然后用自己的回調(diào)函數(shù)代替原來的并轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)后根據(jù)返回值判斷 操作是否成功,如果成功,則調(diào)用控管函數(shù)對操作的合法性進行判斷;否則直 接返回。 4.2訪問控管 編寫一個 CCheckAcl。它封裝了一組對訪問權(quán)限進行控制的函數(shù)。訪問權(quán) 限主要是由控管規(guī)則設(shè)置決定。另外還封裝了一組網(wǎng)絡(luò)封包操作函數(shù)。下面是 一些主要函數(shù)及相應(yīng)代碼。 4.2.1 對服務(wù)提供者函數(shù)做管制的函數(shù) CheckStartup:應(yīng)用程序連網(wǎng)前的訪問控制權(quán)限。在服務(wù)提供者函數(shù) WSPStartup 中對訪問權(quán)限進行控制。WSPStartup 是 Wi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論