更多信息請(qǐng)?jiān)L問(wèn):考試吧計(jì)算機(jī)類(lèi)論壇
基本概念
鉤子(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é)束消息的傳遞。
常見(jiàn)的Hook應(yīng)用很多,如現(xiàn)在的木馬盜號(hào)程序、網(wǎng)絡(luò)防火墻、以及金山詞霸等都使用了這種技術(shù)。
下面,我主要談到我在解決最近的一個(gè)項(xiàng)目中用到的幾種Hook技術(shù)。
Hook手段1―――――替換IAT表
要了解IAT表,首先應(yīng)該了解Windows的PE文件格式,這里不再贅述。簡(jiǎn)單的說(shuō),就是當(dāng)一個(gè)進(jìn)程加載另一個(gè)模塊之,建立起來(lái)的模塊內(nèi)的函數(shù)名與它在模塊內(nèi)相對(duì)地址的映射關(guān)系。如下圖: 函數(shù)A
0xb333
函數(shù)B
0x1234
Dll temp.dll
A
getProcAddress(B)
IAT表
主 進(jìn)程
主進(jìn)程加載temp.dll,就把在自己的IAT表中,映射A,加載的模塊名temp.dll,以及在temp.dll的代碼偏移量0xb333,我們想實(shí)現(xiàn)用函數(shù)B來(lái)替換函數(shù)A,則,只需要把IAT表中的0xb333替換為getProcAddrss(B), 即為getModuleAddress(void)+0x1234。
相關(guān)推薦:C++考試輔導(dǎo):內(nèi)存分配的五種方法的區(qū)別北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |