簡介
這種訊息所發出的QQ訊息其實和我們正常聊天時所發出的訊息一樣,只不過它的內容無意義,傳送速度非常短,勢如洪水不可抵擋。
QQ訊息“炸彈”類的攻擊軟體非常多,具有代表性的有“飄葉千夫指”,QQsend以及早期的QQjoke等,這些攻擊軟體的使用都比較簡單,運行後先填上受害者的電腦IP位址和連線埠號,然後再填上欲傳送的訊息內容以及傳送次數,就可以向對方的QQ傳送垃圾訊息了,下面我們以經典的“飄葉千夫指”為例進行介紹。
威力
“飄葉千夫指”中自帶了十條待傳送的訊息,攻擊者也可以點擊“編輯”按鍵自行添加要傳送的內容,當在軟體中輸入受攻擊電腦的IP位址和連線埠號後,點擊“傳送”按鈕就開始“狂轟濫炸”,如果勾選軟體的“自動循環變換語句”項,訊息庫中不同內容的待發訊息會循環地向受害者傳送,按下“不殺不解民憤”的按鈕,向受害者傳送的垃圾信息將是不間斷的,如果不停止,恐怕在受攻擊的電腦上永遠也無法登入QQ了!另外,此攻擊軟體還支持群組功能,可以對整個聊天群組進行訊息“炸彈”攻擊,“飄葉千夫指”的最新版本是2004,它可以對QQ2004進行攻擊。
原理
QQ訊息“炸彈”之所以普遍存在,主要是由於QQ本身的網路協定以及軟體的設計存在著漏洞,QQ主要採用UDP協定進行數據傳輸(一種面向非連線的協定),雖然它的通信效果比較好,但可靠性卻不如TCP協定,只適用於一次傳輸少量的數據,或對數據可靠性要求不高的環境。大家用QQ聊天時,傳送的都是點對點的訊息包,即聊天訊息都是直接從自己這裡傳送到QQ好友那裡的(只有當好友不線上,或者對方網路不通時,聊天訊息才保存在騰訊的伺服器上)。UDP協定的不可靠性,使得偽造UDP數據包並不是一件困難的事,再加上點對點的傳輸方式讓普通用戶的真實IP位址很容易暴露在攻擊者的面前,所以訊息“炸彈”就能通過偽造的訊息包,輕鬆地針對IP位址進行攻擊,炸你沒商量!
還有一類QQ訊息“炸彈”的軟體,它是針對QQ程式本身的信息接收漏洞而開發的,它無需知道受害者的IP位址,只要知道其QQ號碼就可以“狂轟濫炸”了,最可恨的是,大部分的網路防火牆都認為這些“炸彈”是正常的QQ訊息,並不進行阻止。
技巧
知道QQ訊息“炸彈”的攻擊原理後,我們就可以想辦法來避開它的威脅。對於普通QQ用戶來說,最簡單的辦法是使用代理伺服器來登入QQ,以達到隱藏自己電腦真實IP位址的目的。當我們的QQ正在遭受“炸彈”攻擊時,可以把攻擊者從QQ好友拖到黑名單里,並將QQ設定為“拒絕接受陌生人訊息”,另外,要記住及時更新QQ的版本,因為它的每一新版本都會修補前一版本的漏洞,令部分攻擊軟體失效。
製作
我們要做的是一個QQ炸彈,這年頭用QQ的人實在多。這林子大了可是什麼鳥都有,當然其實我們今天做這個工具的威力並不是很大,頂多只能和好友聊天的時候騷擾一下。思路很簡單,就是通過程式不停地模擬按鍵Ctrl+Enter自動傳送訊息,不過當我們做成的時候心裡自然也會有那么一種滿足和喜悅。
編程工具的選擇其實很重要,像這樣的小東東如果用VC來做那真不是一般地麻煩,什麼?你說delphi很快?那倒是,不過會pascal的肯定沒會C的人多吧。就拿我們學校來說,基本對於所有的理工專業C語言都是必修課。對於快速的可視化開發BCB當然是第一選擇,大夥們請安靜,因為,兼具了VC與 delphi共同優點的武林第一神兵利器要隆重出場了,讓我們用熱烈的掌聲歡迎:Borland C++ Builder 6.0 (簡稱BCB)。
程式詳細思路:首先打開與好友的聊天視窗,程式通過視窗名搜尋得到視窗句柄,下一步是自動將要傳送的語句拷貝到剪貼簿中,然後激活聊天視窗讓其得到鍵盤輸入焦點,最後就是通過循環不斷地模擬按鍵Ctrl+V和Ctrl+Enter了。
啟動BCB 6.0,它會默認自動新建一個Application,在窗體上放一個PageControl控制項(在Win32頁中),將其Align屬性設定為 alClient,新建一個TabSheet(很多人都說怎么也找不到這個控制項,其實新建它的方法是右鍵點擊PageControl,然後New Page就OK了),將其Caption屬性設定為“轟炸好友”,其餘控制項就根據我的圖片(沒法傳圖,不放了,看黑防吧)來放吧,當然您也可以自己發揮創造性弄個更漂亮的界面。
從上到下三個編輯框(Edit控制項)的Name屬性依次為NcikNameEdit,FrequentEdit,TimesEdit,最下面是個Memo 控制項,Name屬性設定為WordMemo,好了,下面就用代碼說話吧。(代碼側重程式實現原理,有所刪減,完整工程及代碼檔案已經打包)
首先我們要找到聊天視窗:
char WindowBuffer[MAX_PATH]; //存放視窗名的緩衝區
sprintf(WindowBuffer,"與 %s 聊天中",NickNameEdit->Text);
HANDLE hWindow = FindWindow(NULL,WindowBuffer); //查找視窗
if( hWindow == NULL )
{
ShowMessage("抱歉,沒有找到此聊天視窗!");
return;
}
這樣我們得到了聊天視窗的句柄hWindows,然後就可以開工編寫轟炸的代碼了。
this->Hide(); //隱藏視窗,沒必要顯示
for(int i=1;i<=StrToInt(TimesEdit->Text);i++)
{ //因為編輯框裡面默認都是String類型,所以我們要通過StrToInt將
//轟炸次數轉換成int型才能在循環中使用它
WordMemo->SelectAll(); //選中全部語句
WordMemo->CopyToClipboard; //將其拷貝到剪貼簿
SetForegroundWindow(hWindow); //將聊天視窗激活使其得到鍵盤焦點
StartBomb(); //調用炸彈函式開始轟炸
Sleep(StrToInt(FrequentEdit->Text)); //暫停一段時間後繼續下一個循環
}
this->Show(); //執行完畢後顯示視窗
其中StartBomb()函式的代碼如下:
void __fastcall TMainForm::StartBomb(void)
{
keybd_event(VK_CONTROL,0,0,0); //模擬按下Ctrl鍵
keybd_event(’V’,’V’,0,0); //模擬按下V鍵,必須為大寫
keybd_event(’V’,’V’,KEYEVENTF_KEYUP,0); //模擬放開V鍵
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); //模擬放開Ctrl鍵
keybd_event(VK_CONTROL,0,0,0);
keybd_event(VK_RETURN,0,0,0); //模擬按下Enter鍵
keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
關於keybd_event()的詳細用法網上有很多,還有模擬滑鼠事件的相關函式。
這樣一個QQ炸彈的模型就已經出爐了,記住:它只是個模型。如果要做好一個軟體的話,絕不僅僅是可以用了就成,我們更需要考慮用戶的友好性、程式的完善性等等,限於篇幅就不多廢話了。由於時間限制,我做這個測試炸彈的時候也沒有更多地進行最佳化,對於“炸QQ群”的功能與以上原理是一樣的,只要能找到其視窗就可以了。關於托盤圖示,我們可以使用BCB自帶的TrayIcon控制項(在Samples頁),然後簡單設定一下屬性就可以使用了,很方便。
這個程式有一個BUG,是編碼問題。如果要傳送的字元是中文的話它傳送到聊天視窗中就變成了亂碼,限於時間原因我沒能找出真正的解決方法。不過在嘗試解決它的過程中卻學到了操作剪貼簿的方法,因為那個CopyToClipboard()只是BCB中的一個成員函式,在其他地方不能直接使用,我們可以通過一系列的函式來實現這種功能,下面給出一段實例代碼:
AnsiString buffer; //保存要拷貝的字元
OpenClipboard(NULL); //打開系統剪貼簿
EmptyClipboard(); //使用之前要先清空剪貼簿
HGLOBAL hClipData; //分配一段記憶體,大小等於要複製的字元串的大小
hClipData = GlobalAlloc(GMEM_DDESHARE,buffer.Length()+1);
char *pchData; //記憶體控制句柄加鎖
pchData = (char *)GlobalLock(hClipData);
strcpy(pchData,buffer.c_str()); //將變數值賦給全局記憶體
GlobalUnlock(hClipData); //給記憶體控制句柄解鎖
SetClipboardData(CF_TEXT,hClipData); //通過全局記憶體句柄將數據以相應的格式放進剪貼簿
CloseClipboard(); //使用完後記得關閉剪貼簿
這段代碼通常用來完成進程間通信等功能,由於其使用簡單,容易理解,所以用處還是比較廣泛的。
最後說一點有關BCB的小技巧:
1,默認情況下你會發現它生成的可執行程式很小,但卻不能在沒有安裝BCB或delphi的機器上運行,我們需要設定一下:在project-> Options->Compiler中點擊Release,在project->Options->Packages中取消 Builder with runtime packages的勾,在project->Options->Linker中取消Use dynamic RTL前的勾。
2,更換BCB自帶的圖示,Project/Options/Application/LoadIcon,目標圖片必須是ico格式。
3,如果您是BCB的初學者的話,我推薦《C++ Builder初學問與答》這一系列文章,基本上對BCB中所有的常用控制項都做了詳細的說明,非常有用。