【正文】
ocTablelpWSPDuplicateSocket ||!lpProcTablelpWSPEnumNetworkEvents ||!lpProcTablelpWSPEventSelect ||!lpProcTablelpWSPGetOverlappedResult ||!lpProcTablelpWSPGetPeerName ||!lpProcTablelpWSPGetSockName ||!lpProcTablelpWSPGetSockOpt ||!lpProcTablelpWSPGetQOSByName ||!lpProcTablelpWSPIoctl ||!lpProcTablelpWSPJoinLeaf ||!lpProcTablelpWSPListen || !lpProcTablelpWSPRecv ||!lpProcTablelpWSPRecvDisconnect ||第 18 頁(yè) 共 37 頁(yè)!lpProcTablelpWSPRecvFrom ||!lpProcTablelpWSPSelect ||!lpProcTablelpWSPSend ||!lpProcTablelpWSPSendDisconnect ||!lpProcTablelpWSPSendTo ||!lpProcTablelpWSPSetSockOpt ||!lpProcTablelpWSPShutdown ||!lpProcTablelpWSPSocket ||!lpProcTablelpWSPStringToAddress )return WSAEINVALIDPROCTABLE。lpProcTablelpWSPSocket = WSPSocket。lpProcTablelpWSPSend = WSPSend。//以上是我們截獲并要用自己定義的函數(shù)。}XfIoControl 是供 EXE 調(diào)用的。這個(gè)信息是安裝時(shí)自己寫(xiě)入的。XfShutdown 調(diào)用系統(tǒng)服務(wù)提供者函數(shù) WSPShutdown,關(guān)閉一個(gè) Socket 連接。過(guò)濾 WSPCloseSocket。如果不放行,返回錯(cuò)誤;如果放行,調(diào)用底層 WSPConnect 函數(shù)進(jìn)行轉(zhuǎn)發(fā)。這個(gè)函數(shù)用來(lái)發(fā)送面向連接的數(shù)據(jù),先檢查是否允許通過(guò),然后進(jìn)行轉(zhuǎn)發(fā)。這個(gè)函數(shù)用來(lái)接收面向連接的數(shù)據(jù)。第 20 頁(yè) 共 37 頁(yè)過(guò)濾 WSPRecvFrom。轉(zhuǎn)發(fā)后根據(jù)返回值判斷操作是否成功,如果成功,則調(diào)用控管函數(shù)對(duì)操作的合法性進(jìn)行判斷;否則直接返回。另外還封裝了一組網(wǎng)絡(luò)封包操作函數(shù)。WSPStartup 是 Winsock 2 SPI 入口函數(shù),每個(gè)應(yīng)用程序連網(wǎng)時(shí)調(diào)用且僅調(diào)用一次這個(gè)函數(shù)。在服務(wù)提供者函數(shù) WSPCon 調(diào)用系統(tǒng) WSPCon 函數(shù)建立之前,用 CheckCon 調(diào)用 SetSession 填充一些網(wǎng)絡(luò)封包信息,然后調(diào)用 GetAccessInfo 判斷這個(gè)連接是否被允許通過(guò)。在服務(wù)提供者函數(shù)WSPSend 調(diào)用系統(tǒng)函數(shù) WSPSend 發(fā)送數(shù)據(jù)前,用 CheckSend 調(diào)用 SetSessionEx和 GetProtocolInfo 設(shè)置網(wǎng)絡(luò)封包信息,然后調(diào)用 GetAccessInfo 檢查是否允許這個(gè)發(fā)送操作通過(guò)。在服務(wù)提供者函數(shù)WSPRecv 調(diào)用系統(tǒng)函數(shù) WSPRecv 發(fā)送數(shù)據(jù)后,用 CheckRecv 調(diào)用SetSessionEx 和 GetProtocolInfo 設(shè)置網(wǎng)絡(luò)封包信息,然后調(diào)用 GetAccessInfo 檢查是否允許這個(gè)接收操作通過(guò) 【17】 。CreateSession 創(chuàng)建一個(gè)新的網(wǎng)絡(luò)封包記錄。FinallySession 將所有沒(méi)有結(jié)束的網(wǎng)絡(luò)封包記錄全部發(fā)送到 EXE 中,有EXE 顯示在封包監(jiān)視界面上。GetAccessInfo:得到訪問(wèn)權(quán)限信息。這個(gè)函數(shù)首先檢查網(wǎng)絡(luò)封包記錄的完整性。第 23 頁(yè) 共 37 頁(yè)開(kāi)始調(diào)用 D L L 的進(jìn)程名是否為空 ?調(diào)用進(jìn)程是否為系統(tǒng)進(jìn)程 ?目的 I P 是否本地 I P ?檢查工作模式在控管規(guī)則中查找是否有關(guān)于這個(gè)進(jìn)程調(diào)用的規(guī)則 ?檢查這條控管規(guī)則的進(jìn)出方向和當(dāng)前連接的方向是否相同 ?檢查這條控管規(guī)則的協(xié)議和當(dāng)前連接的是否相同 ?檢查這條控管規(guī)則的 I P 和當(dāng)前連接的目的 I P 是否相同 ?檢查這條控管規(guī)則的 A c t i o n 是否為 P A S S ?檢查這條控管規(guī)則的端口和當(dāng)前連接的端口是否相同 ?返回 “ P A S S ”結(jié)束返回 “ P A S S ”返回 “ P A S S ”返回 “ P A S S ”返回 “ P A S S ”是否第一次查找 ?上一個(gè)找到的控管規(guī)則的A c t i o n 是否為 P A S S返回 “ Q U E R Y ”返回 “ D E N Y ”返回 “ P A S S ”返回 “ ” D E N Y返回 “ D E N Y ”否否否Q u e r y有相同相同相同相同是是是是P a s s A l lD e n y A l l沒(méi)有是否是否否不相同圖 控管規(guī)則比對(duì)流程圖int CCheckAcl::GetAccessFromAcl(SESSION *mSession)第 24 頁(yè) 共 37 頁(yè){//下面的判斷語(yǔ)句表示:如果控管規(guī)則文件無(wú)效,進(jìn)程名無(wú)效,是本機(jī) IP或是超級(jí)進(jìn)程,則返回放行動(dòng)作。//下面 5 行表示:從工作模式判斷是否放行。BYTE bAction = ACL_ACTION_PASS。elsereturn XF_PASS。}}if(IsOne) IsOne = FALSE。mSessionbDirection!=[iIndex].bDirection)goto COMPARE。if([iIndex].bRemoteNetType!=ACL_NET_TYPE_ALLamp。amp。第 26 頁(yè) 共 37 頁(yè)}FindAcl:根據(jù)應(yīng)用程序和名稱(chēng)從控管規(guī)則中查找與之相匹配的記錄。 軟件測(cè)試人員以用戶(hù)的角度,通過(guò)各種輸入和觀察軟件的各種輸出結(jié)果來(lái)發(fā)現(xiàn)軟件存在的缺陷,而不關(guān)心程序具體如何實(shí)現(xiàn)的一種軟件測(cè)試方法。利用白盒測(cè)試法進(jìn)行動(dòng)態(tài)測(cè)試時(shí),需要測(cè)試軟件產(chǎn)品的內(nèi)部結(jié)構(gòu)和處理過(guò)程,不需測(cè)試軟件產(chǎn)品的功能。(2) 操作步驟:?jiǎn)?dòng) EXE→進(jìn)入控管規(guī)則對(duì)話(huà)框→修改應(yīng)用程序設(shè)置→單擊“取消”按鈕→提示保存時(shí)選擇不保存→重新進(jìn)入控管規(guī)則對(duì)話(huà)框查看結(jié)果。(5) 解決辦法:首先去掉通知 DLL 的代碼。return。}CAcl *dlgAcl = (CAcl*)thisGetPage(2)。(3) 測(cè)試結(jié)果:沒(méi)有顯示要編輯控管規(guī)則。CAclSet::m_EnableComboApplication = TRUE。(3) 測(cè)試結(jié)果:迅雷不能使用,證明結(jié)果成功。這次課題成功的實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的個(gè)人防火墻的基本功能,使其可以根據(jù)應(yīng)用程序訪問(wèn)規(guī)則可對(duì)應(yīng)用程序連網(wǎng)動(dòng)作進(jìn)行過(guò)濾;并且對(duì)應(yīng)用程序訪問(wèn)規(guī)則具有一定自學(xué)習(xí)功能;同時(shí)實(shí)現(xiàn)了實(shí)時(shí)監(jiān)控、監(jiān)視網(wǎng)絡(luò)活動(dòng)。包括 WinCapp 抓包、 NDIS 中間層抓包。只有將防火墻軟件和讓病毒軟件整合起來(lái)才能更好的實(shí)現(xiàn)“安全”的意義。在此向他表示我最衷心的感謝!同時(shí)也感謝李龍同學(xué)在課題研究初期給予了幫助,有了一個(gè)很好的開(kāi)端!也感謝周?chē)?guó)震同學(xué)在寫(xiě)論文背景的時(shí)候給我的提示。感謝我的大學(xué),感謝我生命中的所有人。轉(zhuǎn)眼間大學(xué)四年的生活即將結(jié)束,我們?cè)谶@里所學(xué)習(xí)的知識(shí)和經(jīng)驗(yàn)在這次課題中得以體現(xiàn),而在這個(gè)過(guò)程中我們所得到的也將影響我們一生。同時(shí)更加豐富軟件的功能,使其功能和界面更加人性化。在以后的日子里我希望可以嘗試用其他方式來(lái)實(shí)現(xiàn)本課題,豐富自己的知識(shí)種類(lèi)。 展望當(dāng)今防火墻的種類(lèi)現(xiàn)在非常多。同時(shí)在王靜老師的指導(dǎo)下,也使我對(duì) C++這門(mén)語(yǔ)言有了一定的認(rèn)知與定位?!?…}測(cè)試三:(1) 操作系統(tǒng): WinXP。(5) 解決辦法:在“Edit”按鈕的事件中,在彈出 AclSet 之前加入一行代碼,如下所示。}測(cè)試二:(1) 操作系統(tǒng): WinXP。if(() != XERR_SUCCESS){AfxMessageBox(GUI_ACL_MESSAGE_ACL_READ_ERROR)。void CMainSheet::OnCancel(){if(!GetDlgItem(ID_APPLY_NOW)IsWindowEnabled())return。(4) 原因:在選擇修改時(shí),雖然沒(méi)有保存到控管規(guī)則文件里,但是沒(méi)有對(duì)界面做恢復(fù)操作。 由于測(cè)試工具及環(huán)境等因素限制,本課題多采用黑盒測(cè)試。又稱(chēng)結(jié)構(gòu)測(cè)試或者邏輯驅(qū)動(dòng)測(cè)試。黑盒測(cè)試,英文是 Black Box Testing,又稱(chēng)功能測(cè)試或者數(shù)據(jù)驅(qū)動(dòng)測(cè)試。if([iIndex].bAction == ACL_ACTION_DENY)return XF_DENY。FindIP(mSessionulRemoteIP)!=[iIndex].bRemoteNetType)goto COMPARE。amp。if([iIndex].bDirection!=ACL_D