我們知道,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...