我的個(gè)人理解:
創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、埇橋區(qū)網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開發(fā)、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為埇橋區(qū)等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
鉤子函數(shù)其實(shí)就是函數(shù)指針,系統(tǒng)或軟件定義好一些鉤子,而你來把這些鉤子掛接起來!說白了就是有些動作系統(tǒng)需要針對不同的情況做不同的處理,此時(shí)就需要定義一個(gè)鉤子。具體的操作由用戶掛上的鉤子函數(shù)實(shí)現(xiàn).
比如:
#include "stdio.h"
void (*g_say_func)(void);
void regist_say( void (*pfunc)(void ) )
{
g_say_func = pfunc;
}
void humen_say()
{
printf("hello world!!!\n");
}
void dog_say()
{
printf("wo wo !!!\n");
}
void cat_say()
{
printf("miao miao!!!");
}
void say_hello()
{
g_say_func();
}
void main()
{
regist_say(dog_say); //注冊鉤子函數(shù)
say_hello();
}
以上純粹是個(gè)人理解!
C語言newHook字段:typedefHMODULE(WINAPI*HOOKAPI)(INLPCSTR);
#defineMYHOOKMETHOD(__fun)HMODULEWINAPI__fun
#defineDECLARE_REGISTER(__0bj,__lawfunc,__newfunc)Inline_Hook__Obj(__lawfunc,__newfunc)。
鉤子(Hook),是Windows消息處理機(jī)制的一個(gè)平臺,應(yīng)用程序可以在上面設(shè)置子程以監(jiān)視指定窗口的某種消息,而且所監(jiān)視的窗口可以是其他進(jìn)程所創(chuàng)建的。當(dāng)消息到達(dá)后,在目標(biāo)窗口處理函數(shù)之前處理它。鉤子機(jī)制允許應(yīng)用程序截獲處理window消息或特定事件。
鉤子實(shí)際上是一個(gè)處理消息的程序段,通過系統(tǒng)調(diào)用,把它掛入系統(tǒng)。每當(dāng)特定的消息發(fā)出,在沒有到達(dá)目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數(shù)先得到控制權(quán)。這時(shí)鉤子函數(shù)即可以加工處理(改變)該消息,也可以不作處理而繼續(xù)傳遞該消息,還可以強(qiáng)制結(jié)束消息的傳遞。
Hook技術(shù)又叫做鉤子函數(shù),在系統(tǒng)沒有調(diào)用該函數(shù)之前,鉤子程序就先捕獲該消息,鉤子函數(shù)先得到控制權(quán),這時(shí)鉤子函數(shù)既可以加工處理(改變)該函數(shù)的執(zhí)行行為,還可以強(qiáng)制結(jié)束消息的傳遞。簡單來說,就是把系統(tǒng)的程序拉出來變成我們自己執(zhí)行代碼片段。
要實(shí)現(xiàn)鉤子函數(shù),有兩個(gè)步驟:
1.利用系統(tǒng)內(nèi)部提供的接口,通過實(shí)現(xiàn)該接口,然后注入進(jìn)系統(tǒng)(特定場景下使用)
2.動態(tài)代理(使用所有場景)
?
例子:
HWND hWnd = NULL; //定義成全局變量
HHOOK hKeyboard;
HHOOK hMouse;
LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lparam ) // 鼠標(biāo)鉤子函數(shù)
{
return 1; // 返回非零值表示已經(jīng)對當(dāng)前消息進(jìn)行了處理,這樣系統(tǒng)就不會再將這個(gè)消息傳遞給目標(biāo)窗口過程
}
LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lparam )
if( VK_F4 == wParam (1 == (lparam291)) ) // 系統(tǒng)后門:Alt+F4鍵退出程序
{
::SendMessageA( hWnd, WM_CLOSE, 0, 0 );
定義鉤子函數(shù)
鉤子函數(shù)是一種特殊的回調(diào)函數(shù)。鉤子監(jiān)視的特定事件發(fā)生后,系統(tǒng)會調(diào)用鉤子函數(shù)進(jìn)行處理。不同事件的鉤子函數(shù)的形式是各不相同的。下面以鼠標(biāo)鉤子函數(shù)舉例說明鉤子函數(shù)的原型:
LRESULT CALLBACK HookProc(int nCode ,WPARAM wParam,LPARAM lParam)
參數(shù)wParam和 lParam包含所鉤消息的信息,比如鼠標(biāo)位置、狀態(tài),鍵盤按鍵等。nCode包含有關(guān)消息本身的信息,比如是否從消息隊(duì)列中移出。 我們先在鉤子函數(shù)中實(shí)現(xiàn)自定義的功能,然后調(diào)用函數(shù) CallNextHookEx.把鉤子信息傳遞給鉤子鏈的下一個(gè)鉤子函數(shù)。CallNextHookEx.的原型如下:
LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam ) 參數(shù) hhk是鉤子句柄。nCode、wParam和lParam 是鉤子函數(shù)。
當(dāng)然也可以通過直接返回TRUE來丟棄該消息,就阻止了該消息的傳遞。