熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

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

2013-11-11 21:05:45  來源: Delphi編程 
近來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尾巴的原理不同(我也不知道)但總體上應該差不多如果要做到讓用戶感覺不到異常就要改一下了不要自動發送而是在當用戶點擊了發送按鈕後再把文本加進去這樣的話可攔截發送按鈕的點擊消息然後再用上述方法把文本加進去然後把消息交還原程序處理至於如何讓它成為病毒會自我復制自我隱藏等功能那又是另外一個話題了在此就不多講了

  另此文只作技術研討之用希望大家不要拿它來搗蛋如有產生後果本人概不負責歡迎大家來信探討


From:http://tw.wingwit.com/Article/program/Delphi/201311/8482.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.