国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

VB編程中鉤子的實現及應用

2024-07-21 02:25:34
字體:
來源:轉載
供稿:網友
 前言

  windows系統中鉤子具有相當強大的功能,通過這種技術可以對幾乎所有的windows 系統中的消息進行攔截、監視、處理。這種技術可以廣泛應用于各種軟件,尤其是需要有監控、自動記錄等對系統進行監測功能的軟件。本文針對這個專題進行了探討,希望可以為讀者朋友們起到拋磚引玉的作用。

  一、鉤子的機制及類型

  windows的應用程序都是基于消息驅動的,應用程序的操作都依賴于它所得到的消息的類型及內容。鉤子與dos中斷截獲處理機制有類似之處。鉤子(hook)是windows消息處理機制的一個平臺,通過安裝各種鉤子,應用程序可以在上面設置子程序以監視指定窗口的某種消息,并且當消息到達目標窗口之前處理它。

  在windows中,鉤子有兩種,一種是系統鉤子(remotehook),它對消息的監視是整個系統范圍,另一種是線程鉤子(localhook),它的攔截范圍只有進程內部的消息。對于系統鉤子,其鉤子函數(hookfunction)應在windows系統的動態鏈接庫(dll)中實現,而對于線程鉤子來說,鉤子函數可以在dll之中實現,也可以在相應的應用程序之中實現。這是因為當開發人員創建一個鉤子時,windows先在系統內存中創建一個數據結構,該數據結構包含了鉤子的相關信息,然后把該結構體加到已經存在的鉤子鏈表中去,并且新的鉤子將排在老的鉤子的前面。當一個事件發生時,如果安裝的是一個局部鉤子,當前進程中的鉤子函數將被調用。如果是一個遠程鉤子,系統就必須把鉤子函數插入到其它進程的地址空間,要做到這一點就要求鉤子函數必須在一個動態鏈接庫中,所以如果想要使用遠程鉤子,就必須把該鉤子函數放到動態鏈接庫中去。對于鉤子所監視的消息類型來說,windws一共提供了如下幾種類型:如表1所示:

表一、windows消息類型







消息類型常量標識

消息類型
適用范圍

wh_callwndproc
4
發給窗口的消息
線程或系統

wh_callwndprocret
12
窗口返回的消息
線程或系統

wh_cbt
5
窗口變化、焦點設定等消息
線程或系統

wh_debug
9
是否執行其它hook的hook
線程或系統

wh_foregroundidle
11
前臺程序空閑
線程或系統

wh_getmessage
3
投放至消息隊列中的消息
線程或系統

wh_journalplayback
1
將所記載的消息進行回放
系統

wh_journalrecord
0
監視并記錄輸入消息
系統

wh_keyboard
2
鍵盤消息
線程或系統

wh_mouse
7
鼠標消息
線程或系統

wh_msgfilter
-1
菜單滾動條、對話框消息
線程或系統

wh_shell
10
外殼程序的消息
線程或系統

wh_sysmsgfilter
6
所有線程的菜單滾動條、對話框消息
系統



  二、vb編程中鉤子的實現

  (一)鉤子函數(hook function)的格式。hook function實際上是一個函數,如果是系統鉤子,該函數必須放在動態鏈接庫中。該函數有一定的參數格式,在vb中如下:

private function hookfunc(byval ncode as long,byval wparam as long,byval lparam as long)as long



  其中,ncode代表是什么情況之下所產生的鉤子,隨鉤子的不同而有不同組的可能值;參數wparam,lparam傳回值包括了所監視到的消息內容,它隨hook所監視消息的種類和ncode的值不同而不同。對于用vb所設置的鉤子函數,一般的框架形式如下:

private function hookfunc(byval ncode as long,byval wparam as long,byval lparam as long)as long
 select case of ncode
  case ncode<0:hookfunc=callnexthookex(hhookfunc,ncode,wparam,lparam)
  case值1:處理過程1:hookfunc=x1
  case2:處理過程2:hookfunc=x1
  ……
 end select
end function



  函數的傳回值,如果消息要被處理,則傳0,否則傳1,吃掉消息。

  (二)鉤子的安裝及執行。鉤子的安裝要用到幾個api函數:可以使用api函數setwindowshookex()把一個應用程序定義的鉤子子程安裝到鉤子鏈表中。setwindowshookex()函數的聲明如下:

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



  idhook值為它處理的消息類型;lpfn值為鉤子子程序的地址指針。如果dwthreadid參數為0或是一個由別的進程創建的線程的標識,lpfn必須指向dll中的鉤子子程。除此以外,lpfn可以指向當前進程的一段鉤子子程代碼。hmod值為應用程序的句柄,標識包含lpfn所指的子程的dll。如果dwthreadid標識當前進程創建的一個線程,而且子程代碼位于當前進程,hmod必須為0。dwthreadid值為與安裝的鉤子子程相關聯的線程的標識符,如果為0,鉤子子程與所有的線程關聯。鉤子安裝成功則返回鉤子子程的句柄,失敗返回0。

  另外,一般應在鉤子子程中調用callnexthookex()函數以執行鉤子鏈表所指的下一個鉤子子程,否則安裝了別的鉤子的應用程序就會收不到鉤子通知,從而產生錯誤的結果。callnexthookex()函數的聲明如下:

declare function callnexthookex lib"user32" alias "callnexthookex"(byval hhook as long,byval ncode as lonog, byval wparam as long,lparam as any)as long



  hhook值是setwindowshookex()的傳回值,ncode、wparam、lparam則是hook函數中的三個參數。在程序終止之前,必須調用unhookwindowshookex()函數釋放與鉤子關聯的系統資源。unhookwindowsex()函數聲明如下:

declare function unhook windowshookex lib "user32" alias "unhook windowshookex(byval hhook as long)as long



  hhook為安裝鉤子時的返回值,即鉤子子程的句柄。

  (三)vb中鉤子安裝應注意的問題。lpfn參數是一個hookfunc的地址,vb規定必須將hookfunc代碼放到標準的.bas模塊中,并以"address of hookfunc"傳入,而不可以將其放到類模塊中,也不能將其附加到窗體上。而對于remotehook來說,hookfunc應包含在動態鏈接庫中,因此如果在vb中使用remotehook,則還要用到getmodulehandle()、getprocaddress()兩個api函數,它們的聲明如下:

declare function getmodulehandle lib"kernel32" alias "getmodulehandlea"(byval lpmodulename as string)as long
declare function getprocaddress lib "kernel32" alias "getprocaddress"(byval hmodule as long,byval lpprocname as string)as long



  hmod值是含鉤子過程的模塊名柄,如果是localhook,該值可以是null(vb中傳0),而如果是remotehook,則可以使用getmodulehandle("名稱.dll")來傳入。
三、實例--鍵盤消息的攔截

  在程序開發時常用的有對輸入消息進行監視的鍵盤鉤子,對于所監視到的消息應進行處理,下面對鍵盤鉤子參數的具體內容組成進行說明:

  如果有鍵盤消息(wm_keyup或wm_keydown)將被處理時,則系統調用鍵盤鉤子。

  ncode為hc_action或hc_noremove,若小于0,則要求處理函數向下傳遞該消息。

  wparam表示按鍵鍵碼常數,a鍵到z鍵與其ascii碼的相應值'a'到'z'是一致的,例如按c鍵,則wparam值為67。

  lparam與wm_keydown同,占四個字節,其包括的內容較多,其二進制結構如下:

0
1
……
15
16
………
23
24
25
……
28
29
30
31



  0-15位(key repeat count),鍵碼重復次數。16-23位(scan code),按鍵的掃描碼。24位(extended_key flag),擴展鍵(功能鍵、數字小鍵盤上的鍵)標志,為1則是擴展鍵,否則為0。25-28位被保留。29位(context code),狀態描述碼,alt鍵被按下則為1,否則為0。30位(previouskey_stateflag)指定先前的鍵狀態,如果消息被發出之前鍵處于按下狀態,則為1;鍵處于釋放狀態則為0。31位(transiton_stateflag)狀態轉換標志,如果鍵是被按下值為1,如果鍵被放開值為0。

  本例中的鉤子用來監視并記錄應用程序中的按鍵信息。在程序中,alt+f4組合鍵被屏蔽。下面是部分代碼:

public hhook as long
private sub form_load()′程序啟動時安裝鉤子
hhook=setwindowshookex(2,address of mykbhook,0,app.threadid)
end sub
′具體的鉤子程序,本例中該過程被包含在module1中
public function mykbhook(byval ncode as long,byval wparam as long,byval lparam as long)as long
if ncode>=0 then
open "c:/keyfile.txt" for append as #1 '將鍵盤的操作記錄在keyfile.txt文件之中
'記錄所操作的鍵、操作時間、日期操作時的按鍵狀態,用16進制記錄
write #1,wparam,hex(lparam),date,time
close #1
mykbhook=0 '表示要處理這個消息
'屏蔽alt+f4組合鍵
if wparam=115 and(lparam and&h20000000)<>0 then
if(lparam and &hc000000)=0 then  '是否進行alt+f4操作
myhbhook=1 '鉤子吃掉這個消息
end if
end if
end if
call callnexthookex(hhook,ncode,wparam,lparam)'將消息傳給下一個鉤子
end function
'程序退出時卸載鉤子
private sub form_unload(cancel as interger)
call unhook windowshookex(hhook)
end sub



  四、總結

  鉤子處理程序是windows高級編程技術,一般程序員都使用vc++等程序設計工具實現,本文表明,對于vb來說,雖然很多人認為是非專業的設計工具,但實現鉤子這樣的高級技術也是非常方便的。另外在使用鉤子時應注意到,鉤子雖然功能比較強,但如果使用不當將會嚴重影響系統的效率,所以要盡量避免使用系統鉤子,并且在不用鉤子時,應將鉤子及時卸載。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 白银市| 景德镇市| 韩城市| 阿拉善左旗| 灵武市| 西丰县| 裕民县| 九龙坡区| 霍州市| 聊城市| 南平市| 当涂县| 淅川县| 调兵山市| 定襄县| 泌阳县| 洮南市| 尉犁县| 夏邑县| 韩城市| 育儿| 栖霞市| 台湾省| 资源县| 伊宁市| 甘谷县| 宜君县| 内江市| 玉林市| 衢州市| 互助| 聂拉木县| 宝兴县| 多伦县| 庄浪县| 故城县| 深水埗区| 莒南县| 重庆市| 彝良县| 三明市|