當前位置:編程學習大全網 - 編程語言 - Trojan到底是壹個什麽樣的病毒?

Trojan到底是壹個什麽樣的病毒?

什麽是木馬?

特洛伊木馬(以下簡稱木馬),英文叫做“Trojan house”,其名稱取自希臘神話的特洛伊木馬記。

它是壹種基於遠程控制的黑客工具,具有隱蔽性和非授權性的特點。

所謂隱蔽性是指木馬的設計者為了防止木馬被發現,會采用多種手段隱藏木馬,這樣服務端即使發現感染了木馬,由於不能確定其具體位置,往往只能望“馬”興嘆。

所謂非授權性是指壹旦控制端與服務端連接後,控制端將享有服務端的大部分操作權限,包括修改文件,修改註冊表,控制鼠標,鍵盤等等,而這些權力並不是服務端賦予的,而是通過木馬程序竊取的。

從木馬的發展來看,基本上可以分為兩個階段。

最初網絡還處於以UNIX平臺為主的時期,木馬就產生了,當時的木馬程序的功能相對簡單,往往是將壹段程序嵌入到系統文件中,用跳轉指令來執行壹些木馬的功能,在這個時期木馬的設計者和使用者大都是些技術人員,必須具備相當的網絡和編程知識。

而後隨著WINDOWS平臺的日益普及,壹些基於圖形操作的木馬程序出現了,用戶界面的改善,使使用者不用懂太多的專業知識就可以熟練的操作木馬,相對的木馬入侵事件也頻繁出現,而且由於這個時期木馬的功能已日趨完善,因此對服務端的破壞也更大了。

所以所木馬發展到今天,已經無所不用其極,壹旦被木馬控制,妳的電腦將毫無秘密可言。

參考資料:

/365000/ShowPost.aspx

回答者:完顏康康 - 探花 十壹級 9-18 12:40

--------------------------------------------------------------------------------

DLL 木馬揭秘

相信經常玩木馬的朋友們都會知道壹些木馬的特性,也會有自己最喜愛的木馬,不過,很多朋友依然不知道近年興起的“DLL木馬”為何物。什麽是“DLL木馬”呢?它與壹般的木馬有什麽不同?

壹、從DLL技術說起

要了解DLL木馬,就必須知道這個“DLL”是什麽意思,所以,讓我們追溯到幾年前,DOS系統大行其道的日子裏。在那時候,寫程序是壹件繁瑣的事情,因為每個程序的代碼都是獨立的,有時候為了實現壹個功能,就要為此寫很多代碼,後來隨著編程技術發展,程序員們把很多常用的代碼集合(通用代碼)放進壹個獨立的文件裏,並把這個文件稱為“庫”(Library),在寫程序的時候,把這個庫文件加入編譯器,就能使用這個庫包含的所有功能而不必自己再去寫壹大堆代碼,這個技術被稱為“靜態鏈接”(Static Link)。靜態鏈接技術讓勞累的程序員松了口氣,壹切似乎都很美好。可是事實證明,美好的事物不會存在太久,因為靜態鏈接就像壹個粗魯的推銷員,不管妳想不想要宣傳單,他都全部塞到妳的手上來。寫壹個程序只想用到壹個庫文件包含的某個圖形效果,就因為這個,妳不得不把這個庫文件攜帶的所有的圖形效果都加入程序,留著它們當花瓶擺設,這倒沒什麽重要,可是這些花瓶卻把道路都阻塞了——靜態鏈接技術讓最終的程序成了大塊頭,因為編譯器把整個庫文件也算進去了。

時代在發展,靜態鏈接技術由於天生的弊端,不能滿足程序員的願望,人們開始尋找壹種更好的方法來解決代碼重復的難題。後來,Windows系統出現了,時代的分水嶺終於出現。Windows系統使用壹種新的鏈接技術,這種被稱為“動態鏈接”(Dynamic Link)的新技術同樣也是使用庫文件,微軟稱它們為“動態鏈接庫”——Dynamic Link Library,DLL的名字就是這樣來的。動態鏈接本身和靜態鏈接沒什麽區別,也是把通用代碼寫進壹些獨立文件裏,但是在編譯方面,微軟繞了個圈子,並沒有采取把庫文件加進程序的方法,而是把庫文件做成已經編譯好的程序文件,給它們開個交換數據的接口,程序員寫程序的時候,壹旦要使用某個庫文件的壹個功能函數,系統就把這個庫文件調入內存,連接上這個程序占有的任務進程,然後執行程序要用的功能函數,並把結果返回給程序顯示出來,在我們看來,就像是程序自己帶有的功能壹樣。完成需要的功能後,這個DLL停止運行,整個調用過程結束。微軟讓這些庫文件能被多個程序調用,實現了比較完美的***享,程序員無論要寫什麽程序,只要在代碼裏加入對相關DLL的調用聲明就能使用它的全部功能。最重要的是,DLL絕對不會讓妳多拿壹個花瓶,妳要什麽它就給妳什麽,妳不要的東西它才不會給妳。這樣,寫出來的程序就不能再攜帶壹大堆垃圾了——絕對不會讓妳把吃剩的東西帶回家,否則罰款,這是自助餐。

DLL技術的誕生,使編寫程序變成壹件簡單的事情,Windows為我們提供了幾千個函數接口,足以滿足大多數程序員的需要。而且, Windows系統自身就是由幾千個DLL文件組成,這些DLL相互扶持,組成了強大的Windows系統。如果Windows使用靜態鏈接技術,它的體積會有多大?我不敢想。

二、應用程序接口API

上面我們對DLL技術做了個大概分析,在裏面我提到了“接口”,這又是什麽呢?因為DLL不能像靜態庫文件那樣塞進程序裏,所以,如何讓程序知道實現功能的代碼和文件成了問題,微軟就為DLL技術做了標準規範,讓壹個DLL文件像奶酪壹樣開了許多小洞,每個洞口都註明裏面存放的功能的名字,程序只要根據標準規範找到相關洞口就可以取得它要的美味了,這個洞口就是“應用程序接口”(Application Programming Interface),每個DLL帶的接口都不相同,盡最大可能的減少了代碼的重復。用Steven的壹句話:API就是壹個工具箱,妳根據需要取出螺絲刀、扳手,用完後再把它們放回原處。在Windows裏,最基本的3個DLL文件是kernel32.dll、user32.dll、 gdi32.dll。它們***同構成了基本的系統框架。

三、DLL與木馬

DLL是編譯好的代碼,與壹般程序沒什麽大差別,只是它不能獨立運行,需要程序調用。那麽,DLL與木馬能扯上什麽關系呢?如果妳學過編程並且寫過DLL,就會發現,其實DLL的代碼和其他程序幾乎沒什麽兩樣,僅僅是接口和啟動模式不同,只要改動壹下代碼入口,DLL就變成壹個獨立的程序了。當然,DLL文件是沒有程序邏輯的,這裏並不是說DLL=EXE,不過,依然可以把DLL看做缺少了main入口的EXE,DLL帶的各個功能函數可以看作壹個程序的幾個函數模塊。DLL木馬就是把壹個實現了木馬功能的代碼,加上壹些特殊代碼寫成DLL文件,導出相關的API,在別人看來,這只是壹個普通的 DLL,但是這個DLL卻攜帶了完整的木馬功能,這就是DLL木馬的概念。也許有人會問,既然同樣的代碼就可以實現木馬功能,那麽直接做程序就可以,為什麽還要多此壹舉寫成DLL呢?這是為了隱藏,因為DLL運行時是直接掛在調用它的程序的進程裏的,並不會另外產生進程,所以相對於傳統EXE木馬來說,它很難被查到。

四、DLL的運行

雖然DLL不能自己運行,可是Windows在加載DLL的時候,需要壹個入口函數,就如同EXE的main壹樣,否則系統無法引用DLL。所以根據編寫規範,Windows必須查找並執行DLL裏的壹個函數DllMain作為加載DLL的依據,這個函數不作為API導出,而是內部函數。 DllMain函數使DLL得以保留在內存裏,有的DLL裏面沒有DllMain函數,可是依然能使用,這是因為Windows在找不到DllMain的時候,會從其它運行庫中找壹個不做任何操作的缺省DllMain函數啟動這個DLL使它能被載入,並不是說DLL可以放棄DllMain函數。

五、DLL木馬技術分析

到了這裏,您也許會想,既然DLL木馬有那麽多好處,以後寫木馬都采用DLL方式不就好了嗎?話雖然是這麽說沒錯,但是DLL木馬並不是壹些人想象的那麽容易寫的。要寫壹個能用的DLL木馬,妳需要了解更多知識。

1.木馬的主體

千萬別把木馬模塊寫得真的像個API庫壹樣,這不是開發WINAPI。DLL木馬可以導出幾個輔助函數,但是必須有壹個過程負責主要執行代碼,否則這個DLL只能是壹堆零碎API函數,別提工作了。

如果涉及壹些通用代碼,可以在DLL裏寫壹些內部函數,供自己的代碼使用,而不是把所有代碼都開放成接口,這樣它自己本身都難調用了,更不可能發揮作用。

DLL木馬的標準執行入口為DllMain,所以必須在DllMain裏寫好DLL木馬運行的代碼,或者指向DLL木馬的執行模塊。

2.動態嵌入技術

Windows中,每個進程都有自己的私有內存空間,別的進程是不允許對這個私人領地進行操作的,但是,實際上我們仍然可以利用種種方法進入並操作進程的私有內存,這就是動態嵌入,它是將自己的代碼嵌入正在運行的進程中的技術。動態嵌入有很多種,最常見的是鉤子、API以及遠程線程技術,現在的大多數DLL木馬都采用遠程線程技術把自己掛在壹個正常系統進程中。其實動態嵌入並不少見,羅技的MouseWare驅動就掛著每壹個系統進程-_-

遠程線程技術就是通過在另壹個進程中創建遠程線程(RemoteThread)的方法進入那個進程的內存地址空間。在DLL木馬的範疇裏,這個技術也叫做“註入”,當載體在那個被註入的進程裏創建了遠程線程並命令它加載DLL時,木馬就掛上去執行了,沒有新進程產生,要想讓木馬停止惟有讓掛接這個木馬DLL的進程退出運行。但是,很多時候我們只能束手無策——它和Explorer.exe掛在壹起了,妳確定要關閉Windows嗎?

3.木馬的啟動

有人也許會迫不及待的說,直接把這個DLL加入系統啟動項目不就可以了。答案是NO,前面說過,DLL不能獨立運行,所以無法在啟動項目裏直接啟動它。要想讓木馬跑起來,就需要壹個EXE使用動態嵌入技術讓DLL搭上其他正常進程的車,讓被嵌入的進程調用這個DLL的DllMain函數,激發木馬運行,最後啟動木馬的EXE結束運行,木馬啟動完畢。

啟動DLL木馬的EXE是個重要角色,它被稱為Loader,如果沒有Loader,DLL木馬就是破爛壹堆,因此,壹個算得上成熟的DLL木馬會想辦法保護它的Loader不會那麽容易被毀滅。記得狼狽為奸的故事嗎?DLL木馬就是爬在狼Loader上的狽。

Loader可以是多種多樣的,Windows的rundll32.exe也被壹些DLL木馬用來做了Loader,這種木馬壹般不帶動態嵌入技術,它直接掛著rundll32進程運行,用rundll32的方法(rundll32.exe [DLL名],[函數] [參數])像調用API壹樣去引用這個DLL的啟動函數激發木馬模塊開始執行,即使妳殺了rundll32,木馬本體還是在的,壹個最常見的例子就是 3721中文實名,雖然它不是木馬。

註冊表的AppInit_DLLs鍵也被壹些木馬用來啟動自己,如求職信病毒。利用註冊表啟動,就是讓系統執行DllMain來達到啟動木馬的目的。因為它是kernel調入的,對這個DLL的穩定性有很大要求,稍有錯誤就會導致系統崩潰,所以很少看到這種木馬。

有壹些更復雜點的DLL木馬通過svchost.exe啟動,這種DLL木馬必須寫成NT-Service,入口函數是ServiceMain,壹般很少見,但是這種木馬的隱蔽性也不錯,而且Loader有保障。

4.其它

到這裏大家也應該對DLL木馬有個了解了,是不是很想寫壹個?別急,不知道大家想過沒有,既然DLL木馬這麽好,為什麽到現在能找到的DLL木馬寥寥無幾?現在讓我來潑冷水,最重要的原因只有壹個:由於DLL木馬掛著系統進程運行,如果它本身寫得不好,例如沒有防止運行錯誤的代碼或者沒有嚴格規範用戶的輸入,DLL就會出錯崩潰。別緊張,壹般的EXE也是這樣完蛋的,但是DLL崩潰會導致它掛著的程序跟著遭殃,別忘記它掛接的是系統進程哦,結局就是……慘不忍睹。所以寫壹個能公布的DLL木馬,在排錯檢查方面做的工作要比壹般的EXE木馬多,寫得多了自己都煩躁……

六、DLL木馬的發現和查殺

經常看看啟動項有沒有多出莫名其妙的項目,這是Loader的所在,只要殺了狼,狽就不能再狂了。而DLL木馬本體比較難發現,需要妳有壹定編程知識和分析能力,在Loader裏查找DLL名稱,或者從進程裏看多掛接了什麽陌生的DLL,可是對新手來說……總之就是比較難啊比較難,所以,最簡單的方法:殺毒軟件和防火墻(不是萬能藥,切忌長期服用)。

  • 上一篇:初音未來 歌姬計劃出現應用程序錯誤,怎樣解決
  • 下一篇:換位密碼的加密方法
  • copyright 2024編程學習大全網