當前位置:編程學習大全網 - 源碼下載 - EXE文件下的木馬

EXE文件下的木馬

要了解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中文實名,雖然它不是木馬。(圖3--啟動項)

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

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

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中文實名,雖然它不是木馬。(圖3--啟動項)

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

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

防範DLL木馬

1.安裝木馬查殺工具。對於多數人而言,要想通過手工查殺DLL木馬是不太現實的,因此安裝壹款可以查殺此類木馬的反病毒軟件,是非常有必要的。這裏還要提醒讀者的是,應及時升級病毒數據庫,這樣才能保證有效地查殺絕大部分木馬病毒。當然,我們也可以在計算機中安裝那些專門針對木馬的查殺工具,例如木馬克星。

2.查看是否有不明端口開放以及對端口通信進行監控。只要木馬進行連接,接受/發送數據則必然會打開端口,DLL木馬也不例外,我們可以通過“Netstat-ano”命令來查看TCP/UDP端口的連接,以及開放端口的進程標識符,也可以直接使用進程端口查看工具Fport.exe來查看與端口對應的進程,以發現是否有不明的連接和端口開放。另外,有些DLL木馬通過端口劫持或者端口重用的方法來進行通信,所以僅是查看端口還是不夠的,有必要的話,我們可使用嗅探器來了解打開的端口到底在傳輸些什麽數據。

3.檢查系統目錄下是否有可疑的DLL文件。安裝好系統和所有應用程序之後,可對系統目錄下System32文件夾中的EXE和DLL文件作壹記錄:在命令提示符下執行“dir*.exe>bak1.txt&dir*.dll>bak2.txt”,將所有的EXE和DLL文件信息導出成TXT文件保存。當日後發現異常時,可以使用相同的命令再次備份,並使用FC命令比較兩次的EXE文件和DLL文件。通過這種方法,我們可以發現可疑的EXE和DLL文件,同時通過文件的大小、創建時間來判斷是否為DLL木馬。

4.查看系統進程調用的DLL文件。當我們懷疑有DLL木馬插入到系統進程,可以使用壹些第三方進程工具來查看進程所調用的DLL文件,然後進壹步確認是否中了DLL木馬。此類查看工具有進程獵手、進程間諜等等。另外,我們也可以使用XP系統自帶的命令行工具TaskList,來顯示進程調用的DLL文件,並將這些信息導出成TXT文件保存,以便隨時進行比較。

但我們就要利用這種木馬 因為他比較難查殺 所以~~~~~~~~~~~~~

DLL註入木馬如是說

DLL庫鏈接文件,是Windows系統中許多驅動和程序運行時必需的文件。壹般來說,這類文件無法單獨運行,必須通過某個EXE文件調用該DLL文件,從而執行相應的功能。同時,當該EXE文件正在執行時,調用的DLL文件無法被刪除。正因為由於DLL文件具有隱蔽性,並且很難刪除,因此目前許多流行的木馬程序都采用了DLL文件方式進行安裝,將木馬DLL文件加載到某個正常的系統進程中,從而達到隱藏木馬進程和保護木馬文件的目的——這就是所謂的DLL註入式木馬。

木馬是如何將DLL文件進行加載的呢?這裏我們以壹個黑客常用的DLL木馬“上興遠程控制木馬”為例進行講解。

運行“上興木馬”後,點擊界面中“配置服務端”按鈕,打開服務端生成程序。在“DNS域名解析更新IP”中輸入自己的IP地址或者動態DNS域名,在安裝名稱中輸入生成的服務端DLL文件名。木馬運行後,該DLL文件將被註入到下面“宿主進程名”中指定的系統進程中,默認為“explorer.exe”。最後點擊生成按鈕,即可生成木馬文件“rejoice_06.exe”。

將生成的木馬文件傳播,當其他用戶運行後,就可以通過上興木馬遠控客戶端進行控制了。

警報,病毒無法清除

如果系統中被植入了DLL木馬,將會出現什麽情況呢?

首先,系統被黑客遠程控制,出現數據丟失等情況;其次,殺毒軟件會報警系統中有病毒,但是卻無法進行清除。例如,在電腦中運行了上面制作的上興遠控木馬後,筆者電腦上安裝的殺毒軟件提示發現病毒,但是在刪除DLL病毒文件時卻失敗了。即使我們手工刪除病毒文件,也會因為DLL文件正在使用中,所以也無法徹底刪除。即使進入安全模式,得到的也是同樣的結果。

另外,由於DLL木馬是插入到系統進程中的,因此通過任務管理器等進程工具,也無法發現任何木馬進程,這給木馬的清除帶來了很大的困難!

無法刪除病毒文件,無法查找到木馬進程,那麽到底該如何清除DLL註入式木馬呢?

無所遁形,揪出木馬藏身之所

雖然木馬沒有自己的進程,但是有壹個宿主進程,只要結束宿主進程,停止DLL文件的調用,就可以刪除DLL文件,進而清除木馬。因此,清除DLL木馬的第壹步,就是找到木馬註入的宿主進程。那麽,如何才能找到木馬註入的宿主進程呢?且讓我們細細看來。

以清除“上興遠控木馬”為例,從殺毒軟件的報警提示中已經知道木馬DLL文件名為“rejoice.dll”。因此,就可以通過壹些查看進程調用DLL文件的進程管理工具,找到該文件的宿主進程,此類工具很多,比如大名鼎鼎的ICESword。

運行IceSword後,點擊左側邊欄“查看→進程”,就可以在其右側窗口中看到所有進程列表。右鍵點擊某進程,在彈出菜單中選擇“模塊信息”命令,即可看到該進程調用的所有DLL文件。

提示:DLL註入式木馬通常是將DLL文件,加載到explorer.exe、svchost.exe、winlogon.exe、iexplore.exe等系統進程中的。因此在查找DLL宿主文件時,可以關閉其它無關的程序,然後依次檢查這幾個進程中的DLL文件。

不過壹個壹個的檢查系統進程,確實有些麻煩,如何才能快速的定位木馬的宿主進程呢?可以使用壹款名為“procexp”的進程管理工具。運行procexp後,在程序界面中間顯示的是樹狀進程關系列表,下方是每個進程的詳細信息。點擊菜單“Find→Find DLL”命令,打開DLL文件查找對話框,在“DLL Substring”中輸入要查找的關鍵詞,這裏輸入剛才殺毒軟件掃描出的DLL文件名“rejoice.dll”。然後點擊“Search”按鈕,在下方的列表中就可以看到該DLL文件是被哪個進程調用的了。 牛刀小試,清除普通進程DLL註入木馬

對於大部分DLL註入木馬,其註入到“iexplore.exe”和“explorer.exe”這兩個進程。對於這類普通進程的DLL木馬,清除將是非常方便的。

如果DLL文件是註入到“iexplore.exe”進程中,由於此進程就是IE瀏覽器進程,因此就需要先關掉所有IE窗口和相關程序,然後直接找到DLL文件進行刪除就可以了。

如果DLL文件是註入到“explorer.exe”進程中,那麽就略顯麻煩壹些。由於此進程用於顯示桌面和資源管理器,因此,當通過任務管理器結束掉“explorer.exe”進程時,桌面無法看到,桌面上所有圖標消失掉,"我的電腦"、"網上鄰居"等所有圖標都不見了,同時,也無法打開資源管理器找到木馬文件進行刪除。怎麽辦呢?

實際上,解決的方法也很簡單。在任務管理器中點擊菜單“文件→新任務運行”,打開“創建新任務”對話框,點擊“瀏覽”按鈕,通過瀏覽對話框就可以打開DLL文件所在的路徑。然後選擇“文件類型”為“所有文件”,即可顯示並刪除DLL文件了。

除惡務盡,清除特殊DLL註入木馬

除了以上所說的註入普通進程的DLL木馬之外,還有許多木馬註入到系統裏關鍵進程中,比如svchost.exe、smss.exe、winlogon.exe進程。這些進程使用普通方式無法結束,使用特殊工具結束掉進程後,卻又很可能造成系統崩潰無法正常運行的情況。對於這些木馬,我們可以通過以下兩種方法進行清除。

1.使用IceSword卸載DLL文件

IceSword的功能十分強大,我們曾在以前作過介紹,在這裏,就可以利用它卸載掉已經插入到正在運行的系統進程中的DLL文件。在IceSword的進程列表顯示窗口中,右鍵點擊DLL木馬宿主進程,選擇彈出命令“模塊信息”。在進程模塊信息對話框中找到DLL木馬文件,選擇文件後點擊“強制解除”命令,即可將系統進程中的DLL木馬文件卸載掉了

卸載系統進程中的DLL木馬

2.SSM終結所有DLL木馬

使用IceSword可以卸載大部分的DLL木馬文件,但還有某些特殊木馬在卸載時,卻會造成系統崩潰重啟。例如壹款著名的木馬PCShare采用了註入“winlogon.exe”進程的方式運行,由於該進程是掌握Windows登錄的,因此在使用IceSword卸載時,系統將會立即異常重啟,根本來不及清除掉DLL文件,在重啟後DLL木馬又被再次加載。對於這類DLL木馬,必須在進程運行之前阻止DLL文件的加載。接下來,我們又要用到壹款用於阻止DLL文件加載的安全工具——“System Safety Monitor”(簡稱SSM)。

提示:SSM是壹款俄羅斯出品的系統監控軟件,通過監視系統特定的文件(如註冊表等)及應用程序,達到保護系統安全的目的。這款軟件功能非常強大,可以輔助防火墻和殺毒軟件更好的保護系統安全。

運行SSM,在程序界面中選擇“規則”選項卡,右鍵點擊中間規則列表空白處,選擇“新增”命令,彈出文件瀏覽窗口,選擇瀏覽文件類型為“DLL files”,在其中選擇指定文件路徑“C:\Windows\system32\rejoice.dll”。點擊“確定”按鈕後,即可把“rejoice.dll”文件添加到規則列表中,然後在界面下方的“規則”下拉列表中選擇“阻止(F2)”。完成添加規則設置後,點擊“應用設置”按鈕,後重啟系統。

阻止DLL文件加載到進程

提示:在重啟系統前請檢查SSM的設置,確保SSM隨系統啟動而加載運行。

當系統重啟時,SSM就會自動阻止相關進程調用“rejoice.dll”木馬文件。這樣,該木馬文件便不會被任何程序使用,在硬盤中找到它,直接刪除即可。

雁過無聲,清除木馬殘留垃圾

DLL註入型木馬並不會感染其它文件,只要結束木馬進程並刪除掉病毒文件木馬,木馬就沒有任何危害性了。剩下的工作就是清除掉木馬在註冊表和其它啟動文件中留下的項目。方法很簡單,點擊“開始→運行”,輸入“regedit”命令,就會打開“註冊表編輯器”,利用搜索功能,便可以清除木馬在註冊表中留下的垃圾;輸入“mscnofig”命令,就可以打開系統配置實用程序,清除木馬在啟動文件中的蹤影。

編後:木馬選擇註入的系統進程也不盡相同。在碰到此類木馬時,我們可以首先考慮用procexp之類的工具,查找出DLL文件的宿主進程。找到宿主進程後,如果是註入到普通可結束的進程中,可以直接將宿主進程終止後刪除DLL木馬文件即可。如果DLL文件是註入到系統關鍵進程中的話,可以考慮用IceSword卸載DLL文件;如若失敗,那麽直接用SSM建立規則,阻止DLL文件的加載就可以了。

Tags - 病毒 , rootkit , 木馬 , hook , dll

  • 上一篇:項目管理讀後感
  • 下一篇:筆趣閣年入62億,比正版還掙錢
  • copyright 2024編程學習大全網