2012年8月19日 星期日

vbHook解析

HOOK 這令人感到神祕的詞.. 
我們在在這裡揭發它神祕的地方吧
簡單說一下HOOK
它在windows與目的窗體的中間做一個攔截的動作,這動作可以是處理及不處理(後面會說明)




HOOK具體流程:
客戶從窗體發送消息 -> windows -> 特定鉤子 -> 目的窗體

上述流程可以知道,在消息還沒到達目的窗體時,由系統掛起鉤子並先得到消息
就這樣我們鉤住消息後就可以做一些事情
範圍則分全局以及單一線程的攔截
在當前窗體裡我們掛起鉤子是比較方便實現的
但是在其它的線程裡掛起鉤子就得注入動態連接庫
動態連接庫內是處理消息的函數,而且需要標準連接庫(VB困難實現)
不繼續廢話了
現在就來解析全局鍵盤攔截的鉤子

SetWindowsHookEx

  1. C:
  2. HHOOK WINAPI SetWindowsHookEx(
  3.   _In_  int idHook,
  4.   _In_  HOOKPROC lpfn,
  5.   _In_  HINSTANCE hMod,
  6.   _In_  DWORD dwThreadId
  7. );
  8. VB:
  9. Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
複製代碼

這個主角API它的參數有四個
第一:
告訴系統你要掛起的鉤子類型
鉤子類型表請參閱MSDN或是範例附件中的鉤子表
第二:
過程的指針(需要封裝到模塊中,這也說明前面的"掛起其他線程的鉤子在VB是比較難實現的")
第三:
調用函數過程地址,即封裝第二參數的模塊的地址 
第四:
欲掛起的程序的進程標示符,全局則設為0
也可以是指定程序的進程標示符
若返回值不為0則代表鉤子安裝成功

UnhookWindowsHookEx

  1. C:
  2. BOOL WINAPI UnhookWindowsHookEx(
  3.   _In_  HHOOK hhk
  4. );
  5. VB:
  6. Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
複製代碼
Unhookwindowshookex 意思就是取消鉤子
要取消鉤住消息就得靠這個API,若沒取消鉤子的話它將繼續監聽,程序往往在這裡出錯
參數一:
就是鉤子的地址,即setwindowshookex的返回值

CallNextHookEx

  1. C:

  2. LRESULT WINAPI CallNextHookEx(
  3.   _In_opt_  HHOOK hhk,
  4.   _In_      int nCode,
  5.   _In_      WPARAM wParam,
  6.   _In_      LPARAM lParam
  7. );
  8. VB:
  9. Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
複製代碼
如果只是掛起一個鉤子,那麼這個API則不是必要的
在這裡又要廢話一下
首先我們在前面就可以知道
鉤子在消息還沒到達目的窗體時就已經取得消息的
callnexthookex流程:

-> 鉤子表 -> 目的窗體
     鉤子A
     鉤子B
     鉤子C

使用callnexthookex就是在這幾個鉤子間傳遞
最後才返回至目的窗體
來看看它的參數吧
第一:
目前鉤子的地址 (聰明的各位就知道是setwindowshookex的返回值)
第二:
第二鉤子地址,沒鉤子就返回系統的
第三:
傳回第二參數需要的附加消息
例如:按下A,那麼"按下"就是附加消息
第四:
與第三參數作用是相同
以第三參數的例子來說的附加消息就是"A"

還有就是你要處理消息的函數,名稱可以自定義但是參數不可少。
返回值設為1 = 吃掉消息
返回值設為0 = 處理消息

希望各位有理解我在上述的鉤子說明
最後就是我很久以前玩鉤子時寫的範例,裡面有詳細說明以及範例

還有不懂得可以發話給我或是回覆問問



沒有留言:

張貼留言