欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

木馬靜態(tài)變動態(tài) DLL木馬程序大揭秘

 更新時間:2007年01月16日 00:00:00   作者:  
相信經(jīng)常玩木馬的朋友們都會知道一些木馬的特性,也會有自己最喜愛的木馬,不過,很多朋友依然不知道近年興起的“DLL木馬”為何物。什么是“DLL木馬”呢?它與一般的木馬有什么不同? 
  一、從DLL技術(shù)說起
  要了解DLL木馬,就必須知道這個“DLL”是什么意思,所以,讓我們追溯到幾年前,DOS系統(tǒng)大行其道的日子里。在那時候,寫程序是一件繁瑣的事情,因為每個程序的代碼都是獨立的,有時候為了實現(xiàn)一個功能,就要為此寫很多代碼,后來隨著編程技術(shù)發(fā)展,程序員們把很多常用的代碼集合(通用代碼)放進(jìn)一個獨立的文件里,并把這個文件稱為“庫”(Library),在寫程序的時候,把這個庫文件加入編譯器,就能使用這個庫包含的所有功能而不必自己再去寫一大堆代碼,這個技術(shù)被稱為“靜態(tài)鏈接”(Static Link)。靜態(tài)鏈接技術(shù)讓勞累的程序員松了口氣,一切似乎都很美好??墒鞘聦嵶C明,美好的事物不會存在太久,因為靜態(tài)鏈接就像一個粗魯?shù)耐其N員,不管你想不想要宣傳單,他都全部塞到你的手上來。寫一個程序只想用到一個庫文件包含的某個圖形效果,就因為這個,你不得不把這個庫文件攜帶的所有的圖形效果都加入程序,留著它們當(dāng)花瓶擺設(shè),這倒沒什么重要,可是這些花瓶卻把道路都阻塞了——靜態(tài)鏈接技術(shù)讓最終的程序成了大塊頭,因為編譯器把整個庫文件也算進(jìn)去了。時代在發(fā)展,靜態(tài)鏈接技術(shù)由于天生的弊端,不能滿足程序員的愿望,人們開始尋找一種更好的方法來解決代碼重復(fù)的難題。后來,Windows系統(tǒng)出現(xiàn)了,時代的分水嶺終于出現(xiàn)。Windows系統(tǒng)使用一種新的鏈接技術(shù),這種被稱為“動態(tài)鏈接”(Dynamic Link)的新技術(shù)同樣也是使用庫文件,微軟稱它們?yōu)椤皠討B(tài)鏈接庫”——Dynamic Link Library,DLL的名字就是這樣來的。動態(tài)鏈接本身和靜態(tài)鏈接沒什么區(qū)別,也是把通用代碼寫進(jìn)一些獨立文件里,但是在編譯方面,微軟繞了個圈子,并沒有采取把庫文件加進(jìn)程序的方法,而是把庫文件做成已經(jīng)編譯好的程序文件,給它們開個交換數(shù)據(jù)的接口,程序員寫程序的時候,一旦要使用某個庫文件的一個功能函數(shù),系統(tǒng)就把這個庫文件調(diào)入內(nèi)存,連接上這個程序占有的任務(wù)進(jìn)程,然后執(zhí)行程序要用的功能函數(shù),并把結(jié)果返回給程序顯示出來,在我們看來,就像是程序自己帶有的功能一樣。完成需要的功能后,這個DLL停止運(yùn)行,整個調(diào)用過程結(jié)束。微軟讓這些庫文件能被多個程序調(diào)用,實現(xiàn)了比較完美的共享,程序員無論要寫什么程序,只要在代碼里加入對相關(guān)DLL的調(diào)用聲明就能使用它的全部功能。最重要的是,DLL絕對不會讓你多拿一個花瓶,你要什么它就給你什么,你不要的東西它才不會給你。這樣,寫出來的程序就不能再攜帶一大堆垃圾了——絕對不會讓你把吃剩的東西帶回家,否則罰款,這是自助餐。 
  DLL技術(shù)的誕生,使編寫程序變成一件簡單的事情,Windows為我們提供了幾千個函數(shù)接口,足以滿足大多數(shù)程序員的需要。而且,Windows系統(tǒng)自身就是由幾千個DLL文件組成,這些DLL相互扶持,組成了強(qiáng)大的Windows系統(tǒng)。如果Windows使用靜態(tài)鏈接技術(shù),它的體積會有多大?我不敢想。
  二、應(yīng)用程序接口API
  上面我們對DLL技術(shù)做了個大概分析,在里面我提到了“接口”,這又是什么呢?因為DLL不能像靜態(tài)庫文件那樣塞進(jìn)程序里,所以,如何讓程序知道實現(xiàn)功能的代碼和文件成了問題,微軟就為DLL技術(shù)做了標(biāo)準(zhǔn)規(guī)范,讓一個DLL文件像奶酪一樣開了許多小洞,每個洞口都注明里面存放的功能的名字,程序只要根據(jù)標(biāo)準(zhǔn)規(guī)范找到相關(guān)洞口就可以取得它要的美味了,這個洞口就是“應(yīng)用程序接口”(Application Programming Interface),每個DLL帶的接口都不相同,盡最大可能的減少了代碼的重復(fù)。用Steven的一句話:API就是一個工具箱,你根據(jù)需要取出螺絲刀、扳手,用完后再把它們放回原處。在Windows里,最基本的3個DLL文件是kernel32.dll、user32.dll、gdi32.dll。它們共同構(gòu)成了基本的系統(tǒng)框架。三、DLL與木馬 
  DLL是編譯好的代碼,與一般程序沒什么大差別,只是它不能獨立運(yùn)行,需要程序調(diào)用。那么,DLL與木馬能扯上什么關(guān)系呢?如果你學(xué)過編程并且寫過DLL,就會發(fā)現(xiàn),其實DLL的代碼和其他程序幾乎沒什么兩樣,僅僅是接口和啟動模式不同,只要改動一下代碼入口,DLL就變成一個獨立的程序了。當(dāng)然,DLL文件是沒有程序邏輯的,這里并不是說DLL=EXE,不過,依然可以把DLL看做缺少了main入口的EXE,DLL帶的各個功能函數(shù)可以看作一個程序的幾個函數(shù)模塊。DLL木馬就是把一個實現(xiàn)了木馬功能的代碼,加上一些特殊代碼寫成DLL文件,導(dǎo)出相關(guān)的API,在別人看來,這只是一個普通的DLL,但是這個DLL卻攜帶了完整的木馬功能,這就是DLL木馬的概念。也許有人會問,既然同樣的代碼就可以實現(xiàn)木馬功能,那么直接做程序就可以,為什么還要多此一舉寫成DLL呢?這是為了隱藏,因為DLL運(yùn)行時是直接掛在調(diào)用它的程序的進(jìn)程里的,并不會另外產(chǎn)生進(jìn)程,所以相對于傳統(tǒng)EXE木馬來說,它很難被查到。
  四、DLL的運(yùn)行
  雖然DLL不能自己運(yùn)行,可是Windows在加載DLL的時候,需要一個入口函數(shù),就如同EXE的main一樣,否則系統(tǒng)無法引用DLL。所以根據(jù)編寫規(guī)范,Windows必須查找并執(zhí)行DLL里的一個函數(shù)DllMain作為加載DLL的依據(jù),這個函數(shù)不作為API導(dǎo)出,而是內(nèi)部函數(shù)。DllMain函數(shù)使DLL得以保留在內(nèi)存里,有的DLL里面沒有DllMain函數(shù),可是依然能使用,這是因為Windows在找不到DllMain的時候,會從其它運(yùn)行庫中找一個不做任何操作的缺省DllMain函數(shù)啟動這個DLL使它能被載入,并不是說DLL可以放棄DllMain函數(shù)。
  五、DLL木馬技術(shù)分析
  到了這里,您也許會想,既然DLL木馬有那么多好處,以后寫木馬都采用DLL方式不就好了嗎?話雖然是這么說沒錯,但是DLL木馬并不是一些人想象的那么容易寫的。要寫一個能用的DLL木馬,你需要了解更多知識。
  1. 木馬的主體
  千萬別把木馬模塊寫得真的像個API庫一樣,這不是開發(fā)WINAPI。DLL木馬可以導(dǎo)出幾個輔助函數(shù),但是必須有一個過程負(fù)責(zé)主要執(zhí)行代碼,否則這個DLL只能是一堆零碎API函數(shù),別提工作了。
  如果涉及一些通用代碼,可以在DLL里寫一些內(nèi)部函數(shù),供自己的代碼使用,而不是把所有代碼都開放成接口,這樣它自己本身都難調(diào)用了,更不可能發(fā)揮作用。
  DLL木馬的標(biāo)準(zhǔn)執(zhí)行入口為DllMain,所以必須在DllMain里寫好DLL木馬運(yùn)行的代碼,或者指向DLL木馬的執(zhí)行模塊。2. 動態(tài)嵌入技術(shù) 
  Windows中,每個進(jìn)程都有自己的私有內(nèi)存空間,別的進(jìn)程是不允許對這個私人領(lǐng)地進(jìn)行操作的,但是,實際上我們?nèi)匀豢梢岳梅N種方法進(jìn)入并操作進(jìn)程的私有內(nèi)存,這就是動態(tài)嵌入,它是將自己的代碼嵌入正在運(yùn)行的進(jìn)程中的技術(shù)。動態(tài)嵌入有很多種,最常見的是鉤子、API以及遠(yuǎn)程線程技術(shù),現(xiàn)在的大多數(shù)DLL木馬都采用遠(yuǎn)程線程技術(shù)把自己掛在一個正常系統(tǒng)進(jìn)程中。其實動態(tài)嵌入并不少見,羅技的MouseWare驅(qū)動就掛著每一個系統(tǒng)進(jìn)程-_-
  遠(yuǎn)程線程技術(shù)就是通過在另一個進(jìn)程中創(chuàng)建遠(yuǎn)程線程(RemoteThread)的方法進(jìn)入那個進(jìn)程的內(nèi)存地址空間。在DLL木馬的范疇里,這個技術(shù)也叫做“注入”,當(dāng)載體在那個被注入的進(jìn)程里創(chuàng)建了遠(yuǎn)程線程并命令它加載DLL時,木馬就掛上去執(zhí)行了,沒有新進(jìn)程產(chǎn)生,要想讓木馬停止惟有讓掛接這個木馬DLL的進(jìn)程退出運(yùn)行。但是,很多時候我們只能束手無策——它和Explorer.exe掛在一起了,你確定要關(guān)閉Windows嗎?
  3. 木馬的啟動
  有人也許會迫不及待的說,直接把這個DLL加入系統(tǒng)啟動項目不就可以了。答案是NO,前面說過,DLL不能獨立運(yùn)行,所以無法在啟動項目里直接啟動它。要想讓木馬跑起來,就需要一個EXE使用動態(tài)嵌入技術(shù)讓DLL搭上其他正常進(jìn)程的車,讓被嵌入的進(jìn)程調(diào)用這個DLL的DllMain函數(shù),激發(fā)木馬運(yùn)行,最后啟動木馬的EXE結(jié)束運(yùn)行,木馬啟動完畢。
  啟動DLL木馬的EXE是個重要角色,它被稱為Loader,如果沒有Loader,DLL木馬就是破爛一堆,因此,一個算得上成熟的DLL木馬會想辦法保護(hù)它的Loader不會那么容易被毀滅。記得狼狽為奸的故事嗎?DLL木馬就是爬在狼Loader上的狽。
  Loader可以是多種多樣的,Windows的rundll32.exe也被一些DLL木馬用來做了Loader,這種木馬一般不帶動態(tài)嵌入技術(shù),它直接掛著rundll32進(jìn)程運(yùn)行,用rundll32的方法(rundll32.exe [DLL名],[函數(shù)] [參數(shù)])像調(diào)用API一樣去引用這個DLL的啟動函數(shù)激發(fā)木馬模塊開始執(zhí)行,即使你殺了rundll32,木馬本體還是在的,一個最常見的例子就是3721中文實名,雖然它不是木馬。
  注冊表的AppInit_DLLs鍵也被一些木馬用來啟動自己,如求職信病毒。利用注冊表啟動,就是讓系統(tǒng)執(zhí)行DllMain來達(dá)到啟動木馬的目的。因為它是kernel調(diào)入的,對這個DLL的穩(wěn)定性有很大要求,稍有錯誤就會導(dǎo)致系統(tǒng)崩潰,所以很少看到這種木馬。
  有一些更復(fù)雜點的DLL木馬通過svchost.exe啟動,這種DLL木馬必須寫成NT-Service,入口函數(shù)是ServiceMain,一般很少見,但是這種木馬的隱蔽性也不錯,而且Loader有保障。
  4. 其它
  到這里大家也應(yīng)該對DLL木馬有個了解了,是不是很想寫一個?別急,不知道大家想過沒有,既然DLL木馬這么好,為什么到現(xiàn)在能找到的DLL木馬寥寥無幾?現(xiàn)在讓我來潑冷水,最重要的原因只有一個:由于DLL木馬掛著系統(tǒng)進(jìn)程運(yùn)行,如果它本身寫得不好,例如沒有防止運(yùn)行錯誤的代碼或者沒有嚴(yán)格規(guī)范用戶的輸入,DLL就會出錯崩潰。別緊張,一般的EXE也是這樣完蛋的,但是DLL崩潰會導(dǎo)致它掛著的程序跟著遭殃,別忘記它掛接的是系統(tǒng)進(jìn)程哦,結(jié)局就是……慘不忍睹。所以寫一個能公布的DLL木馬,在排錯檢查方面做的工作要比一般的EXE木馬多,寫得多了自己都煩躁……
  六、DLL木馬的發(fā)現(xiàn)和查殺
  經(jīng)??纯磫禹椨袥]有多出莫名其妙的項目,這是Loader的所在,只要殺了狼,狽就不能再狂了。而DLL木馬本體比較難發(fā)現(xiàn),需要你有一定編程知識和分析能力,在Loader里查找DLL名稱,或者從進(jìn)程里看多掛接了什么陌生的DLL,可是對新手來說……總之就是比較難啊比較難,所以,最簡單的方法:殺毒軟件和防火墻(不是萬能藥,切忌長期服用)。

相關(guān)文章

最新評論