HOOK應用示例

2021-03-31 23:56:56 字數 4267 閱讀 8859

我們知道,windows系統是建立在訊息傳遞機制基礎上的,幾乎所有的程式活動都由訊息來驅動。windows的鉤子機制可以看作是乙個訊息中轉站,控制系統發出訊息的處理和傳遞,利用鉤子,我們可以截獲系統發給應用程式的訊息,經過處理後決定是否將訊息再發給下乙個應用程式。

利用鉤子的這一特性,我們可以建立乙個監控程式,用來收集和控制系統發出的訊息。

■編制windows鉤子程式

■編制windows鉤子程式

■編制windows鉤子程式

■編制windows鉤子程式

編制windows的鉤子程式,需要用到幾個sdk中的api函式。下面列出這幾個函式的原型及說明:

hhook setwindowshookex( int idhook,hook_proc lpfn,hinstance hmod,dword dwthreadid);

引數說明如下:

idhook:鉤子的型別

hmod:包含鉤子函式的模組控制代碼

dwthreadid:鉤子的監控執行緒

bool unhookwindowshookex(hhook hhk);

函式說明:函式將撤銷由hhk指定的鉤子。

lresult callnexthookex( hhook hhk, int ncode,wparam wparam,lparam lparam );

由於鉤子的處理涉及到模組及程序間的資料位址問題,一般情況是把鉤子整合到乙個動態鏈結庫(dll)中,並設立乙個全域性資料共享資料段,以存貯一些全域性變數,保留上次鉤子訊息事件發生時的狀態。全域性共享資料段可以用如下的格式定義:

#pragma data_seg("publicdata")

hhook hhook=null;

//全域性共享資料

#pragma data_seg()

本文的範例程式演示了如何編制乙個滑鼠鉤子(wh_mouse)程式,其它型別的鉤子程式的編寫過程與範例程式類似。

■範例程式的建立與**分析

■範例程式的建立與**分析

■範例程式的建立與**分析

■範例程式的建立與**分析

建立鉤子程式時需要把鉤子處理整合到動態鏈結庫中,所以例程中需要建立兩個project。

1.建立鉤子處理動態鏈結庫

(2) 選擇mfc extension dll型別。

(3)建立乙個新的標頭檔案,命名為「hook.h」,修改它的**如下:

extern "c" lresult callback mouseproc(int code,

wparam wparam,lparam lparam); //鉤子處理函式

extern "c" bool winapi starthook();

//啟動鉤子函式

extern "c" bool winapi stophook();

//撤銷鉤子函式

extern "c" int winapi getresult();

//取得滑鼠單擊次數的函式

(4)修改spy.cpp程式**如下:

#include "stdafx.h"

#include 〈afxdllx.h〉

#include "spyhook.h"

//省略部分機器生成**

#pragma data_seg("publicdata")

//定義全域性資料段

hhook hhook=null;

//鉤子控制代碼

hinstance pinstance=null;

//鉤子模組控制代碼

uint mouseclick=0;

//記錄滑鼠單擊次數的變數

#pragma data_seg()

//省略部分機器生成**

extern "c" int apientry

dllmain(hinstance hinstance, dword dwreason, lpvoid lpreserved)

if (dwreason = = dll_process_attach)

//省略部分機器生成**

new cdynlinklibrary(spydll);

pinstance=hinstance;

//取得模組控制代碼

else if (dwreason = = dll_process_detach)

trace0("spy.dll terminating!/n");

afxtermextensionmodule(spydll);

return 1;

extern "c" lresult callback mouseproc(int code,wparam wparam,lparam lparam)

//鉤子處理函式

if (code 〈 0)

//若code〈0,則直接呼叫callnexthookex返回

return callnexthookex(hhook, code, wparam, lparam);

if(wparam= =wm_lbuttondown)

{mouseclick++;

//記錄滑鼠單擊次數

return callnexthookex(hhook, code, wparam,lparam);

extern "c" bool winapi starthook()

//啟動鉤子函式

hhook=setwindowshookex(wh_mouse,mouseproc,pinstance,0);

//掛上鉤子

if(hhook!=null)

return true;

else return false;

extern "c" bool winapi stophook()

//撤銷鉤子函式

return unhookwindowshookex(hhook);

//撤銷鉤子

extern "c" int winapi getresult()

//返回滑鼠單擊次數

return mouseclick;

(5)修改spy.def程式**如下:

library "spy"

description 'spy windows dynamic link library'

exports

starthookb @1

stophook @2

getresult @3

(6)編譯project,生成spy.dll檔案和spy.lib檔案。

2.建立使用鉤子的應用程式

(1) 生成乙個單文件的可執行檔案(exe)的project。

(2) 修改資源中的主選單,增加乙個選單項「監控」,下有三個子選單項,分別為「啟動」、「撤銷」和「取出」。

(3) 在project中加入spy.lib檔案和hook.h檔案。

(4) 分別修改「啟動」、「撤銷」和「取出」選單項的***mand響應函式如下:

#include "hook.h"

……//省略部分機器生成**

void cmainframe::onstartspy()

//「啟動」選單項的響應函式

starthook();

void cmainframe::onreleasespy()

//「撤銷」選單項的響應函式

stophook();

void cmainframe::onget()

//「取出」選單項的響應函式

int result=getresult();

char buffer[40];

wsprintf(buffer,"在程式執行期間,你共單擊滑鼠%d次",result);

::messagebox(this-〉m_hwnd,buffer,"message",mb_ok);

編譯這個project,並把spy.dll放到生成的可執行檔案目錄下,便可執行程式。

執行時,選擇「監控」選單中的「啟動」選單項,鉤子便開始工作,監視滑鼠的活動情況;選擇「撤銷」選單項,系統便撤銷鉤子;選擇「取出」選單項,程式便報告在監控期間,使用者單擊滑鼠左鍵的次數。

以上程式在windows 98,visual c++ 4.0環境下成功執行。

php中鉤子 hook 的應用示例demo

php問題解決 我們先來回顧下原本的開發流程 產品汪搞出了一堆需求 當使用者註冊成功後需要傳送簡訊 傳送郵件等等 然後聰明機智勇敢的程式猿們就一撲而上 把這些需求轉換成 扔在 使用者註冊成功 和 跳轉到首頁 之間 沒有什麼能夠阻擋 充滿創造力的猿們 class test test new test ...

C 中來應用Hook

鉤子 hook 是windows 訊息處理機制的乙個平台 應用程式可以在上面設定子程以監視指定視窗的某種訊息,而且所監視的視窗可以是其他程序所建立的。當訊息到達後,在目標視窗處理函式之前處理它。鉤子機制允許應用程式截獲處理 window 訊息或特定事件。關於hook的詳細介紹,在微軟的msdn中有,...

C 中來應用Hook

鉤子 hook 是windows訊息處理機制的乙個平台,應用程式可以在上面設定子程以監視指定視窗的某種訊息,而且所監視的視窗可以是其他程序所建立的。當訊息到達後,在目標視窗處理函式之前處理它。鉤子機制允許應用程式截獲處理window訊息或特定事件。關於hook的詳細介紹,在微軟的msdn中有,htt...