當前位置:編程學習大全網 - 腳本源碼 - QQ尾巴病毒的發送原理分析

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

近來QQ尾巴病毒大肆發作 我也經常收到網友們發來的帶尾巴的消息 於是 好奇心壹來 我也來研究研究此病毒的發作原理 首先 我不知道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

  • 上一篇:在家後院看見壹條盤著的大黑蛇是什麽征兆
  • 下一篇:我的極品老婆電視劇哪裏可以看
  • copyright 2024編程學習大全網