對於HOOK函式的一點認識

2021-04-13 13:40:50 字數 3131 閱讀 1063

首先讓我們看看hook函式是怎麼安裝、呼叫和刪除的。應用程式通常是呼叫setwindowshookex()函式來進行安裝的,其函式的原型如下:

setwindowshookex(

int idhook;

hookproc lpfn;

hinstance hmod;

dword dwthreadid;

); 引數說明:

idhook 是」鉤子」的型別,」鉤子」的型別一共有13種,具體如下表:

「鉤子」型別

解釋 wh_callwndproc

系統將訊息傳送到指定視窗之前的「鉤子」

wh_callwndprocret

訊息已經在視窗中處理的「鉤子」

wh_cbt

基於計算機培訓的「鉤子」

wh_debug

差錯「鉤子」

wh_foregroundidle

前台空閒視窗「鉤子」

wh_getmessage

接收訊息投遞的「鉤子」

wh_journalplayback

回放以前通過wh_journalrecord「鉤子」記錄的輸入訊息

wh_journalrecord

輸入訊息記錄「鉤子」

wh_keyboard

鍵盤訊息「鉤子」

wh_mouse

滑鼠訊息「鉤子」

wh_msgfilter

對話方塊、訊息框、選單或滾動條輸入訊息「鉤子」

wh_shell

外殼「鉤子」

wh_sy**sgfilter

系統訊息「鉤子」

lpfn 指向「鉤子」過程的指標。

hmod 「鉤子」過程所在模組的控制代碼。

dwthreadid 「鉤子」相關執行緒的標識。

通常我們都是把」鉤子」做成動態鏈結庫,這樣的好處是可以是系統內的每個程序訪問。但是也可以在系統中直接呼叫,我的建議還是用動態庫。如果用動態庫的話,那麼setwindowshookex()中的第三個引數就是該動態鏈結庫模組的控制代碼;對於乙個只供單個程序訪問的」鉤子」,可以將其」鉤子」過程放在安裝」鉤子」的同乙個執行緒內,此時setwindowshookex()中的第三個引數為該執行緒的hinstance。安裝」鉤子」有兩種方法:1.你可以把他做成動態連線庫檔案,和程式一起編譯。2.你可以在程式的任何地方直接呼叫。第2種的方法太麻煩,我不建議用,在這裡我就不詳細介紹啦。相比之下第1種比較簡單。其」鉤子」的過程都在動態鏈結庫內完成。setwindowshookex()函式是乙個安裝函式,如故乙個由某種型別的」鉤子」監視的事件發生,系統就會呼叫相應型別的」鉤子」鏈開始處的」鉤子」過程,」鉤子」鏈的每個」鉤子」過程都要考慮是否把事件傳遞給下乙個」鉤子」過程。如果要傳遞的話,就要呼叫callnesthookex()函式。這個函式成功時返回」鉤子」鏈中下乙個」鉤子」過程的返回值,返回值的型別依賴於」鉤子」的型別。這個函式的原型如下:

lresult callnexthookex(

hhook hhk;

int ncode;

wparam wparam;

lparam lparam;

);其中hhk為當前」鉤子」的控制代碼,由setwindowshookex()函式返回。ncode為傳給」鉤子」過程的事件**。wparam和lparam 分別是傳給」鉤子」過程的wparam值,其具體含義與」鉤子」型別有關。

釋放」鉤子」

釋放」鉤子」比較簡單,他只有乙個引數。當不在需要」鉤子」時,應及時將其釋放。他是呼叫unhookwindowshookex()函式來實現的,函式原型如下:

unhookwindowshookex(

hhook hhk;

);函式成功返回true,否則返回false。

如果我這樣講您還是不明白的話,請看下面給出的一些典型「鉤子」**和說明。

lresult winapi callwndproc(int ncode,wparam wparam,lparam lparam)

return callnexthookex(null,ncode,wparam,lparam);

}這是wh_callwndproc」鉤子」的**,此」鉤子」允許程式監視由函式sendmessage傳送給視窗過程的訊息。系統將訊息傳送到目的視窗之前呼叫wh_callwndproc 「鉤子」過程。

lresult winapi callwndproc(int ncode,wparam,wparam,lparam lparam)

break;

default:

break;

}return callnexthookex(null,ncode,wparam,lparam);

}這是呼叫wh_getmessage的函式,此函式允許應用程式監視函式getmessage和 peekmessage返回的訊息。應用程式可以用鉤子wh_getmessage來監視滑鼠和鍵盤的輸入以及其他系統傳送到訊息佇列中的訊息。

lresult callback cbtproc(int ncode,wparam wparam,lparam lparam)

return callnexthookex(null,ncode,wparam,lparam);

}每種」鉤子」型別都有其對應的函式,這些函式的引數都是一樣的,有興趣的朋友可以在msdn中找的他們的詳細說明。

下面我給出乙個完整的」鉤子」安裝和刪除的過程的**。

#include "stdafx.h"

#include "hook.h"

hinstance hinstance;

hhook hhkkeyboard;

bool apientry dllmain( handle hmodule,dword ul_reason_for_call, lpvoid lpreserved)

hinstance=(hinstance)hmodule;

return true;

}lresult keyboardproc(int ncode,wparam wparam,lparam lparam)

hook_api bool enablekeyboardcapture()

hook_api bool disablekeyboardcapture()

在程式中要想呼叫「鉤子」的時候,有enablekeyboardcapture()函式就可以啦,但你按鍵的時候就回發出聲音。  

對於非阻塞connect的一點認識

一般如下 connect select 由於是非阻塞,很自然connect立即返回,而不同於阻塞條件下的成功或者失敗才返回。對於tcp來說,非阻塞的connect會立即返回乙個錯誤einprogress,而且完成3路握手。對於udp來說,個人覺得,由於核心只是檢查是否存在立即可知的錯誤,並記錄對方的...

對於oracle sql左連線的一點認識

我們在連表的時候,可能有這樣的需求,比如我要查詢歌曲的資訊,有張song表,但是我需要返回的額資料不僅僅是song的資訊,可能還有 的資訊,這時候我們就需要使用到左連線。左連線就是不管右邊表有沒有對應的 都要展示出左邊的表的資料。左邊的表就是我們要連線的主表。有這樣的sql select paral...

對於float與流體布局的一點認識

在學完css中浮動的效果後還是有一點蒙,為了更好的認識及使用浮動,現在整理一下思路。浮動,最初是用來實現文字環繞的效果,所以如果將某乙個元素打上浮動標籤,其後面緊跟的乙個元素就會緊跟浮動形成環繞效果。為了實現這種效果,就使得浮動具有兩個特性 包裹與破壞。包裹是指不論元素以前具有什麼屬性,在float...