計(jì)算機(jī)二級(jí)考試C語(yǔ)言輔導(dǎo):通過(guò)HOOK獲取QQ游戲登錄密碼

字號(hào):

//通過(guò)HOOK獲取QQ游戲登錄密碼
    //by redice 2008.7.19
    //redice@163.com
    不是什么新鮮貨了,只是想重溫一下鉤子及 DLL的編寫...
    先發(fā)個(gè)程序運(yùn)行效果圖:
    不得不先說(shuō)一下API函數(shù)SendMessage:
    使用SendMessage向編輯框窗口發(fā)送WM_GETTEST消息,可以輕易獲取到編輯框的內(nèi)容(就算這個(gè)窗口不屬于同一進(jìn)程)。
    但是有一個(gè)特例,那就是當(dāng)編輯框窗口具有ES_PASSWORD風(fēng)格(即密碼輸入框)且不輸入同一進(jìn)程時(shí),使用上面的方法就失效了。
    通俗的說(shuō),就是當(dāng)你要使用SendMessage讀取的密碼框不屬于同一個(gè)進(jìn)程時(shí),是讀取不到任何內(nèi)容的。
    這也許是微軟從安全角度考慮做的手腳吧。
    如何解決這個(gè)問(wèn)題?
    如果我們能將SendMessage放到目標(biāo)進(jìn)程中執(zhí)行問(wèn)題就解決了。因?yàn)閷儆谕粋€(gè)進(jìn)程時(shí)使用SendMessage是可以讀取到密碼框的內(nèi)容的。
    如何將SendMessage放到目標(biāo)進(jìn)程中執(zhí)行呢?使用HOOK(或者進(jìn)程注入)。
    關(guān)于鉤子(HOOK)
    鉤子(Hook),是Windows消息處理機(jī)制的一個(gè)平臺(tái),應(yīng)用程序可以在上面設(shè)置子程以監(jiān)視指定窗口的某種消息,而且所監(jiān)視的窗口可以是其他進(jìn)程所創(chuàng)建的。
    當(dāng)消息到達(dá)后,在目標(biāo)窗口處理函數(shù)之前處理它。鉤子機(jī)制允許應(yīng)用程序截獲處理window消息或特定事件。
    鉤子實(shí)際上是一個(gè)處理消息的程序段,通過(guò)系統(tǒng)調(diào)用,把它掛入系統(tǒng)。每當(dāng)特定的消息發(fā)出,在沒(méi)有到達(dá)目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數(shù)先得到控制權(quán)。
    這時(shí)鉤子函數(shù)即可以加工處理(改變)該消息,也可以不作處理而繼續(xù)傳遞該消息,還可以強(qiáng)制結(jié)束消息的傳遞。
    如何安裝一個(gè)鉤子?
    使用API函數(shù)SetWindowsHookEx,原型及參數(shù)說(shuō)明如下
    HHOOK SetWindowsHookEx(
    int idHook, // 鉤子的類型,本例采用WH_CALLWNDPROC(窗口過(guò)程鉤子)
    HOOKPROC lpfn, // 鉤子函數(shù)地址(即鉤子函數(shù)的函數(shù)名)
    HINSTANCE hMod, // 鉤子函數(shù)所在的應(yīng)用程序?qū)嵗浔?,(本例為DLL的句柄)
    DWORD dwThreadId // 目標(biāo)線程ID,即鉤子的宿主線程
    );
    注意:當(dāng)最后一個(gè)參數(shù)為0時(shí)表示安裝的是全局鉤子,此時(shí)要求鉤子函數(shù)必須要在DLL中。
    MSDN上關(guān)于這個(gè)函數(shù)的說(shuō)明很詳細(xì)的。