當(dāng)前個(gè)人防火墻存在的問題及對策_(dá)第1頁
當(dāng)前個(gè)人防火墻存在的問題及對策_(dá)第2頁
當(dāng)前個(gè)人防火墻存在的問題及對策_(dá)第3頁
當(dāng)前個(gè)人防火墻存在的問題及對策_(dá)第4頁
當(dāng)前個(gè)人防火墻存在的問題及對策_(dá)第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、當(dāng)前個(gè)人防火墻存在的問題及對策當(dāng)前個(gè)人防火墻存在的問題及對策摘摘 要要網(wǎng)絡(luò)安全問題長期威脅著網(wǎng)絡(luò)終端用戶,需要有有效的安全工具解決這個(gè)問題,個(gè)人防火墻就是其中的一種常用的安全工具。為了實(shí)現(xiàn)個(gè)人防火墻軟件,選用 VC+ 6.0 開發(fā)工具。軟件系統(tǒng)主要包括兩項(xiàng)工程,一是核心模塊設(shè)計(jì),即DLL 工程,實(shí)現(xiàn)了封包截獲、管制動作和協(xié)議封包的解析任務(wù),主要利用Winsock 2 SPI 技術(shù)實(shí)現(xiàn)網(wǎng)絡(luò)封包截獲,之后利用控管規(guī)則對過往封包進(jìn)行合法性檢查和過濾,方法是首先利用 Winsock 2 SPI 技術(shù)建立 winsock 鉤子,用它來截獲 winsock 的調(diào)用,然后作出相應(yīng)動作處理,動作處理需通過控管

2、規(guī)則的檢查后,確定 socket 連接是否允許通過,其中控管規(guī)則由用戶層設(shè)置;二是用戶模塊設(shè)計(jì),即 EXE 工程,實(shí)現(xiàn)用戶界面和負(fù)責(zé)與 DLL 模塊的通信,提供了3 個(gè)主要界面,即封包監(jiān)視、控管規(guī)則、控管規(guī)則設(shè)置。最后通過測試和應(yīng)用,基本解決了終端用戶的網(wǎng)絡(luò)連接安全問題。關(guān)鍵詞:關(guān)鍵詞: 過濾;動態(tài)連接庫;Winsock 2 SPI;網(wǎng)絡(luò)封包;協(xié)議封包The Design of the Personal Firewall Based on WindowsAbstractThe terminal users of network are always threaten by the proble

3、ms of security of network,so we need a effective tool to solve this problem.The personal firewall is one of the common tools of security. VC+ is selected to implement the personal firewall.The system has two projects mainly. One of the projects is the design of core module which can be called the pr

4、oject of DLL.This project implements behaviors of management and the analysis of packets of protocols. The technology of Winsock 2 SPI is used to capture of pakcets of network. After that, then the checking and filtering of the packets are done using the rules of control and management. At the begin

5、ning, the control rules build up the Hook of winsock which is used to capture the tranfer of winsock,and then it implements relative behaviors.The link of socket will be or not get through checking by the rules of control and management. The rules of control and management are set by the layer of us

6、er.Then, we should design the module of user which can be called the project of exe. It implements the interface of user and the module of communication with DLL. It provides three main interfaces, they are the watching of filtering packet, the rules of control and management and the setting of rule

7、s of control and management. Finally, it has solved the requirement of security of terminal users after the final testing and application.Key words: Filter ;DLL;Winsock 2 SPI;Network packets; Protocol packets目錄目錄論文總頁數(shù):25 頁1引言引言.11.1課題背景與意義.11.2設(shè)計(jì)實(shí)現(xiàn)的主體功能.11.3本課題的研究方法.12WINSOCK 2 SPI 編程技術(shù)編程技術(shù).22.1WINS

8、OCK 2 SPI 基礎(chǔ).22.2傳輸服務(wù)提供者.23開發(fā)平臺與開發(fā)工具開發(fā)平臺與開發(fā)工具.24系統(tǒng)設(shè)計(jì)與模塊劃分系統(tǒng)設(shè)計(jì)與模塊劃分.34.1本課題要實(shí)現(xiàn)的具體功能.34.2程序工作流程圖.34.3模塊劃分.44.3.1模塊劃分原則.44.3.2模塊結(jié)構(gòu).44.3.3模塊接口定義.54.4控管規(guī)則文件結(jié)構(gòu)設(shè)計(jì).64.4.1控管規(guī)則文件需要存儲的內(nèi)容.74.4.2控管規(guī)則文件結(jié)構(gòu).84.5界面設(shè)計(jì).84.5.1制定界面風(fēng)格.84.5.2界面設(shè)計(jì)文檔.84.6編碼規(guī)則.125核心功能的代碼實(shí)現(xiàn)核心功能的代碼實(shí)現(xiàn).125.1DLL 的封包截獲.125.2DLL 的訪問控管.165.2.1設(shè)置函數(shù).1

9、96測試測試.20結(jié)結(jié) 論論.21參考文獻(xiàn)參考文獻(xiàn).211 1 引言引言1.11.1課題背景與意義課題背景與意義目前,隨著網(wǎng)絡(luò)向各個(gè)領(lǐng)域的擴(kuò)展,網(wǎng)絡(luò)安全的重要性日益被人們所認(rèn)知。ISP 提供商擔(dān)心網(wǎng)絡(luò)被攻擊,因?yàn)檫@種事情發(fā)生太頻繁;使用網(wǎng)上交易的用戶擔(dān)心帳戶密碼被盜,因?yàn)楦`取密碼的工具比比皆是;軟件公司擔(dān)心源代碼泄露,就連微軟也沒逃脫厄運(yùn)。種種現(xiàn)象都表明網(wǎng)絡(luò)安全越來越重要,這種事情隨時(shí)都可能發(fā)生在我們自己身上。這也正是網(wǎng)絡(luò)安全快速發(fā)展的原因。所以防火墻和防病毒軟件格外的重要,也被現(xiàn)在的人們強(qiáng)烈的需要。1.21.2設(shè)計(jì)實(shí)現(xiàn)的主體功能設(shè)計(jì)實(shí)現(xiàn)的主體功能現(xiàn)在防火墻的花樣與種類繁多,讓人眼花繚亂。但是

10、防火墻的主要功能是防止外部網(wǎng)絡(luò)的攻擊以達(dá)到保護(hù)主機(jī)的目的。我認(rèn)為哪些未知的網(wǎng)絡(luò) IP 可能對主機(jī)產(chǎn)生攻擊可能我們都不知道。只要試驗(yàn)過才知道。所以現(xiàn)在防火墻一般與防病毒軟件配合使用。這樣才能安全的保護(hù)主機(jī)。實(shí)現(xiàn)的主要的核心功能如下定義:1. 根據(jù)應(yīng)用程序訪問規(guī)則可對應(yīng)用程序連網(wǎng)動作進(jìn)行過濾;2. 對應(yīng)用程序訪問規(guī)則具有自學(xué)習(xí)功能;3. 可實(shí)時(shí)監(jiān)控、監(jiān)視網(wǎng)絡(luò)活動。1.31.3本課題的研究方法本課題的研究方法本課題由兩大模塊構(gòu)成,分別為 DLL 模塊和 EXE 模塊。首先利用 Winsock 2 SPI 技術(shù)建立 winsock 鉤子用來截獲 winsock 調(diào)用從而攔截 TCP/IP 封包,并做相

11、應(yīng)處理。然后設(shè)置控管規(guī)則訪問控制,通過控管規(guī)則的檢查認(rèn)證,確定 socket 連接是否允許通過。最后是 TCP/IP 的封包分析,利用 TIP/IP 的封包結(jié)構(gòu)分析截獲的數(shù)據(jù),提取需要的數(shù)據(jù)。這些封裝在 DLL 里面。EXE 模塊主要是用戶頁面的制作。這里介紹與 DLL 通信的地方。EXE 中與DLL 直接通信的小模塊主要有兩個(gè)。一個(gè)是完成應(yīng)用程序初始化的類CPropertyApp,它繼承自 CWinApp,是 EXE 的入口,其實(shí)里面封裝了 WinMain 函數(shù);另一個(gè)是主窗口模塊 CMainFrame,這個(gè)主窗口并不是 EXE 顯示出來的那個(gè)屬性頁窗口,而是一個(gè)隱藏的窗口,它繼承自 CMr

12、ameWnd,是一個(gè)無模式窗口,他隱藏顯示,充當(dāng)接受機(jī),用來接受 DLL 及其他模塊發(fā)送過來的消息,然后對消息進(jìn)行相應(yīng)的處理。每一個(gè)連網(wǎng)的程序連網(wǎng)之前都會建立一個(gè) Socket 連接。這時(shí)鉤子程序就會起作用,把截獲的底層服務(wù)進(jìn)行“過濾” 。及先調(diào)用自定義的函數(shù)再轉(zhuǎn)給下層服務(wù)提供者函數(shù)。我就是在這一層實(shí)現(xiàn)封包過濾的。把規(guī)則與功能寫到這一層。這一層的實(shí)現(xiàn)是本課題的核心。2 2 W WINSOCKINSOCK 2 2 SPISPI 編程技術(shù)編程技術(shù)Winsock 2 是 Windows Sockets 的 2.0 版本,在此之前的版本是 1.1。與 1.1版本相比,2.0 版本引入了一種新的叫做 S

13、PI 的編程接口。利用這種技術(shù)可以在 Socket 中插入一曾層,從而可以完成諸如擴(kuò)展 TCP/IP 協(xié)議棧,網(wǎng)絡(luò)安全控制等功能,所以這是一個(gè)非常強(qiáng)大而且有用的接口,下面介紹這種編程技術(shù)。2.12.1 W WINSOCKINSOCK 2 2 SPISPI 基礎(chǔ)基礎(chǔ)Winsock 是為上層應(yīng)用程序提供的一種標(biāo)準(zhǔn)網(wǎng)絡(luò)接口,上層應(yīng)用程序不用關(guān)心 Winsock 實(shí)現(xiàn)的細(xì)節(jié),它為上層應(yīng)用程序提供透明的服務(wù)。Winsock 2 引入的一個(gè)新的功能就是打破服務(wù)提供者的透明,讓開發(fā)者可以編寫自己的服務(wù)提供者接口程序,即 SPI 程序。SPI 以動態(tài)鏈接庫的形式存在,它工作在應(yīng)用層,為上層 API 調(diào)用接口函

14、數(shù)。Winsock 2 是一個(gè)接口,不是一個(gè)協(xié)議。作為接口,它只能發(fā)現(xiàn)和利用底層傳輸協(xié)議完成通信。自己編寫的 SPI 程序安裝到系統(tǒng)之后,所有的 Winsock 請求都會發(fā)送到這個(gè)程序并由它完成網(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ù)、流量控制和錯(cuò)誤控制等服務(wù)。名字空間服務(wù)提供者把一個(gè)網(wǎng)絡(luò)協(xié)議的地址屬性和一個(gè)或多

15、個(gè)用戶友好名稱關(guān)聯(lián)起來,這樣可以起用與協(xié)議無關(guān)的名字解析方案。2.2 傳輸服務(wù)提供者傳輸服務(wù)提供者傳輸服務(wù)提供者又分為基礎(chǔ)服務(wù)提供者和分層服務(wù)提供者?;A(chǔ)服務(wù)提供者和分層服務(wù)提供者都開放相同的 SPI 接口,所不同的是基礎(chǔ)服務(wù)提供者位于提供者的最底層。所以編寫基礎(chǔ)服務(wù)提供者和分層服務(wù)提供者基本相同。但安裝是卻需要將基礎(chǔ)服務(wù)提供者安裝在服務(wù)提供者加載順序鏈的最底端,而分層服務(wù)提供者則根據(jù)需要分布在順序鏈的中間。3 3 開發(fā)平臺與開發(fā)工具開發(fā)平臺與開發(fā)工具開發(fā)平臺如題說明,以 Windows 平臺為主,重點(diǎn)討論開發(fā)工具的選擇。根據(jù)不同的工程選擇不同的開發(fā)工具,可以有效地提高工作效率。不同的開發(fā)工具

16、各有各的優(yōu)點(diǎn)同時(shí)又各有各的不足,在開發(fā)中要揚(yáng)長避短。目前常用的 Windows 開發(fā)工具有 VS 5.0/6.0、VS.net(包括VB、BC、VFP、VJ、C#等一組開發(fā)工具) 、delphi、C+ Builder,JBuilder、PB等。在這些開發(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)工具類軟件。缺點(diǎn)是

17、短時(shí)間不容易掌握。其中 Borland 使用的 VCL 類庫是為 Delphi 準(zhǔn)備的,并不是真正用C+實(shí)現(xiàn)的。VJ、Jbuilder 和 Java 語言主要面向互聯(lián)網(wǎng)應(yīng)用。最大的優(yōu)勢是跨平臺。本課題為防火墻軟件,較多的使用系統(tǒng)接口,而且界面簡單。另外,防火墻主要傳播渠道是互聯(lián)網(wǎng),這就要求體積應(yīng)盡量的小,安裝盡量方便。所以選擇 VC 為開發(fā)工具。4 4 系統(tǒng)設(shè)計(jì)與模塊劃分系統(tǒng)設(shè)計(jì)與模塊劃分4.1 本課題要實(shí)現(xiàn)的具體功能本課題要實(shí)現(xiàn)的具體功能本設(shè)計(jì)實(shí)現(xiàn)的具體功能如下:1. 封包監(jiān)視(1)提供封包監(jiān)視頁面。(2)提供清空監(jiān)視列表,停止/開始監(jiān)視及停止/開始滾動功能。2. 控管規(guī)則設(shè)置(1) 手工添

18、加,刪除及修改控管規(guī)則。(2)自學(xué)習(xí)添加控管規(guī)則。(3)控管規(guī)則中目的網(wǎng)絡(luò) IP 地址段的設(shè)置。(4)提供控管規(guī)則設(shè)置頁面。3. 封包過濾(1) DLL 給出設(shè)置工作模式和設(shè)置控管規(guī)則的接口函數(shù)。工作模式分為3 種形式:放行所有,拒絕所有和過濾。(2) DLL 根據(jù)工作模式和控管規(guī)則對過往封包進(jìn)行過濾。(3) DLL 將通過的網(wǎng)絡(luò)封包通知 EXE 取走 。4.2 程序工作流程圖程序工作流程圖Winsock 2 SPI 是一個(gè) DLL 程序,它工作在 API 和 DRIVER 之間,為上層應(yīng)用程序提供服務(wù)。EXE 與 DLL 構(gòu)成軟件的主題,也是編寫軟件的主要工作。流程圖如圖 1 所示。模塊1.

19、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 用戶界面接口圖 1 防火墻工作流程圖4.3 模塊劃分模塊劃分.1模塊劃分原則模塊劃分原則模塊劃分是系統(tǒng)分析中非常重要的一部分,下面是模塊劃分時(shí)的基本原則。1. 獨(dú)立性:讓模塊直接內(nèi)的關(guān)系減到最少。理想的狀態(tài)就是模塊之間沒有關(guān)系,但這種情況不符合現(xiàn)實(shí)。既然是同一個(gè)工程,模塊之間自然都會存在

20、一定的聯(lián)系,只要想辦法讓模塊之間的關(guān)系盡量簡單就可以了。2. 接口簡單化:讓模塊之間的接口盡量單純、簡單、易用。即讓公用函數(shù)和公用變量盡量地少。3. 分層處理:吸取 Windows 操作系統(tǒng)對模塊做分層處理的經(jīng)驗(yàn)。建立一些中間模塊,讓兩端的模塊來完成相互調(diào)用的透明化。4. 容易合并:容易將劃分的模塊進(jìn)行合并。例如將一個(gè)工程的各個(gè)功能模塊分別設(shè)計(jì)成可執(zhí)行文件,然后用一個(gè)總模塊將這些模塊關(guān)聯(lián)起來組成一個(gè)工程。這種情況下,對模塊獨(dú)立性要求較高,模塊之間幾乎沒有任何關(guān)系。5. 可測試性:盡量使每個(gè)模塊都可以單獨(dú)進(jìn)行測試2。上面的 5 條是參考原則,既然是參考原則就不會完全執(zhí)行,完全按照一個(gè)教條去執(zhí)行真

21、的很困難。只要在做模塊劃分的時(shí)候能經(jīng)常記起這些原則,然后稍加注意就 OK 了。另外,在這 5 條原則中,第一條是根本,能把這一條做好,下面的一些就容易實(shí)現(xiàn)了。在做模塊劃分時(shí)一定要始終貫穿獨(dú)立性的思想。.2模塊結(jié)構(gòu)模塊結(jié)構(gòu)根據(jù) 4.1 節(jié)的功能定義和 4.2 節(jié)的工作流程圖,需要對模塊做進(jìn)一步細(xì)化,模塊 1.1 用戶界面接口得出更詳細(xì)的模塊結(jié)構(gòu)。這些模塊結(jié)構(gòu)是編程的藍(lán)本,在編寫代碼的過程中,就要以這些結(jié)構(gòu)為指導(dǎo)。1. 模塊 1.1:用戶界面,4.5 節(jié)詳細(xì)說明。2. 模塊 1.2:EXE 的安裝模塊, 。建立 CXInstall 類,C+源文件Install.h 和 Instal

22、l.cpp。安裝函數(shù) InstallProvider 和卸載函數(shù)RemoveProvider3. 模塊 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ī)則單獨(dú)的函數(shù),調(diào)用模塊 1.3 讀寫控管規(guī)則模塊得到控管規(guī)則數(shù)據(jù),調(diào)用 DLL 的函數(shù)FloControl 設(shè)置 DLL 的控管規(guī)則。5. 模塊 1.5:EXE 設(shè)置 DLL 的工作模式,

23、設(shè)置工作模式單獨(dú)的函數(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ù)包進(jìn)行分析的類 CProtocolInfo,C+源文件 ProtocolInfo.h和 ProtocolInfo.c

24、pp。模塊 2.1.1:服務(wù)提供者函數(shù)模塊,入口函數(shù) WSPSartup,發(fā)送詢問消息到 EXE,由 EXE 提供詢問界面函數(shù) QueryAccess。截獲的 8 個(gè)服務(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

25、. 模塊 2.3:DLL 更改工作模式模塊,設(shè)置 DLL 工作模式函數(shù)SetWorkMode。.3模塊接口定義模塊接口定義模塊之間接口有 3 種方式:1. 函數(shù)接口函數(shù)接口是最常用而且獨(dú)立性和封裝性最好的接口方式。函數(shù)之間通過參數(shù)傳遞進(jìn)行模塊之間的通信,處理過程保持相互獨(dú)立,函數(shù)處理完成把處理結(jié)果返回到調(diào)用模塊。如果每個(gè)函數(shù)都有單獨(dú)的接口,那么,函數(shù)多了,接口也就多了,也就越來越復(fù)雜了。C+利用類的餓概念解決這個(gè)問題。類可以將一組函數(shù)和變量封裝起來,這樣就將許許多多的函數(shù)轉(zhuǎn)化成一個(gè)對象的形式。外部模塊使用這個(gè)類的實(shí)例來引用封裝在里面的成員函數(shù)個(gè)變量。把功能相似、相關(guān)的函數(shù)分成一

26、組,然后封裝在一起,使接口間的關(guān)系清晰了很多。類的成員函數(shù)和成員變量有公有和私有之分。對于公有函數(shù)和變量,外部模塊可以直接調(diào)用;對于私有函數(shù)和變量,外部模塊則不能直接調(diào)用。利用這種特性,可以把一些只在類里面使用的函數(shù)定義為私有函數(shù);把外部模塊需要直接調(diào)用的函數(shù)定義為公有函數(shù)。類似于 DLL 的導(dǎo)出函數(shù)(Export) ,這樣,模塊之間的直接接觸就會進(jìn)一步減小,獨(dú)立性更進(jìn)一步增加。2. 全局變量接口全局變量接口是一種不提倡的方式。雖然它使用起來確實(shí)很過癮。全局變量多了非常容易出問題。任何地方都可能會對全局變量進(jìn)行賦值,變量的可控性大大降低,不知道什么時(shí)候變量的值就被莫名其妙地改掉了。當(dāng)然,只要不

27、被那些模塊執(zhí)行的先后順序和循環(huán)語句弄昏頭,還是可以使用全局變量的。雖然不提倡使用,但是有些地方使用全局變量與是不可避免的,而且有時(shí)候可以減少很多麻煩。使用全局變量的時(shí)候需要注意一點(diǎn),讀取變量的多少和位置對程序穩(wěn)定性的影響并不很大,關(guān)鍵是盡量讓賦值的地方單一,改變變量的次數(shù)和位置應(yīng)盡量得到控制。3. Windows 消息接口Windows 消息接口是一種特殊的接口形式,它是基于 Windows 操作系統(tǒng)的消息機(jī)制。這種接口形式適合于應(yīng)用程序之間。應(yīng)用程序是相對獨(dú)立的模塊,如果這兩個(gè)模塊需要通信,則消息接口就是一種理想型的選擇。這種接口類似于函數(shù)接口,只不過通過操作系統(tǒng)的消息機(jī)制來中轉(zhuǎn)一下。Win

28、dows 消息接口也是一種接口方式,特別是 DLL 和 EXE 之間經(jīng)常用到。在 DLL 與 EXE 之間通信使用消息是一種優(yōu)勢,多個(gè)應(yīng)用程序雖然調(diào)用同一個(gè) DLL,但是它們都擁有獨(dú)立的模塊副本。這時(shí)候如果這些模塊副本都需要讓同一個(gè)應(yīng)用程序做一件事時(shí),就不好處理,因?yàn)?DLL 的重要性和應(yīng)用程序保護(hù)機(jī)制導(dǎo)致這些模塊副本無法直接調(diào)用同一個(gè)應(yīng)用程序的執(zhí)行模塊。這時(shí)候就可以通過消息的方式來解決。發(fā)送消息是基于窗口句柄的,只要得到這個(gè)窗口句柄,不同的 DLL 副本都向同一個(gè)窗口句柄發(fā)送消息,自然所有的消息都可以被同一個(gè)應(yīng)用程序接收。以上 3 種接口方式以函數(shù)接口為優(yōu)先進(jìn)行考慮,以增強(qiáng)模塊的獨(dú)立性和可讀

29、性。4.4 控管規(guī)則文件結(jié)構(gòu)設(shè)計(jì)控管規(guī)則文件結(jié)構(gòu)設(shè)計(jì)控管規(guī)則文件用來存儲控管規(guī)則數(shù)據(jù),命名為 acl.cfg;該數(shù)據(jù)文件為二進(jìn)制文件。.1控管規(guī)則文件需要存儲的內(nèi)容控管規(guī)則文件需要存儲的內(nèi)容控管規(guī)則文件需要存儲的內(nèi)容如下:(1) 系統(tǒng)設(shè)置(2) 控管設(shè)置(3) 控管規(guī)則附加數(shù)據(jù),授權(quán)訪問的遠(yuǎn)端網(wǎng)絡(luò) IP 地址記錄1. 控管規(guī)則記錄結(jié)構(gòu)控管規(guī)則記錄結(jié)構(gòu)控管規(guī)則記錄結(jié)構(gòu)說明(1) 規(guī)則編號字段是控管規(guī)則的唯一性編號。保留字段,沒有使用。(2) 應(yīng)用程序名稱及路徑字段用來保持應(yīng)用程序的名稱和路徑。(3) 遠(yuǎn)端網(wǎng)絡(luò)類型,數(shù)值的含義如下。0:表示所有網(wǎng)絡(luò)1:局域網(wǎng)2:約束的網(wǎng)絡(luò)(自定義)

30、3:信任的網(wǎng)絡(luò)(自定義)4:自定義的網(wǎng)絡(luò)(自定義)(4) 管制動作,數(shù)值的含義如下。0:放行1:拒絕(5) 進(jìn)出方向,數(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:表示全部其他值:表示端口值2.2. 授權(quán)訪問的遠(yuǎn)端授權(quán)訪問的遠(yuǎn)端 IPI

31、P 地址記錄結(jié)構(gòu)地址記錄結(jié)構(gòu)授權(quán)訪問的遠(yuǎn)端網(wǎng)絡(luò) IP 地址結(jié)構(gòu)如表 1 所示。表 1 授權(quán)訪問的遠(yuǎn)端網(wǎng)絡(luò) IP 地址段記錄結(jié)構(gòu) 字段 類型 長度 開始 IP 無符號長整型 4 結(jié)束 IP無符號長整型 .2控管規(guī)則文件結(jié)構(gòu)控管規(guī)則文件結(jié)構(gòu)根據(jù)需要存儲的內(nèi)容將控管規(guī)則文件劃分為 3 段。文件頭用來存儲系統(tǒng)設(shè)置,IP 地址范圍記錄和控管規(guī)則記錄的地址偏移量及其他信息;IP 地址范圍記錄存儲區(qū)用來存儲 IP 地址范圍記錄;控管規(guī)則記錄存儲區(qū)用來存儲控管規(guī)則記錄。1.1. 控管規(guī)則結(jié)構(gòu)控管規(guī)則結(jié)構(gòu)控管規(guī)則結(jié)構(gòu)如表 2 所示。表 2 控管規(guī)則記錄結(jié)構(gòu)表08162432404856控管規(guī)則

32、編號應(yīng)用程序路徑和名稱遠(yuǎn)端網(wǎng)絡(luò)動作方向服務(wù)類型端口2. IP 地址結(jié)構(gòu)地址結(jié)構(gòu)IP 地址段記錄結(jié)構(gòu)如表 3 所示。表 3 IP 地址段記錄結(jié)構(gòu)表08162432404856開始 IP 地址結(jié)束 IP 地址開始 IP 地址結(jié)束 IP 地址4.5 界面設(shè)計(jì)界面設(shè)計(jì).1制定界面風(fēng)格制定界面風(fēng)格界面上反映的功能有:封包監(jiān)視、控管規(guī)則設(shè)置。這是兩個(gè)平行的功能,所以選用 Windows 的屬性頁。.2界面設(shè)計(jì)文檔界面設(shè)計(jì)文檔界面設(shè)計(jì)如下所示。1.1. 封包監(jiān)視界面封包監(jiān)視界面封包監(jiān)視界面用來顯示截獲的網(wǎng)絡(luò)封包。每個(gè)網(wǎng)絡(luò)封包的具體內(nèi)容根據(jù)實(shí)際需要而定。如圖 2。圖 2 封包監(jiān)

33、視界面封包的字段有:(1) 應(yīng)用程序路徑和名稱(2) 管制動作(放行或拒絕)(3) 訪問起始/結(jié)束時(shí)間(4) 使用網(wǎng)絡(luò)協(xié)議(5) 進(jìn)/出流量(6) 本地和遠(yuǎn)端 IP 地址/端口(7) 備注信息封包監(jiān)視界面實(shí)時(shí)接收 DLL 發(fā)送過來的網(wǎng)絡(luò)封包并立刻顯示。在封包監(jiān)視界面上設(shè)計(jì)了幾個(gè)附加按鈕。 “停止/開始滾動”用來設(shè)置監(jiān)視列表是否自動滾動;“開始/停止監(jiān)視”用來設(shè)置是否實(shí)時(shí)監(jiān)視;“清除”按鈕用來清除當(dāng)前列表。這些功能按鈕方面操作。 2.2. 控管規(guī)則界面控管規(guī)則界面控管規(guī)則界面用來顯示和設(shè)置控管規(guī)則(如圖 3) 。需要說明的是,應(yīng)用程序設(shè)置的優(yōu)先級高于控管規(guī)則設(shè)置,只是在應(yīng)用程序設(shè)置為詢問時(shí),下面

34、的控管規(guī)則設(shè)置才有效。圖 3 控管規(guī)則界面控管規(guī)則的設(shè)計(jì)目的是為了制訂對網(wǎng)絡(luò)訪問的控制,所以控管規(guī)則的字段可以決定防火墻防范的嚴(yán)密性和靈活程度??毓芤?guī)則的記錄結(jié)構(gòu)為:應(yīng)用程序遠(yuǎn)端網(wǎng)絡(luò)管制動作進(jìn)出方向協(xié)議類型使用端口控管規(guī)則界面給出了“增加” 、 “刪除” 、 “修改”3 個(gè)功能按鈕用來對控管規(guī)則進(jìn)行不同的操作。其中選擇增加和修改時(shí)都會彈出控管規(guī)則設(shè)置界面。1. 控管規(guī)則設(shè)置界面控管規(guī)則設(shè)置界面是用來設(shè)置控管規(guī)則的各個(gè)字段(如圖 4) 。在“應(yīng)用程序”欄輸入或選擇要進(jìn)行控管的應(yīng)用程序的完整路徑和文件名?!斑h(yuǎn)端網(wǎng)絡(luò)”用 IP 地址范圍表示,用來定義網(wǎng)絡(luò)類型的 IP 地址范圍。本軟件工劃分為 5 個(gè)

35、類型:所有網(wǎng)絡(luò)、局域網(wǎng)、受約束的網(wǎng)絡(luò)、信任的網(wǎng)絡(luò)和自定義網(wǎng)絡(luò)?!皠幼鳌庇脕泶_定符合這一條控管規(guī)則的網(wǎng)絡(luò)訪問動作是放行還是拒絕?!胺较颉庇脕泶_定這一條控管規(guī)則適合于網(wǎng)絡(luò)訪問的連接方向。本機(jī)向遠(yuǎn)端服務(wù)器發(fā)出連接請求就是出;遠(yuǎn)端主機(jī)向本機(jī)發(fā)出連接請求則為進(jìn)?!邦愋汀笔强毓芤?guī)則約定的協(xié)議類型?!岸丝凇笔菂f(xié)議所使用的端口。圖 4 控管規(guī)則設(shè)置界面2. 網(wǎng)絡(luò)設(shè)置界面網(wǎng)絡(luò)設(shè)置界面用來對各種網(wǎng)絡(luò)類型的 IP 地址段進(jìn)行設(shè)置(如圖 5) ,在上節(jié)有關(guān)于遠(yuǎn)端網(wǎng)絡(luò)類型的介紹。在這個(gè)界面上提供對 IP 地址段的增加、修改和刪除功能圖 5 網(wǎng)絡(luò)設(shè)置界面4.6 編碼規(guī)則編碼規(guī)則變量命名規(guī)則如下: 變量采用代表中文意思的英

36、文單詞或單詞組合。 變量一般不用縮寫,用英文單詞全稱。較長的更為習(xí)慣的縮寫。 自定義全局變量用 m_開頭。 自定義過程變量不用 m_開頭。 變量的前綴用變量類型的第一個(gè)字母標(biāo)志變量類型。如,指針類型在前面多加一個(gè)字母 P。 如果是對象,前綴用對象的名稱,第一個(gè)字母大寫。 變量中有多個(gè)單詞時(shí),單詞的第一個(gè)字母大寫,其余用小寫。有了自己的編碼規(guī)則后,不會出現(xiàn)自己的弄不清楚自己定義的函數(shù)之類的是什么意思。不知道函數(shù)是干什么的。以至于思維混亂。5 5 核心功能的代碼實(shí)現(xiàn)核心功能的代碼實(shí)現(xiàn)本課題的核心功能實(shí)現(xiàn)封裝在 DLL 里面。下面分析 DLL 的主要內(nèi)容。5.1 DLLDLL 的封包截獲的封包截獲B

37、OOL WINAPI DllMain 是 DLL 的入口函數(shù),系統(tǒng)調(diào)用時(shí)的標(biāo)準(zhǔn)接口。做一些初始化工作。主要工作是得到調(diào)用這個(gè)程序的進(jìn)程路徑和名稱并設(shè)置 DLL 調(diào)用次數(shù)的計(jì)數(shù)器。WSPStartup 是 Windows Sockets 應(yīng)用程序調(diào)用 SPI 的初始化函數(shù)。是服務(wù)提供者的標(biāo)準(zhǔn)入口函數(shù)。這里的工作是根據(jù) lpProtocolInfo 找出已經(jīng)被替換的服務(wù)提供者路徑,然后加載,并利用被替換服務(wù)提供者的 WSPStartup 得到 30個(gè)服務(wù)函數(shù)指針。需要先保存這些函數(shù)指針,然后將 lpProcTable 結(jié)構(gòu)中的 30個(gè)服務(wù)函數(shù)指針都設(shè)置成自己的。這樣,相應(yīng)的函數(shù)請求會首先經(jīng)過我們自

38、己的函數(shù),然后用這些函數(shù)可以做適當(dāng)?shù)奶幚?,再調(diào)用原來的,將請求轉(zhuǎn)發(fā),完成整個(gè)通信。int WSPAPI WSPStartup(WORDwVersionRequested,LPWSPDATAlpWSPData,LPWSAPROTOCOL_INFOWlpProtocolInfo,WSPUPCALLTABLEupcallTable,LPWSPPROC_TABLElpProcTable)ODS(_T(WSPStartup.);if(!m_CheckAcl.m_bIsWin9x & m_CheckAcl.CheckStartup() = XF_QUERY & !QueryAccess()

39、return SOCKET_ERROR;TCHARsLibraryPath512; LPWSPSTARTUP WSPStartupFunc = NULL;HMODULEhLibraryHandle= NULL; INT ErrorCode = 0; if(!GetHookProvider(lpProtocolInfo,sLibraryPath)| (hLibraryHandle =LoadLibrary(sLibraryPath)=NULL|(WSPStartupFunc=(LPWSPSTARTUP)GetProcAddress(hLibraryHandle, WSPStartup) = NU

40、LL)return WSAEPROVIDERFAILEDINIT;if(ErrorCode=WSPStartupFunc(wVersionRequested,lpWSPData,lpProtocolInfo, upcallTable, lpProcTable) != ERROR_SUCCESS)return ErrorCode; if( !lpProcTable-lpWSPAccept |!lpProcTable-lpWSPAddressToString |!lpProcTable-lpWSPAsyncSelect |!lpProcTable-lpWSPBind |!lpProcTable-l

41、pWSPCancelBlockingCall | !lpProcTable-lpWSPCleanup |!lpProcTable-lpWSPCloseSocket |!lpProcTable-lpWSPConnect |!lpProcTable-lpWSPDuplicateSocket |!lpProcTable-lpWSPEnumNetworkEvents |!lpProcTable-lpWSPEventSelect |!lpProcTable-lpWSPGetOverlappedResult |!lpProcTable-lpWSPGetPeerName |!lpProcTable-lpWS

42、PGetSockName |!lpProcTable-lpWSPGetSockOpt |!lpProcTable-lpWSPGetQOSByName |!lpProcTable-lpWSPIoctl |!lpProcTable-lpWSPJoinLeaf |!lpProcTable-lpWSPListen | !lpProcTable-lpWSPRecv |!lpProcTable-lpWSPRecvDisconnect |!lpProcTable-lpWSPRecvFrom |!lpProcTable-lpWSPSelect |!lpProcTable-lpWSPSend |!lpProcT

43、able-lpWSPSendDisconnect |!lpProcTable-lpWSPSendTo |!lpProcTable-lpWSPSetSockOpt |!lpProcTable-lpWSPShutdown |!lpProcTable-lpWSPSocket |!lpProcTable-lpWSPStringToAddress )return WSAEINVALIDPROCTABLE;EnterCriticalSection(&gCriticalSection);NextProcTable = *lpProcTable;lpProcTable-lpWSPSocket= WSP

44、Socket;lpProcTable-lpWSPCloseSocket= WSPCloseSocket;lpProcTable-lpWSPConnect= WSPConnect;lpProcTable-lpWSPAccept= WSPAccept;lpProcTable-lpWSPSend= WSPSend;lpProcTable-lpWSPSendTo= WSPSendTo;lpProcTable-lpWSPRecv= WSPRecv;lpProcTable-lpWSPRecvFrom= WSPRecvFrom;/以上是我們截獲并要用自己定義的函數(shù)。LeaveCriticalSection(

45、&gCriticalSection);return 0;XfIoControl 是供 EXE 調(diào)用的。用來設(shè)置 DLL 的配置信息和得到 DLL 的反饋信息,這個(gè)函數(shù)為 EXE 提供接口,EXE 通過這個(gè)函數(shù)來設(shè)置工作模式,或得到截獲的網(wǎng)絡(luò)封包信息。QueryAccess 是在應(yīng)用程序提交連網(wǎng)請求時(shí),如果發(fā)現(xiàn)控管規(guī)則中沒有關(guān)于這個(gè)應(yīng)用程序的控管規(guī)則,并且工作模式為詢問,則向擁護(hù)發(fā)出詢問,是否讓這個(gè)程序通行。GetHookProvider 用來讀取注冊表得到系統(tǒng)的 SPI 的 DLL 路徑和文件信息。這個(gè)信息是安裝時(shí)自己寫入的。根據(jù) pProtocolInfo 信息取出自己保存的、已經(jīng)被

46、本程序替換的服務(wù)提供者路徑。GetRightEntryIdItem 是供 GetHookProvider()調(diào)用的擴(kuò)展函數(shù),用來得到保存系統(tǒng)服務(wù)提供者路徑的注冊表鍵名。及得到已經(jīng)被本程序替換的服務(wù)提供者的 dwCatalogEntryId。XfShutdown 調(diào)用系統(tǒng)服務(wù)提供者函數(shù) WSPShutdown,關(guān)閉一個(gè) Socket 連接。并設(shè)置相應(yīng)的錯(cuò)誤代碼。截獲的服務(wù)提供者函數(shù):過濾 WSPSocket。WSPSocket 是用來創(chuàng)建 Socket 的函數(shù),首先調(diào)用底層函數(shù)得到新創(chuàng)建的 Socket,然后設(shè)置新建 Socket 的協(xié)議信息,并調(diào)用自定義函數(shù) CheckSocket 為這個(gè) S

47、ocket 建立 Session,然后保存相應(yīng)的信息。過濾 WSPCloseSocket。轉(zhuǎn)發(fā)之前首先調(diào)用自定義函數(shù) CheckCloseSocket刪除相應(yīng)的 Session。過濾 WSPConnect。當(dāng)一個(gè) Socket 建立連接后調(diào)用這個(gè)函數(shù),轉(zhuǎn)發(fā)之前先調(diào)用訪問控制函數(shù) CheckConnect,檢查是否放行。如果不放行,返回錯(cuò)誤;如果放行,調(diào)用底層 WSPConnect 函數(shù)進(jìn)行轉(zhuǎn)發(fā)。過濾 WSPAccept。用來接受一個(gè)連接請求。首先調(diào)用底層函數(shù),然后對連接的合法性進(jìn)行檢查,如果不允許通過,關(guān)閉這個(gè)連接過濾 WSPSend。這個(gè)函數(shù)用來發(fā)送面向連接的數(shù)據(jù),先檢查是否允許通過,然后進(jìn)

48、行轉(zhuǎn)發(fā)。過濾 WSPSendTo。這個(gè)函數(shù)用來發(fā)送面向無連接的數(shù)據(jù),先檢查是否允許通過,然后進(jìn)行轉(zhuǎn)發(fā)。過濾 WSPRecv。這個(gè)函數(shù)用來接收面向連接的數(shù)據(jù)。首先判斷是不是重疊操作并且設(shè)置回調(diào)函數(shù)。如果設(shè)置,則用自定義函數(shù) AddOverlapped 保存參數(shù)信息,然后用自己的回調(diào)函數(shù)代替原來的并轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)后根據(jù)返回值判斷操作是否成功,如果成功,則調(diào)用控管函數(shù)對操作的合法性進(jìn)行判斷;否則直接返回。過濾 WSPRecvFrom。這個(gè)函數(shù)用來接收面向連接的數(shù)據(jù)。首先判斷是不是重疊操作并且設(shè)置回調(diào)函數(shù)。如果設(shè)置,則用自定義函數(shù) AddOverlapped 保存參數(shù)信息,然后用自己的回調(diào)函數(shù)代替原來的并

49、轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)后根據(jù)返回值判斷操作是否成功,如果成功,則調(diào)用控管函數(shù)對操作的合法性進(jìn)行判斷;否則直接返回。5.2 DLLDLL 的訪問控管的訪問控管編寫一個(gè) CCheckAcl。它封裝了一組對訪問權(quán)限進(jìn)行控制的函數(shù)。訪問權(quán)限主要是由控管規(guī)則設(shè)置決定。另外還封裝了一組網(wǎng)絡(luò)封包操作函數(shù)。下面是一些主要函數(shù)及相應(yīng)代碼。開始調(diào)用DLL的進(jìn)程名是否為空?調(diào)用進(jìn)程是否為系統(tǒng)進(jìn)程?目的IP是否本地IP?檢查工作模式在控管規(guī)則中查找是否有關(guān)于這個(gè)進(jìn)程調(diào)用的規(guī)則?檢查這條控管規(guī)則的進(jìn)出方向和當(dāng)前連接的方向是否相同?檢查這條控管規(guī)則的協(xié)議和當(dāng)前連接的是否相同?檢查這條控管規(guī)則的IP和當(dāng)前連接的目的IP是否相同?檢查這

50、條控管規(guī)則的Action是否為PASS?檢查這條控管規(guī)則的端口和當(dāng)前連接的端口是否相同?返回“PASS”結(jié)束返回“PASS”返回“PASS”返回“PASS”返回“PASS”是否第一次查找?上一個(gè)找到的控管規(guī)則的Action是否為PASS返回“QUERY”返回“DENY”返回“PASS”返回“”DENY返回“DENY”否否否Query有相同相同相同相同是是是是Pass AllDeny All沒有是否是否否不相同圖 6 控管規(guī)則比對流程圖int CCheckAcl:GetAccessFromAcl(SESSION *mSession)/下面的判斷語句表示:如果控管規(guī)則文件無效,進(jìn)程名無效,是本機(jī)

51、IP或是超級進(jìn)程,則返回放行動作。if(_tcscmp(m_AclFile.mAclHeader.sSignature,XF_INVALID_PROCESS)=0|_tcscmp(m_sGuiPathName,m_sProcessName)=0|IsLocalIP(&mSession-ulRemoteIP) )return XF_PASS;intiRet;/下面 5 行表示:從工作模式判斷是否放行。if(iRet = GetAccessFromWorkMode() != XF_FILTER)return iRet;BOOLIsOne= TRUE;DWORDiIndex = 0;BYTE

52、bAction = ACL_ACTION_PASS;/下面的代碼表示:/沒有匹配的控管規(guī)則:執(zhí)行詢問/有完全匹配的控管規(guī)則:按照控管規(guī)則的控管動作返回/沒有完全匹配和控管規(guī)則但是有與進(jìn)程匹配的控管規(guī)則:/按最后一條與進(jìn)程匹配的控管規(guī)則的管制動作取反COMPARE:if(!IsOne) iIndex +;iIndex = FindAcl(m_sProcessName, iIndex);if(iIndex = m_AclFile.mAclHeader.ulAclCount)if(IsOne)if(m_bIsWin9x)if(!QueryAccess()return XF_DENY;elseretu

53、rn XF_PASS;elsereturn XF_QUERY;elseif(bAction = ACL_ACTION_DENY)return XF_PASS;elsereturn XF_DENY;if(IsOne) IsOne = FALSE;bAction = m_AclFile.mpAcliIndex.bAction;if(m_AclFile.mpAcliIndex.bDirection!=ACL_DIRECTION_IN_OUT&mSession-bDirection!=m_AclFile.mpAcliIndex.bDirection)goto COMPARE;if(m_AclF

54、ile.mpAcliIndex.bServiceType!=ACL_SERVICE_TYPE_ALL&mSession-bProtocol!=m_AclFile.mpAcliIndex.bServiceType)goto COMPARE;if(m_AclFile.mpAcliIndex.bRemoteNetType!=ACL_NET_TYPE_ALL&FindIP(mSession-ulRemoteIP)!=m_AclFile.mpAcliIndex.bRemoteNetType)goto COMPARE;if(m_AclFile.mpAcliIndex.uiServicePort!=ACL_SERVICE_PORT_ALL&mSession-uiPort!=m_AclFile.mpAcliIndex.uiServicePort)goto COMPARE;if(m_AclFile.mpAcliIndex.bAction = ACL_A

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論