新一代的嵌入式木馬,也就是通常所說的dll型注入式木馬,其運(yùn)用了動(dòng)態(tài)嵌入技術(shù),動(dòng)態(tài)嵌入最常見的是最常見的是鉤子、API以及遠(yuǎn)程線程技術(shù),而現(xiàn)在大多數(shù)的嵌入式木馬都是運(yùn)用遠(yuǎn)程線程技術(shù)把自己本身掛在一個(gè)正常的系統(tǒng)進(jìn)程中,通常這一類木馬清除起來比較困難。
隨著計(jì)算機(jī)的發(fā)展,木馬技術(shù)也在不停的發(fā)展,以冰河為首的老一代經(jīng)典木馬已經(jīng)開始慢慢消失在經(jīng)典木馬行列中,取而代之的則是新一代的嵌入式木馬,也就是通常所說的dll型注入式木馬,其運(yùn)用了動(dòng)態(tài)嵌入技術(shù),動(dòng)態(tài)嵌入最常見的是最常見的是鉤子、API以及遠(yuǎn)程線程技術(shù),而現(xiàn)在大多數(shù)的嵌入式木馬都是運(yùn)用遠(yuǎn)程線程技術(shù)把自己本身掛在一個(gè)正常的系統(tǒng)進(jìn)程中,通常這一類木馬清除起來比較困難。
嵌入式木馬之迷
那到底什么是嵌入式dll型木馬呢?DLL的代碼和其他程序幾乎沒什么兩樣,僅僅是接口和啟動(dòng)模式不同,只要改動(dòng)一下代碼入口,DLL就變成一個(gè)獨(dú)立的程序了。當(dāng)然,DLL文件是沒有程序邏輯的,這里并不是說DLL=EXE,不過,依然可以把DLL看做缺少了main入口的EXE,DLL帶的各個(gè)功能函數(shù)可以看作一個(gè)程序的幾個(gè)函數(shù)模塊。DLL木馬就是把一個(gè)實(shí)現(xiàn)了木馬功能的代碼,加上一些特殊代碼寫成DLL文件,導(dǎo)出相關(guān)的API,在別人看來,這只是一個(gè)普通的DLL,但是這個(gè)DLL卻攜帶了完整的木馬功能,而dll木馬的標(biāo)準(zhǔn)執(zhí)行入口為dllmain,dllmain包含了木馬的運(yùn)行代碼,或者其指向木馬的執(zhí)行模塊,在dll木馬中通過在另一個(gè)進(jìn)程中創(chuàng)建遠(yuǎn)程線程(RemoteThread)的方法進(jìn)入那個(gè)進(jìn)程的內(nèi)存地址空間被稱為“注入”,當(dāng)載體在那個(gè)被注入的進(jìn)程里創(chuàng)建了遠(yuǎn)程線程并命令它加載DLL時(shí),木馬就掛上去執(zhí)行了,沒有新進(jìn)程產(chǎn)生,這就是嵌入式dll木馬。
因此黑客通常把dll木馬注入到一些系統(tǒng)關(guān)鍵進(jìn)程,如嵌入到ie瀏覽器,Explorer.exe中,來達(dá)到更好的啟動(dòng)和隱蔽自身的目的。如今除了專門的dll木馬外,還有許多優(yōu)秀的木馬也可以選擇生成一般的exe木馬和dll木馬2種類型,來提供給用戶各種需要,其中的典型的木馬是黑洞和灰鴿子,這2款經(jīng)典之作就支持這2種服務(wù)端的生成,其生成的dll木馬服務(wù)端的穩(wěn)定性也相當(dāng)出色,各大殺毒產(chǎn)商都將其列入重點(diǎn)查殺對(duì)象。
揪出嵌入式木馬
在了解了嵌入式木馬的工作原理后,我們應(yīng)該如何來及時(shí)發(fā)現(xiàn)和清除這一類木馬呢?不管是傳統(tǒng)木馬還是嵌入式木馬,首先我們要了解木馬的藏身之地,同傳統(tǒng)木馬一樣system32同樣也是嵌入式木馬最喜愛的藏身之所,根據(jù)這個(gè)特點(diǎn)我們?cè)诎惭b好系統(tǒng)和必要的應(yīng)用程序后,對(duì)該目錄下的exe文件和dll文件做一個(gè)記錄,運(yùn)行CMD--轉(zhuǎn)換目錄到system32--dir *.exe>exe.txt & dir*.dll>dll.txt,這樣所有的EXE和DLL文件的名稱都被分別記錄到exe.txt和dllback.txt中。
如果系統(tǒng)在以后的使用中出現(xiàn)異常而用傳統(tǒng)的方法查不出來的時(shí)候,我們就要考慮是不是嵌入式木馬在搗亂了,此時(shí)我們?cè)俅芜\(yùn)行CMD--轉(zhuǎn)換目錄到system32--dir *.exe>exe1.txt & dir*.dll>dll1.txt將system32下的exe和dll文件分別再記錄到exe1.txt和dll1.txt中,接下來我們就可以對(duì)2次記錄的文件進(jìn)行比較了,來判斷是否存在嵌入式木馬,方法如下:運(yùn)行CMD--fc exe.txt exe1.txt>change.txt & fc dll.txt dll1.txt>change.txt,其含義為用fc命令比較exe和dll的2次記錄文件,并將結(jié)果輸出到change.txt中。這時(shí)我們就可以從change.txt中發(fā)現(xiàn)發(fā)生變化的exe和dll文件以及多出來的exe和dll文件,最后我們查看這些文件的創(chuàng)建時(shí)間、版本、是否經(jīng)過壓縮等就能夠比較容易地判斷出是不是已經(jīng)被DLL木馬修改了。
如果有的話,在沒有把握的情況下就把dll文件先刪除到回收站中,以便誤刪以后還能文件還原,如果重新啟動(dòng)后系統(tǒng)沒有任何異常,我們就可以徹底刪除此dll文件了。但同時(shí)由于有的進(jìn)程調(diào)用的DLL文件非常多,使得靠我們自己去一個(gè)一個(gè)去核對(duì)變的不太現(xiàn)實(shí),所以此時(shí)我們可以借助一些工具來幫助我們縮小范圍,其中NT進(jìn)程/內(nèi)存模塊查看器ps.exe就是一款很不錯(cuò)的工具,用命令ps.exe /a /m >usedll.txt將系統(tǒng)目前正在調(diào)用的所有DLL文件名稱保存到usedll.txt中,然后再用fc dll.txt usedll.txt>changenow.txt把比較結(jié)果輸出到changenow.txt中,這樣我們就能大大的縮小查找范圍。同時(shí)端口也是值得我們重視的一部分,我們可以用進(jìn)程端口查看工具Fport.exe來查看與端口對(duì)應(yīng)的進(jìn)程,一般木馬開放的是高端口(但也不排除其使用了端口轉(zhuǎn)發(fā)和復(fù)用技術(shù))樣還可以將范圍縮小到具體的進(jìn)程,然后結(jié)合Procedump.exe這款脫殼工具來查看此進(jìn)程調(diào)用的dll文件,再利用上面介紹的文件比較法來比較,從而使得查找DLL木馬變的更容易。針對(duì)端口我們還可以使用嗅探的方法來嗅探端口所傳輸?shù)臄?shù)據(jù),如果數(shù)據(jù)異常則,再使用Fport來找出端口所對(duì)應(yīng)進(jìn)程然后再重復(fù)以上步驟。
實(shí)戰(zhàn)文件對(duì)比法
以上講了這么多方法來揪出嵌入式木馬,也許大家看著這些操作無從做起,以下我將給出文件對(duì)比的主要步驟。
◆應(yīng)用環(huán)境◆
Windows2000 pro,d:/test文件夾的對(duì)比
◆實(shí)戰(zhàn)流程◆
步驟一:進(jìn)入d盤test文件夾,對(duì)test文件夾下內(nèi)容進(jìn)行記錄,運(yùn)行CMD--轉(zhuǎn)換目錄到d:/test--dir *.exe>exe.txt & dir *.dll>dll.txt,如下圖所示:
這樣我們就會(huì)在d:/test下生成exe和dll兩個(gè)記事本文件,內(nèi)容分別如下:
exe.txt文件:
驅(qū)動(dòng)器 D 中的卷是 娛樂
卷的序列號(hào)是 6078-F043
D:\test 的目錄
2005-12-04 11:59a 26,772,480 dx81setup.exe
2005-12-04 11:59a 473,600 g5setup解碼.exe
2 個(gè)文件 27,246,080 字節(jié)
0 個(gè)目錄505,454,592 可用字節(jié)
dll.txt文件:
驅(qū)動(dòng)器 D 中的卷是 娛樂
卷的序列號(hào)是 6078-F043
D:\test 的目錄
2005-03-31 02:52a 36,924 php5apache.dll
2005-03-31 02:52a 36,925 php5apache2.dll
2005-03-31 02:52a 53,314 php5apache_hooks.dll
3 個(gè)文件127,163 字節(jié)
0 個(gè)目錄505,454,592 可用字節(jié)
步驟二:我向test文件夾中拷貝幾個(gè)exe和dll文件進(jìn)去,再次重復(fù)步驟一,得到exe1.txt和dll1.txt兩個(gè)文件,同樣他們位于test文件夾中。
步驟三:比較exe.txt和exe1.txt文件以及dll.txt和dll1.txt文件,運(yùn)行CMD--fc exe.txt exe1.txt>change.txt & fc dll.txt dll1.txt>change.txt,如下圖所示:
對(duì)比后得到changedll.txt和changeexe.txt兩個(gè)文件內(nèi)容如下:
changedll.txt:
正在比較文件 dll.txt 和 DLL1.TXT
***** dll.txt
2005-03-31 02:52a 36,924 php5apache.dll
***** DLL1.TXT
2005-03-31 02:52a 417,792 fdftk.dll
2005-03-31 02:52a 90,112 fribidi.dll
2005-03-31 02:52a 346,624 gds32.dll
2005-03-31 02:52a 36,924 php5apache.dll
*****
***** dll.txt
2005-03-31 02:52a 53,314 php5apache_hooks.dll
3 個(gè)文件127,163 字節(jié)
0 個(gè)目錄505,454,592 可用字節(jié)
***** DLL1.TXT
2005-03-31 02:52a 53,314 php5apache_hooks.dll
6 個(gè)文件981,691 字節(jié)
0 個(gè)目錄475,787,264 可用字節(jié)
*****
其中我們只需看上面我加粗的部分,這部分內(nèi)容為增加的文件。加粗部分上面一段dll.txt內(nèi)容只顯示一行信息2005-03-31 02:52a 36,924 php5apache.dll,其他文件內(nèi)容信息省略了,這一行內(nèi)容就代表了dll.txt中的內(nèi)容,而加粗這部分DLL1.TXT中的2005-03-31 02:52a 36,924 php5apache.dll就代表了dll.txt中所有內(nèi)容,剩下的就是我加粗了的文件了,即增加了的文件。
changeexe.txt:
正在比較文件 exe.txt 和 EXE1.TXT
***** exe.txt
2005-12-04 11:59a 473,600 g5setup解碼.exe
2 個(gè)文件 27,246,080 字節(jié)
0 個(gè)目錄505,454,592 可用字節(jié)
***** EXE1.TXT
2005-12-04 11:59a 473,600 g5setup解碼.exe
2005-12-04 12:02p 13,058,048 mpsetup.exe
2004-10-30 09:11a 11,761,184 RealPlayer10-5GOLD_cn.EXE
2005-12-04 12:02p 3,963,392 Winamp278cn_DFX_Blue.EXE
5 個(gè)文件 56,028,704 字節(jié)
0 個(gè)目錄475,787,264 可用字節(jié)
*****
以上增加了的內(nèi)容為:
2005-12-04 12:02p 13,058,048 mpsetup.exe
2004-10-30 09:11a 11,761,184 RealPlayer10-5GOLD_cn.EXE
2005-12-04 12:02p 3,963,392 Winamp278cn_DFX_Blue.EXE
步驟四:判斷以上增加的內(nèi)容是否是自己,曾經(jīng)安裝在test文件夾中的exe或者dll文件,如果不是則刪除即可。
結(jié)束語
總而言之要查殺這類嵌入式木馬最有效的辦法就是文件對(duì)比法,除了上面介紹的一些縮小查找范圍的辦法外,用戶還可以自己再發(fā)揮想象把范圍縮至最小,從而更加準(zhǔn)確的查殺此類嵌入式木馬,讓嵌入式木馬在我們面前無法遁形。