訊息鉤子的反攔截

2021-04-21 22:04:50 字數 3917 閱讀 8495

首先宣告一下,標題所指的鉤子是訊息鉤子,而不是

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 鉤...