首先宣告一下,標題所指的鉤子是訊息鉤子,而不是
api鉤子(一種對
api訊息鉤子在
windows
程式設計中有著非常廣泛的應用,它可以任意攔截
windows
系統,這個以訊息為驅動的系統中的絕大多數訊息型別。一方面這給程式設計者帶來了巨大的靈活性,另一方面也埋下了巨大隱患,大多數竊密軟體都使用這種方法。此篇文章給您提供一種鉤子的反攔截方法,希望對您有所幫助。文章中使用了
api鉤子,您之前必須對此技術有一定了解。
為求完整,文章分為兩部分,第一部分為訊息鉤子的使用,熟悉此技術的讀者可以直接跳過此節。第二部分為訊息鉤子的反攔截。
一、訊息鉤子的使用。
訊息鉤子分為本地(
local
)和遠端(
remote
)兩種(兩個
local system-wide hook
例外,無關主題,不多說了)。
local
型別的鉤子函式只能攔截本程序的訊息。能夠攔截本程序以外的訊息的鉤子,都是
remote
型別。remote
型別的鉤子必須放在
dll裡面。下面以
remote
型別為例,通過安裝鍵盤鉤子介紹其使用。
1、首先建立
dll,在標頭檔案中新增如下**。
#ifdef km_exports
#define km_api __declspec(dllexport)
#else
#define km_api __declspec(dllimport)
#endif
km_api bool hookstart();//
安裝鉤子
km_api bool hookstop();//
解除安裝鉤子2、在
.cpp
檔案中新增**
#pragma data_seg("shared")
hhook g_hhookkey=null;
#pragma data_seg()
#pragma comment(linker,"/section:shared,rws")
g_hhookkey
為鍵盤鉤子的控制代碼,為確保此數值在所有例項中均保持不變,將其存放於此模組所有例項的共享資料區,若在
exe程式中按此格式新增一
int
變數,在程式啟動時
,則可以通過訪問此變數的數值,確定有多少個
exe的例項,當然這種方法也可以替代同步物件用於只啟動乙個例項。
hinstance g_hinstdll=null; //
新增全域性變數用於記錄此
dll模組的控制代碼
bool apientry dllmain( handle hmodule, dword ul_reason_for_call, lpvoid lpreserved )
}
lresult keyhookproc(int ncode,wparam wparam,lparam lparam)//
鍵盤鉤子的過濾函式
bool hookstart()//
安裝鉤子
bool hookstop()//
解除安裝鉤子
只要在exe程式中呼叫
hookstart
函式,就可以監視某一視窗的鍵盤訊息,若此視窗為
qq的密碼框,你的密碼就洩漏了。
二、訊息鉤子的反攔截。
請留意前面帶
*號注釋的**,其中傳入了鉤子的控制代碼
g_hhookkey
,只要使用
api鉤子將
callnexthookex
函式替換,並在替換函式中將其解除安裝,訊息鉤子就完蛋了。同時,還要保證本程序安裝的鉤子不被解除安裝,其中既可能有
local
型別的還可能有
remote
型別的。不要以為自己沒有在程式中安裝鉤子,程式中就一定沒有安裝鉤子,在
mfc4
版本中,
mfc會自己裝乙個
local
型別的鉤子,
mfc7
版本中好像沒了。好了,下面介紹其實現。
1、建立
dll,在標頭檔案中新增如下**。
#ifdef hookforbid_exports
#define hookforbid_api __declspec(dllexport)
#else
#define hookforbid_api __declspec(dllimport)
#endif
hookforbid_api int fnhookforbid(void);//
在exe
程式中呼叫此函式,使
dll載入
hookforbid_api bool addhhook(hhook hhook);//
若exe
中安裝remote
型別訊息鉤子,將其控制代碼新增
hookforbid_api bool delhhook(hhook hhook);//
在exe
中解除安裝remote
型別訊息鉤子時,刪除其控制代碼2、在
.cpp
檔案中新增**。
carrayarray;//
用於記錄本程序安裝的鉤子的控制代碼
//
int fnhookforbid(void)
bool addhhook(hhook hhook)
bool delhhook(hhook hhook)
//此函式用於替換
setwindowshookex
函式的unicode
版本setwindowshookexw
hhook winapi hook_setwindowshookexw( int idhook, hookproc lpfn, hinstance hmod, dword dwthreadid )
//此函式用於替換
callnexthookex
函式,此函式只有乙個版本
lresult winapi hook_callnexthookex( hhook hhk, int ncode, wparam wparam, lparam lparam)
windows
核心程式設計裡的用
iat的
apihook
是不全面的。
::getprocaddress(::getmodulehandle("kernel32.dll"), "setwindowshooka");
就可以繞過。
apihook
最好的方法還是直接修改
api入口點的**。
同時hook getprocaddress
不就行了,但是要是對方使用搜尋
pe函式匯出表的話就沒用
防止iat
型的鉤子我要是對
pe檔案的
iat加密,呼叫時解密呼叫,就可以了吧(極其複雜)
防止jmp
型的鉤子我沒想到好辦法
防止除錯我可以判斷
api入口處是否有
int3
中斷**就可以了吧(簡單)
訊息鉤子的反攔截其實核心是利用
api攔截
,來取消鉤子攔截
.
如果api
攔截被破解也就是說訊息鉤子反攔截沒有成功
.
C 鉤子本執行緒內訊息攔截
鉤子其實就是呼叫一下api而已 1 安裝鉤子 setwindowshookex 函式原形 hhook setwindowshookex int idhook,鉤子型別,hookproc lpfn,鉤子函式位址 instance hmod,鉤子所在的例項的控制代碼,dword dwthreadid 鉤...
C 鉤子本執行緒內訊息攔截
選擇自 xdev 的 blog 關鍵字 引用 c 鉤子本執行緒內訊息攔截 出處http blog.csdn.yiruoyun archive 2004 10 17 140219.aspx 鉤子其實就是呼叫一下api而已 1 安裝鉤子 setwindowshookex 函式原形 hhook setwi...
C 鉤子本執行緒內訊息攔截
鉤子其實就是呼叫一下api而已 1 安裝鉤子 setwindowshookex 函式原形 hhook setwindowshookex int idhook,鉤子型別,hookproc lpfn,鉤子函式位址 instance hmod,鉤子所在的例項的控制代碼,dword dwthreadid 鉤...