《DLL木马进程内幕大揭秘》
如果是位經常玩“馬馬”的朋友,那么一般情況下都會或多或少掌握一些木馬的特性,然而,很多朋友還是不知道“DLL木馬”是什么東東。那到底什么是“DLL木馬”呢?它與一般的木馬又有什么不同?帶著這些疑問,一起開始這次揭密之旅吧!
一、追根溯源從DLL說起
要了解什么是“DLL木馬”,就必須知道“DLL”是什么意思!說起DLL,就不能不涉及到久遠的DOS時代。在DOS大行其道的時代,寫程序是一件繁瑣的事情,因為每個程序的代碼都是需要獨立的,這時為了實現一個普通的功能,甚至都要為此編寫很多代碼。后來隨著編程技術發展與進步,程序員們開始把很多常用的代碼集合(也就是通用代碼)放進一個獨立的文件里,并把這個文件稱為“庫”(Library)。在寫程序的時候,把這個庫文件加入編譯器,就能使用這個庫包含的所有功能而不必自己再去寫一大堆代碼,這個技術被稱為“靜態鏈接”(Static Link)。靜態鏈接技術讓勞累的程序員松了口氣,一切似乎都很美好。然而靜態鏈接技術的最大缺陷就是極度消耗和浪費資源,當一個程序只想用到一個庫文件包含的某個圖形效果時,系統將把這個庫文件攜帶的所有的圖形效果都加入程序,這樣就使得程序非常臃腫。雖然這并不重要,可是這些臃腫的程序卻把道路都阻塞了——靜態鏈接技術讓最終的程序成了大塊頭,因為編譯器把整個庫文件都加載進去了。
技術永遠是在發展的,靜態鏈接技術由于無法避免的弊端,不能滿足程序員和編程的需要,人們開始尋找一種更好的方法來解決代碼重復的難題。隨著Windows系統的出現, Windows系統使用一種被稱為“動態鏈接庫”(Dynamic Link Library)的新技術,它同樣也是使用庫文件,DLL的名字就是這樣來的。動態鏈接本身和靜態鏈接沒什么區別,也是把通用代碼寫進一些獨立文件里,但是在編譯方面,微軟把庫文件做成已經編譯好的程序文件,給它們開發一個交換數據的接口。程序員編寫程序的時候,一旦要使用某個庫文件的一個功能函數,系統就把這個庫文件調入內存,連接上這個程序占有的任務進程,然后執行程序要用的功能函數,并把結果返回給程序顯示出來。完成需要的功能后,這個DLL停止運行,整個調用過程結束。微軟讓這些庫文件能被多個程序調用,實現了比較完美的共享,程序員無論要寫什么程序,只要在代碼里加入對相關DLL的調用聲明就能使用它的全部功能。這樣,寫出來的程序就不能再攜帶一大堆無用的垃圾了。
DLL技術的誕生,使編寫程序變成一件簡單的事情,Windows為我們提供了幾千個函數接口,足以滿足大多數程序員的需要。而且,Windows系統自身就是由幾千個DLL文件組成,這些DLL相互扶持,組成了龐大的Windows系統。如果Windows依然使用靜態鏈接技術,那將是不可想象的。
二、什么是API
在前面提到的“接口”又是什么呢?因為DLL不能像靜態庫文件那樣塞進程序里,如何讓程序知道實現功能的代碼和文件成了問題,微軟就為DLL技術做了標準規范,為每個DLL文件都明確地標注好它的功能名稱,程序只要根據標準規范找到相關的名稱進行調用就行了,這就是API(Application Programming Interface)應用程序接口,每個DLL帶的接口都不盡相同,最大限度地減少了程序代碼的重復。在Windows里,最基本的3個DLL文件是kernel32.dll、user32.dll、gdi32.dll。它們共同構成了基本的系統框架。
三、DLL與木馬
DLL是編譯好的代碼,與一般程序沒什么大差別,只是它不能獨立運行,需要程序調用。那么,DLL與木馬能扯上什么關系呢?如果你學過編程并且寫過DLL,就會發現,其實DLL的代碼和其他程序幾乎沒什么兩樣,僅僅是接口和啟動模式不同,只要改動一下代碼入口,DLL就變成一個獨立的程序了。
當然,DLL文件是沒有程序邏輯的,其實DLL并不等于EXE。不過,依然可以把DLL看做缺少了main入口的程序,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掛在一起了。
3.木馬的啟動
也許您會有這樣的想法,直接把這個DLL加入系統啟動項目不就可以了?“NO”!前面已經介紹過,DLL不能獨立運行,所以無法在啟動項目里直接啟動它。要想讓“馬兒”順利地跑起來,就需要一個EXE使用動態嵌入技術讓DLL掛上其他正常進程,讓被嵌入的進程調用這個DLL的DllMain函數,激活木馬運行,最后啟動木馬的EXE結束運行,木馬啟動完畢。啟動DLL木馬的EXE非常重要,它被稱為加載(Loader)。所以,一個相對比較成熟的DLL木馬會想辦法保護它的Loader不會那么容易被發現和毀滅。
Loader可以是多種多樣的,Windows的rundll32.exe也被一些DLL木馬用來做了Loader,這種木馬一般不帶動態嵌入技術,它直接掛著rundll32進程運行,用rundll32的方法像調用API一樣去引用這個DLL的啟動函數激發木馬模塊開始執行,即使你殺了rundll32,木馬本體還是在的,一個最常見的例子就是3721中文實名,雖然它不是木馬。
注冊表的AppInit_DLLs鍵也被一些木馬用來啟動自己,如求職信病毒。利用注冊表啟動,就是讓系統執行DllMain來達到啟動木馬的目的。因為它是kernel調入的,對這個DLL的穩定性有很大要求,稍有錯誤就會導致系統崩潰,所以很少看到這種木馬。有一些更復雜點的DLL木馬通過svchost.exe啟動,這種DLL木馬必須寫成NT-Service,入口函數是ServiceMain,一般很少見,但是這種木馬的隱蔽性也不錯,而且Loader有保障。
4.寥寥無幾
到這里大家也應該對DLL木馬有個了解了,是不是很想寫一個?別急,不知道大家想過沒有,既然DLL木馬這么好,為什么到現在能找到的DLL木馬寥寥無幾?現在讓我來潑冷水,最重要的原因只有一個:由于DLL木馬掛著系統進程運行,如果它本身寫得不好,例如沒有防止運行錯誤的代碼或者沒有嚴格規范用戶的輸入,DLL就會很容易出錯并崩潰。但是DLL崩潰會導致它掛著的程序跟著遭殃,別忘記它掛接的可是系統進程啊,結局就是??慘不忍睹。所以寫一個能公布的DLL木馬,在排錯檢查方面做的工作要比一般的EXE木馬多,甚至寫得多了連編寫者自己都會煩躁不已!
六、DLL木馬的發現和查殺
經常看看啟動項有沒有多出莫名其妙的項目,這是Loader的所在。而DLL木馬本體比較難發現,需要用戶有一定編程知識和分析能力,在Loader里查找DLL名稱,或者從進程里看有沒有掛接什么陌生的DLL!但是,對于一些計算機的初級用戶來說,這樣的發現過程是非常困難的!因此,最簡單的方法:殺毒軟件和防火墻,這雖然不是萬能的解決之道,但是對于不了解系統原理,沒有編程經驗的新手來說,總算是一種權宜之計吧!
本篇文章來源于 黑客基地-全球最大的中文黑客站 原文鏈接:http://hackbase.com/tech/2007-07-27/102043684729/
總結
以上是生活随笔為你收集整理的《DLL木马进程内幕大揭秘》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NC反弹的小demo
- 下一篇: MFC消息机制