有一種木馬和DLL文件息息相關,被很多人稱之為“DLL木馬”,那麼這種木馬的特殊性在哪裡?它和DLL文件到底有什麼關系?它采用了什麼技術使得自己難以被用戶察覺?我們又該如何查殺和清除這種木馬?這些都是在本文中要談到的話題。
要了解DLL木馬,就必須知道這個“DLL”是什麼意思。DOS時代,寫程序是一件繁瑣的事情,因為每個程序的代碼都是獨立的,程序員們把很多常用的代碼集合放進一個獨立的文件裡,並把這個文件稱為“庫”(Library),在寫程序的時候,把這個庫文件加入編譯器,就能使用這個庫包含的所有功能而不必自己再去寫一大堆代碼,這個技術被稱為“靜態鏈接”(Static Link)。後來,Windows系統出現了,它使用了一種新的被稱為“動態鏈接”(Dynamic Link)的技術――Dynamic Link Library,5自學網,DLL的名字就是這樣來的。DLL技術的誕生,使編寫程序變成一件簡單的事情,Windows為我們提供了幾千個函數接口,足以滿足大多數程序員的需要。
說穿了,DLL文件也是可執行文件的一種,只是它不能自己運行。Windows在加載DLL的時候,需要一個入口函數,就如同可執行程序的main函數一樣。 DLL與木馬
那麼,DLL與木馬能扯上什麼關系呢?你可能知道木馬和病毒一樣,也是程序的一種,但是DLL文件呢?DLL木馬就是把一個實現了木馬功能的代碼加上一些特殊代碼寫成DLL文件,並導出相關的API。在用戶看來,這只是一個普通的DLL,但是這個DLL卻攜帶了完整的木馬功能,這就是DLL木馬的概念。也許有人會問,既然同樣的代碼就可以實現木馬功能,那麼直接寫成可執行不就行了,為什麼還要多此一舉寫成DLL呢?這是為了隱藏,因為DLL文件運行時直接掛在調用它的程序進程中,不會另外產生進程,所以相對於傳統EXE木馬來說,它很難被查到。 DLL木馬技術分析及實現
到了這裡,你也許會想:既然DLL木馬有這麼多好處,為什麼現在的EXE木馬還是比DLL木馬要多呢?為什麼不直接采用更高明的DLL方式實現木馬呢?這主要在於:如果要實現同樣的功能,DLL木馬的編寫難度要比EXE木馬大很多。我們一起來看看DLL木馬的主要技術。
Windows系統中,每個進程都有自己的私有內存空間,理論上別的進程是不允許對這個私人領地進行操作的。但是,實際上我們仍然可以利用種種方法進入並操作進程的私有內存,這就是所謂的“動態嵌入”技術,它是將自己的代碼嵌入正在運行的進程中的技術。動態嵌入的實現方法有很多種,最常見的是“鉤子”、API函數以及“遠程線程”技術,現在的大多數DLL木馬都采用“遠程線程”技術把自己掛在一個正常系統進程中。
至於DLL木馬的啟動,有人也許會迫不及待地說,直接把這個DLL加入系統啟動項目不就可以了?答案是不行,前面說過,DLL不能獨立運行,所以要想讓木馬跑起來,5自學網,就需要一個EXE使用動態嵌入技術讓DLL搭上其他正常進程的車,讓被嵌入的進程調用這個DLL的DllMain函數,激發木馬運行,最後啟動木馬的EXE結束運行,木馬啟動完畢。
啟動DLL木馬的EXE是個重要角色,它被稱為Loader,如果沒有Loader,DLL木馬就是破爛一堆,因此,一個成熟的DLL木馬會想辦法保護它的Loader不那麼容易被毀滅。
Loader可以是多種多樣的,Windows的rundll32.exe也被一些DLL木馬用來做了Loader,這種木馬一般不帶動態嵌入技術,它直接掛著rundll32進程運行,即使你殺了rundll32進程,木馬本體還是在的。利用這種方法除了可以用來啟動木馬之外,不少應用程序也采用了這種啟動方式,一個最常見的例子是“3721中文實名”。
注冊表的AppInit_DLLs鍵也被一些木馬用來啟動自己,如求職信病毒。利用注冊表啟動,就是讓系統執行DllMain來達到啟動木馬的目的。有一些更復雜的DLL木馬會通過svchost.exe啟動,這種DLL木馬必須寫成NT-Service,入口函數是ServiceMain,這種木馬比較少見,但是其隱蔽性很高,而且Loader有保障。 DLL木馬的發現和查殺
DLL木馬的查殺比一般病毒和木馬的查殺要更加困難,建議用戶經常看看系統的啟動項中有沒有多出莫名其妙的項目,這是DLL木馬Loader可能存在的場所之一。如果用戶有一定的編程知識和分析能力,還可以在Loader裡查找DLL名稱,或者從進程裡看多掛接了什麼陌生的DLL。對普通用戶來說,最簡單有效的方法還是用殺毒軟件和防火牆來保護自己的計算機安全。