




已閱讀5頁,還剩37頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
畢業設計(論文)畢業設計(論文) 題目:題目: 一個包過濾型防火墻軟件的開發一個包過濾型防火墻軟件的開發 學生姓名:學生姓名: 學學 號:號: 班班 級級: 專專 業:業: 指導教師:指導教師: 2011 年年 6 月月 一個包過濾型防火墻軟件的開發一個包過濾型防火墻軟件的開發 學學生生姓姓名名 : 學學 號:號: 班班 級:級: 所所在在院院 (系系): 指指導導教教師師 : 完完成成日日期期 : 2010 年年 6 月月 一個包過濾型個人防火墻軟件的開發 摘 要 隨著病毒、木馬、黑客攻擊等問題的出現,網絡安全形勢日漸嚴峻,網絡 安全產品也被人們重視起來。防火墻作為最早出現的網絡安全產品和使用量最 大的安全產品,也受到用戶和研發機構的青睞。防火墻放置在外部網絡與計算 機之間作為隔離設備,可以識別并屏蔽非法請求,有效防止跨越權限的數據訪 問。 本文使用 VC+ 6.0 作為開發工具實現了一個包過濾型個人防火墻軟件。系 統主要包括兩大模塊,一是核心模塊設計,即 DLL 工程,實現了封包截獲、管 制動作和協議封包的解析任務。其中實現網絡封包截獲功能主要是利用 Winsock 2 SPI 技術,此后再利用控管規則對過往封包進行合法性檢查和過濾, 方法是首先利用 Winsock 2 SPI 技術建立 winsock 鉤子,用它來截獲 winsock 的 調用,然后作出相應動作處理,動作處理需通過控管規則的檢查后,確定 socket 連接是否允許通過,而控管規則由用戶層設置;二是用戶模塊設計,即 EXE 工程,實現用戶界面和負責與 DLL 模塊的通信,提供了 3 個主要界面, 即封包監視、控管規則、控管規則設置。最后通過測試和應用,基本達到了預 期的設計,解決了終端用戶的網絡連接安全問題。 關鍵詞: 網絡安全;網絡協議封包;個人防火墻;動態鏈接庫;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 編程技術.3 2.1WINSOCK 2 SPI 基礎.3 2.2傳輸服務提供者.3 2.3開發平臺與開發工具.4 3 系統總體分析與設計 .5 3.1系統功能定義.5 3.2模塊劃分.5 3.2.1 模塊劃分原則.5 3.2.2 模塊結構.6 3.2.3 模塊接口定義.7 3.3程序工作流程圖.8 3.4控管規則文件結構設計.9 3.4.1 控管規則文件需要存儲的內容.9 3.4.2 控管規則文件結構.11 3.5界面設計.11 3.5.1 制定界面風格.11 3.5.2 界面設計文檔.12 3.6編碼規則.16 4 核心功能的實現 .17 4.1封包截獲.17 4.2訪問控管.21 4.2.1 對服務提供者函數做管制的函數.21 4.2.2 封包處理函數.22 4.2.3 管制函數.23 4.2.4 設置函數.27 5 系統測試 .28 5.1 測試方法概述.28 5.2 測試用例及測試結果.28 6 結束語.34 6.1 總結.34 6.2 展望.34 參考文獻.35 致 謝.37 1 引言 1.1課題背景與意義 隨著網絡在各領域應用的越來越廣泛,網絡安全問題得到了更多的關注。 計算機病毒攻擊可以導致電腦系統癱瘓;而木馬和黑客攻擊可致使重要信息被 竊取,造成不可估量的損失。所以人們開始尋求如何能在電腦和網絡間添加一 種可靠保護體系。防火墻就此應運而生。顧名思義,防火墻能夠在計算機和網 絡間形成一道過濾屏障,保證被認可的行為順利執行,而危險行為則被屏蔽。 從而很大程度上增加了網絡的安全性。 1.2課題目標 現在防火墻的花樣與種類繁多,讓人眼花繚亂。但是防火墻的主要功能是 防止外部網絡的攻擊以達到保護主機的目的。哪些未知的網絡 IP 可能對主機產 生攻擊可能是未可知的,只有試驗過才知道。所以現在防火墻一般與防病毒軟 件配合使用。這樣才能安全的保護主機。 實現的主要的核心功能如下定義: (1) 根據應用程序訪問規則可對應用程序連網動作進行過濾; (2) 對應用程序訪問規則具有自學習功能; (3) 可實時監控、監視網絡活動。 1.3課題的研究方法 本課題由兩大模塊構成,分別為 DLL 模塊和 EXE 模塊。 首先利用 Winsock 2 SPI 技術建立 winsock 鉤子用來截獲 winsock 調用從而 攔截 TCP/IP 封包,并做相應處理。然后設置控管規則訪問控制,通過控管規則 的檢查認證,確定 socket 連接是否允許通過。在此之后是 TCP/IP 的封包分析, 利用 TIP/IP 的封包結構分析截獲的數據,提取需要的數據。這些封裝在 DLL 里 面【1】。 EXE 模塊主要是用戶頁面的制作。這里介紹與 DLL 模塊通信的地方。EXE 中與 DLL 直接通信的小模塊主要有兩個。一個是完成應用程序初始化的類 CPropertyApp,它繼承自 CWinApp,是 EXE 的入口,其實里面封裝了 WinMain 函數;另一個是主窗口模塊 CMainFrame,這個主窗口并不是 EXE 顯示出來的 那個屬性頁窗口,而是一個隱藏的窗口,它繼承自 CMrameWnd,是一個無模 式窗口,他隱藏顯示,充當接受機,用來接受 DLL 及其他模塊發送過來的消息, 然后對消息進行相應的處理。 每一個連網的程序連網之前都會建立一個 Socket 連接。這時鉤子程序就會 起作用,把截獲的底層服務進行“過濾” ,及先調用自定義的函數再轉給下層服 務提供者函數【2】。本文將這一層實現封包過濾的,把規則與功能寫到這一層。 本層的實現是本課題的核心。 2 WINSOCK 2 SPI 編程技術編程技術 Winsock 2 是 Windows Sockets 的 2.0 版本,在此之前的版本是 1.1。與 1.1 版本相比,2.0 版本引入了一種新的叫做 SPI 的編程接口。利用這種技術可以在 Socket 中插入一曾層,從而可以完成諸如擴展 TCP/IP 協議棧,網絡安全控制等 功能,所以這是一個非常強大而且有用的接口,下面介紹這種編程技術。 2.1 WINSOCK 2 SPI 基礎 Winsock 是為上層應用程序提供的一種標準網絡接口,上層應用程序不用 關心 Winsock 實現的細節,它為上層應用程序提供透明的服務。 Winsock 2 引入的一個新的功能就是打破服務提供者的透明,讓開發者可 以編寫自己的服務提供者接口程序,即 SPI 程序。SPI 以動態鏈接庫的形式存 在,它工作在應用層,為上層 API 調用接口函數【3】。Winsock 2 是一個接口, 不是一個協議。作為接口,它只能發現和利用底層傳輸協議完成通信。 自己編寫的 SPI 程序安裝到系統之后,所有的 Winsock 請求都會發送到這 個程序并由它完成網絡調用。由于系統提供的 SPI 已經可以完成網絡傳輸功能, 所以自己編寫的 SPI 沒有必要重新編寫這部分功能。一般可以直接調用系統函 數完成網絡傳輸,這樣工作的效果就是“鉤子程序。 Winsock 2 SPI 除了有完成網絡傳輸的傳輸服務提供者,還有提供友好名稱 服務的名字空間服務提供者。傳輸服務提供者能夠提供建立通信、傳輸數據、 流量控制和錯誤控制等服務。名字空間服務提供者把一個網絡協議的地址屬性 和一個或多個用戶友好名稱關聯起來,這樣可以起用與協議無關的名字解析方 案。 2.2 傳輸服務提供者 傳輸服務提供者又分為基礎服務提供者和分層服務提供者?;A服務提供 者和分層服務提供者都開放相同的 SPI 接口,所不同的是基礎服務提供者位于 提供者的最底層。所以編寫基礎服務提供者和分層服務提供者基本相同。但安 裝是卻需要將基礎服務提供者安裝在服務提供者加載順序鏈的最底端,而分層 服務提供者則根據需要分布在順序鏈的中間。 2.3 開發平臺與開發工具 開發平臺如題說明,以 Windows 平臺為主,重點討論開發工具的選擇。 根據不同的工程選擇不同的開發工具,可以有效地提高工作效率。不同的 開發工具各有各的優點同時又各有各的不足,在開發中要揚長避短。 目前常用的 Windows 開發工具有 VS 5.0/6.0、VS.net(包括 VB、BC、VFP、VJ、C#等一組開發工具) 、delphi、C+ Builder,JBuilder、PB 等【4】。 在這些開發工具里面,VFP 和 PB 一般用來專門開發數據庫系統,它們具 有靈活的數據庫接口。 VB 和 Delphi 既可以方便地做出復雜的數據庫管理系統,又能輕松地完成 操作系統級的任務。最優秀的是很容易做出漂亮的界面。 VC 和 Borland C+著重于系統編程,它們開放接口較多,也最為靈活,而 且編譯出的程序體積較小,所以比較適合做系統工具類軟件。缺點是短時間不 容易掌握。其中 Borland 使用的 VCL 類庫是為 Delphi 準備的,并不是真正用 C+實現的。 VJ、Jbuilder 和 Java 語言主要面向互聯網應用。最大的優勢是跨平臺。 本課題為防火墻軟件,較多的使用系統接口,而且界面簡單。另外,防火 墻主要傳播渠道是互聯網,這就要求體積應盡量的小,安裝盡量方便。所以選 擇 VC 為開發工具。 3 系統總體分析與設計 3.1 系統功能定義 本設計實現的具體功能描述如下: (1) 封包監視 提供封包監視頁面。 提供清空監視列表,停止/開始監視及停止/開始滾動功能。 (2) 控管規則設置 手工添加,刪除及修改控管規則。 自學習添加控管規則。 控管規則中目的網絡 IP 地址段的設置。 提供控管規則設置頁面。 (3) 封包過濾 DLL 給出設置工作模式和設置控管規則的接口函數。工作模式分為 3 種形式:放行所有,拒絕所有和過濾。 DLL 根據工作模式和控管規則對過往封包進行過濾。 DLL 將通過的網絡封包通知 EXE 取走 。 3.2 模塊劃分 3.2.1 模塊劃分原則 模塊劃分是系統分析中非常重要的一部分,下面是模塊劃分時的基本原則。 (1) 獨立性:讓模塊直接內的關系減到最少。理想的狀態就是模塊之間沒 有關系,但這種情況不符合現實。既然是同一個工程,模塊之間自然都會存在 一定的聯系,只要想辦法讓模塊之間的關系盡量簡單就可以了。 (2) 接口簡單化:讓模塊之間的接口盡量單純、簡單、易用。即讓公用函 數和公用變量盡量地少。 (3) 分層處理:吸取 Windows 操作系統對模塊做分層處理的經驗。建立一 些中間模塊,讓兩端的模塊來完成相互調用的透明化。 (4) 容易合并:容易將劃分的模塊進行合并。例如將一個工程的各個功能 模塊分別設計成可執行文件,然后用一個總模塊將這些模塊關聯起來組成一個 工程。這種情況下,對模塊獨立性要求較高,模塊之間幾乎沒有任何關系。 (5) 可測試性:盡量使每個模塊都可以單獨進行測試6。 上面的 5 條是參考原則,既然是參考原則就不會完全執行,完全按照一個 教條去執行真的很困難。只要在做模塊劃分的時候能經常記起這些原則,然后 稍加注意就 OK 了。另外,在這 5 條原則中,第一條是根本,能把這一條做好, 下面的一些就容易實現了。在做模塊劃分時一定要始終貫穿獨立性的思想。 3.2.2 模塊結構 根據 3.1 節的功能定義和 3.2 節的工作流程圖,需要對模塊做進一步細化, 得出更詳細的模塊結構。這些模塊結構是編程的藍本,在編寫代碼的過程中, 就要以這些結構為指導。 (1) 模塊 1.1:用戶界面,3.5 節詳細說明。 (2) 模塊 1.2:EXE 的安裝模塊, 。建立 CXInstall 類,C+源文件 Install.h 和 Install.cpp。安裝函數 InstallProvider 和卸載函數 RemoveProvider (3) 模塊 1.3:EXE 讀寫控管規則模塊,建立 CAclFile 類,C+源文件 File.h 和 File.cpp。讀控管規則文件 ReadAcl,保存控管規則文件 SaveAcl,增加 一條控管規則 AddAcl 和刪除一條控管規則 DelAcl。 (4) 模塊 1.4:EXE 設置 DLL 的控管規則模塊,設置控管規則單獨的函數, 調用模塊 1.3 讀寫控管規則模塊得到控管規則數據,調用 DLL 的函數 FloControl 設置 DLL 的控管規則。 (5) 模塊 1.5:EXE 設置 DLL 的工作模式,設置工作模式單獨的函數,調 用模塊 1.3 讀寫控管規則模塊得到控管規則數據,調用 DLL 的函數 FloControl 設置 DLL 的工作模式。 (6) 模塊 2.1:DLL 封包過濾模塊,有分為 3 塊,2.1.1 一組 Winsock 2SPI 鉤子函數 C+源文件 TcpipDog.h 和 TcpipDog.cpp;模塊 2.1.2 根據控管規則判 斷是否可以通行的類 CCheckAcl,C+源文件 CheckAcl.h 和 CheckAcl.cpp;模 塊 2.1.3 對網絡數據包進行分析的類 CProtocolInfo,C+源文件 ProtocolInfo.h 和 ProtocolInfo.cpp。 模塊 2.1.1:服務提供者函數模塊,入口函數 WSPSartup,發送詢問消 息到 EXE,由 EXE 提供詢問界面函數 QueryAccess。截獲的 8 個服務提供者函 數。設置工作模式、控管規則等設備工作接口函數 FloControl。 模塊 2.1.2:訪問控管模塊,通過檢查工作模式和控管規則得到是否放 行的函數 GerAccessInfo。 模塊 2.1.3:協議解析模塊,得到協議信息處理函數 GetProtocolInfo (7) 模塊 2.2:DLL 更改控管規則模塊,設置 DLL 控管規則數據 SetAcl, 設置控管規則 m_Aclfile,設置工作模式 m_iWorkMode。 (8) 模塊 2.3:DLL 更改工作模式模塊,設置 DLL 工作模式函數 SetWorkMode。 3.2.3 模塊接口定義 模塊之間接口有 3 種方式: (1) 函數接口 函數接口是最常用而且獨立性和封裝性最好的接口方式7。函數之間通過 參數傳遞進行模塊之間的通信,處理過程保持相互獨立,函數處理完成把處理 結果返回到調用模塊。如果每個函數都有單獨的接口,那么,函數多了,接口 也就多了,也就越來越復雜了。C+利用類的餓概念解決這個問題。類可以將 一組函數和變量封裝起來,這樣就將許許多多的函數轉化成一個對象的形式。 外部模塊使用這個類的實例來引用封裝在里面的成員函數個變量。把功能相似、 相關的函數分成一組,然后封裝在一起,使接口間的關系清晰了很多。類的成 員函數和成員變量有公有和私有之分。對于公有函數和變量,外部模塊可以直 接調用;對于私有函數和變量,外部模塊則不能直接調用。利用這種特性,可 以把一些只在類里面使用的函數定義為私有函數;把外部模塊需要直接調用的 函數定義為公有函數。類似于 DLL 的導出函數(Export) ,這樣,模塊之間的 直接接觸就會進一步減小,獨立性更進一步增加。 (2) 全局變量接口 全局變量接口是一種不提倡的方式。雖然它使用起來確實很過癮。全局變 量多了非常容易出問題。任何地方都可能會對全局變量進行賦值,變量的可控 性大大降低,不知道什么時候變量的值就被莫名其妙地改掉了。當然,只要不 被那些模塊執行的先后順序和循環語句弄昏頭,還是可以使用全局變量的。雖 然不提倡使用,但是有些地方使用全局變量與是不可避免的,而且有時候可以 減少很多麻煩。使用全局變量的時候需要注意一點,讀取變量的多少和位置對 程序穩定性的影響并不很大,關鍵是盡量讓賦值的地方單一,改變變量的次數 和位置應盡量得到控制。 (3) Windows 消息接口 Windows 消息接口是一種特殊的接口形式,它是基于 Windows 操作系統的 消息機制8。這種接口形式適合于應用程序之間。應用程序是相對獨立的模塊, 如果這兩個模塊需要通信,則消息接口就是一種理想型的選擇。這種接口類似 于函數接口,只不過通過操作系統的消息機制來中轉一下。Windows 消息接口 也是一種接口方式,特別是 DLL 和 EXE 之間經常用到。在 DLL 與 EXE 之間 通信使用消息是一種優勢,多個應用程序雖然調用同一個 DLL,但是它們都擁 有獨立的模塊副本。這時候如果這些模塊副本都需要讓同一個應用程序做一件 事時,就不好處理,因為 DLL 的重要性和應用程序保護機制導致這些模塊副本 無法直接調用同一個應用程序的執行模塊。這時候就可以通過消息的方式來解 決。發送消息是基于窗口句柄的,只要得到這個窗口句柄,不同的 DLL 副本都 向同一個窗口句柄發送消息,自然所有的消息都可以被同一個應用程序接收9。 以上 3 種接口方式以函數接口為優先進行考慮,以增強模塊的獨立性和可 讀性。 3.3 程序工作流程圖 Winsock 2 SPI 是一個 DLL 程序,它工作在 API 和 DRIVER 之間,為上層 應用程序提供服務【5】。EXE 與 DLL 構成軟件的主體,也是編寫軟件的主要工 作。流程圖如圖 3.1 所示。 模塊1.1.1 控管規則 輸入界面接口 模塊1.1.2 封包監 視界面接口 模塊1.3 讀寫控管 規則 模塊1.4 設置控管 規則 模塊1.5 設置工作 模式 控管規則文件 (.cfg) 模塊2.2 控 管規則 模塊2.3 工 作模式 用戶界面(EXE) 模塊1.2 安裝 Winsock 2SPI (DLL) 模塊 2.1 封 包 過 濾 模塊1.1 用戶界面接口 圖 3.1 防火墻工作流程圖 3.4 控管規則文件結構設計 控管規則文件用來存儲控管規則數據,命名為 acl.cfg;該數據文件為二進 制文件。 3.4.1 控管規則文件需要存儲的內容 控管規則文件需要存儲的內容如下: (1) 系統設置 (2) 控管設置 (3) 控管規則附加數據,授權訪問的遠端網絡 IP 地址記錄 a.控管規則記錄結構說明 (1) 規則編號字段是控管規則的唯一性編號。保留字段,沒有使用。 (2) 應用程序名稱及路徑字段用來保持應用程序的名稱和路徑。 (3) 遠端網絡類型,數值的含義如下。 0:表示所有網絡 1:局域網 2:約束的網絡(自定義) 3:信任的網絡(自定義) 4:自定義的網絡(自定義) 模塊 1.1 用戶界面接口 (4) 管制動作,數值的含義如下。 0:放行 1:拒絕 (5) 進出方向,數值的含義如下。 0:出 1:入 2:雙向 (6) 服務類型,數值的含義如下。 0:全部 1:TCP(端口為任意,可編輯) 2:UDP(端口為任意,可編輯) 3:FTP(端口為 21,不可編輯) 4:TELNET(端口為 23,不可編輯) 5:HTTP(端口為任意,可編輯) 6:NNTP(端口為 119,不可編輯) 7:POP3(端口為 110,不可編輯) 8:SMTP(端口為 25,不可編輯) (7) 服務端口,數值的含義如下。 0:表示全部 其他值:表示端口值 b.授權訪問的遠端 IP 地址記錄結構 授權訪問的遠端網絡 IP 地址結構如表 1 所示。 表 1 授權訪問的遠端網絡 IP 地址段記錄結構 字段 類型 長度 開始 IP 無符號長整型 4 結束 IP無符號長整型 4 3.4.2 控管規則文件結構 根據需要存儲的內容將控管規則文件劃分為 3 段。 文件頭用來存儲系統設置,IP 地址范圍記錄和控管規則記錄的地址偏移量 及其他信息10;IP 地址范圍記錄存儲區用來存儲 IP 地址范圍記錄;控管規則 記錄存儲區用來存儲控管規則記錄。 a. 控管規則結構 控管規則結構如表 2 所示。 表 2 控管規則記錄結構表 08162432404856 控管規則編號應用程序路徑和名稱 遠端網絡動作方向服務類型端口 b. IP 地址結構 IP 地址段記錄結構如表 3 所示。 表 3 IP 地址段記錄結構表 08162432404856 開始 IP 地址結束 IP 地址 開始 IP 地址結束 IP 地址 3.5 界面設計 3.5.1 制定界面風格 界面上反映的功能有:封包監視、控管規則設置。這是兩個平行的功能, 所以選用 Windows 的屬性頁。 3.5.2 界面設計文檔 界面設計如下所示。 a. 封包監視界面 封包監視界面用來顯示截獲的網絡封包。每個網絡封包的具體內容根據實 際需要而定。如圖 3.2。 圖 3.2 封包監視界面 封包的字段有: (1) 應用程序路徑和名稱 (2) 管制動作(放行或拒絕) (3) 訪問起始/結束時間 (4) 使用網絡協議 (5) 進/出流量 (6) 本地和遠端 IP 地址/端口 (7) 備注信息 封包監視界面實時接收 DLL 發送過來的網絡封包并立刻顯示。 在封包監視界面上設計了幾個附加按鈕。 “停止/開始滾動”用來設置監視 列表是否自動滾動;“開始/停止監視”用來設置是否實時監視;“清除”按鈕 用來清除當前列表。這些功能按鈕方面操作。 b. 控管規則界面 控管規則界面用來顯示和設置控管規則(如圖 3.3) 。需要說明的是,應用 程序設置的優先級高于控管規則設置,只是在應用程序設置為詢問時,下面的 控管規則設置才有效。 圖 3.3 控管規則界面 控管規則的設計目的是為了制訂對網絡訪問的控制,所以控管規則的字段 可以決定防火墻防范的嚴密性和靈活程度??毓芤巹t的記錄結構為: 應用程序 遠端網絡 管制動作 進出方向 協議類型 使用端口 控管規則界面給出了“增加” 、 “刪除” 、 “修改”3 個功能按鈕用來對控管 規則進行不同的操作。其中選擇增加和修改時都會彈出控管規則設置界面。 (1) 控管規則設置界面 控管規則設置界面是用來設置控管規則的各個字段(如圖 3.4) 。在“應用 程序”欄輸入或選擇要進行控管的應用程序的完整路徑和文件名。 “遠端網絡”用 IP 地址范圍表示,用來定義網絡類型的 IP 地址范圍。本 軟件工劃分為 5 個類型:所有網絡、局域網、受約束的網絡、信任的網絡和自 定義網絡。 “動作”用來確定符合這一條控管規則的網絡訪問動作是放行還是拒絕。 “方向”用來確定這一條控管規則適合于網絡訪問的連接方向。本機向遠 端服務器發出連接請求就是出;遠端主機向本機發出連接請求則為進。 “類型”是控管規則約定的協議類型。 “端口”是協議所使用的端口。 圖 3.4 控管規則設置界面 (2) 網絡設置界面 網絡設置界面用來對各種網絡類型的 IP 地址段進行設置(如圖 3.5) ,在上 節有關于遠端網絡類型的介紹。在這個界面上提供對 IP 地址段的增加、修改和 刪除功能 圖 3.5 網絡設置界面 3.6 編碼規則 變量命名規則如下: (1) 變量采用代表中文意思的英文單詞或單詞組合。 (2) 變量一般不用縮寫,用英文單詞全稱。較長的更為習慣的縮寫。 (3) 自定義全局變量用 m_開頭。 (4) 自定義過程變量不用 m_開頭。 (5) 變量的前綴用變量類型的第一個字母標志變量類型。如,指針類型在 前面多加一個字母 P。 (6) 如果是對象,前綴用對象的名稱,第一個字母大寫。 (7) 變量中有多個單詞時,單詞的第一個字母大寫,其余用小寫。 (8) 有了自己的編碼規則后,不會出現自己的弄不清楚自己定義的函數之 類的是什么意思。不知道函數是干什么的。以至于思維混亂。 4 核心功能的實現 本課題的核心功能實現封裝在 DLL 里面。下面分析 DLL 的主要內容。 4.1 封包截獲 BOOL WINAPI DllMain 是 DLL 的入口函數,系統調用時的標準接口12。 做一些初始化工作。主要工作是得到調用這個程序的進程路徑和名稱并設置 DLL 調用次數的計數器。 WSPStartup 是 Windows Sockets 應用程序調用 SPI 的初始化函數。是服務 提供者的標準入口函數。這里的工作是根據 lpProtocolInfo 找出已經被替換的服 務提供者路徑,然后加載,并利用被替換服務提供者的 WSPStartup 得到 30 個 服務函數指針。需要先保存這些函數指針,然后將 lpProcTable 結構中的 30 個 服務函數指針都設置成自己的。這樣,相應的函數請求會首先經過我們自己的 函數,然后用這些函數可以做適當的處理,再調用原來的,將請求轉發,完成 整個通信。 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; /以上是我們截獲并要用自己定義的函數。 LeaveCriticalSection( return 0; XfIoControl 是供 EXE 調用的。用來設置 DLL 的配置信息和得到 DLL 的反 饋信息,這個函數為 EXE 提供接口,EXE 通過這個函數來設置工作模式,或 得到截獲的網絡封包信息。 QueryAccess 是在應用程序提交連網請求時,如果發現控管規則中沒有關于 這個應用程序的控管規則,并且工作模式為詢問,則向擁護發出詢問,是否讓 這個程序通行。 GetHookProvider 用來讀取注冊表得到系統的 SPI 的 DLL 路徑和文件信息。 這個信息是安裝時自己寫入的。根據 pProtocolInfo 信息取出自己保存的、已經 被本程序替換的服務提供者路徑。 GetRightEntryIdItem 是供 GetHookProvider()調用的擴展函數,用來得到 保存系統服務提供者路徑的注冊表鍵名。及得到已經被本程序替換的服務提供 者的 dwCatalogEntryId。 XfShutdown 調用系統服務提供者函數 WSPShutdown,關閉一個 Socket 連 接。并設置相應的錯誤代碼。 截獲的服務提供者函數: 過濾 WSPSocket。WSPSocket 是用來創建 Socket 的函數【15】,首先調用底 層函數得到新創建的 Socket,然后設置新建 Socket 的協議信息,并調用自定義 函數 CheckSocket 為這個 Socket 建立 Session,然后保存相應的信息。 過濾 WSPCloseSocket。轉發之前首先調用自定義函數 CheckCloseSocket 刪 除相應的 Session。 過濾 WSPConnect。當一個 Socket 建立連接后調用這個函數,轉發之前先 調用訪問控制函數 CheckConnect,檢查是否放行。如果不放行,返回錯誤;如 果放行,調用底層 WSPConnect 函數進行轉發。 過濾 WSPAccept。用來接受一個連接請求。首先調用底層函數,然后對連 接的合法性進行檢查,如果不允許通過,關閉這個連接 過濾 WSPSend。這個函數用來發送面向連接的數據,先檢查是否允許通過, 然后進行轉發。 過濾 WSPSendTo。這個函數用來發送面向無連接的數據,先檢查是否允許 通過,然后進行轉發。 過濾 WSPRecv。這個函數用來接收面向連接的數據。首先判斷是不是重疊 操作并且設置回調函數。如果設置,則用自定義函數 AddOverlapped 保存參數 信息,然后用自己的回調函數代替原來的并轉發。轉發后根據返回值判斷操作 是否成功,如果成功,則調用控管函數對操作的合法性進行判斷;否則直接返 回。 過濾 WSPRecvFrom。這個函數用來接收面向連接的數據。首先判斷是不是 重疊操作并且設置回調函數。如果設置,則用自定義函數 AddOverlapped 保存 參數信息,然后用自己的回調函數代替原來的并轉發。轉發后根據返回值判斷 操作是否成功,如果成功,則調用控管函數對操作的合法性進行判斷;否則直 接返回。 4.2訪問控管 編寫一個 CCheckAcl。它封裝了一組對訪問權限進行控制的函數。訪問權 限主要是由控管規則設置決定。另外還封裝了一組網絡封包操作函數。下面是 一些主要函數及相應代碼。 4.2.1 對服務提供者函數做管制的函數 CheckStartup:應用程序連網前的訪問控制權限。在服務提供者函數 WSPStartup 中對訪問權限進行控制。WSPStartup 是 Wi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司車輛存放管理制度
- 加強倉儲安全管理制度
- 公司經理考核管理制度
- 公司違規罰款管理制度
- 少先隊室安全管理制度
- 工廠寢室安全管理制度
- 培訓機構門控管理制度
- 健全知青檔案管理制度
- 廚房庫房衛生管理制度
- 公司系統安全管理制度
- 當兵言語測試試題及答案
- 四川省眉山縣2025屆中考生物仿真試卷含解析
- 跨學科實踐:制作望遠鏡-【跨學科實踐】初中物理項目化課程案例
- 1-學?!?530”安全教育管理工作實施方案及記錄
- 案場主管轉正述職報告
- 促進自然分娩的健康教育
- 短缺藥品上報流程
- 《企業文化理論與實務》 課程標準
- 2025年銀行反洗錢知識競賽題庫及答案 (共150題)
- 豇豆種植及初加工項目建議書
- 人教版五年級數學下冊全套試卷附完整答案
評論
0/150
提交評論