全面解析VB.NET HOOK功能
在網(wǎng)上收集了大量的資料,但是這里還是不對(duì)原理進(jìn)行分析,我們只是就調(diào)用VB.NET HOOK功能,以及vb.net中API使用的變化問題。由于VB.NET HOOK功能較多,本文中以最常用的鍵盤Hook為例進(jìn)行分析。
#T#先來看一下在vb中是如何實(shí)現(xiàn)的。截的是空格鍵。表現(xiàn)的目標(biāo)是:一個(gè)form,上面有一個(gè)textbox,不管焦點(diǎn)是否落在textbox里,按空格鍵,不會(huì)在textbox中輸入一個(gè)空格,而是變成在textbox中寫入一句話:“HOOK成功!”
1.在一個(gè)Module中寫入下列代碼:
調(diào)用的API的申明:
- 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
函數(shù)說明:本函數(shù)是用于啟動(dòng)Hook設(shè)置。
idHook是Hook的類型,即處理的消息類型。
Lpfn是Hook子程(函數(shù)或過程)的地址指針。如果dwThreadId參數(shù)為0或是一個(gè)由別的進(jìn)程創(chuàng)建的線程的標(biāo)識(shí),lpfn必須指向DLL中的Hook子程。除此以外,lpfn可以指向當(dāng)前進(jìn)程的一段Hook子程代碼(我們利用的就是這個(gè)性質(zhì))。
hMod是應(yīng)用程序?qū)嵗木浔?,?biāo)識(shí)包含lpfn所指的子程的DLL。如果dwThreadId 標(biāo)識(shí)當(dāng)前進(jìn)程創(chuàng)建的一個(gè)線程,而且子程代碼位于當(dāng)前進(jìn)程,hMod必須為NULL。dwThreadId是與安裝Hook子程相關(guān)聯(lián)的線程的標(biāo)識(shí)符,如果為0,Hook子程與所有的線程關(guān)聯(lián)。 返回值:函數(shù)成功則返回Hook子程的句柄,失敗返回NULL。
- Declare Function UnHookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
函數(shù)說明: 本函數(shù)是解除Hook之用。hHook是Hook函數(shù)的句柄。
- Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
函數(shù)說明:本函數(shù)的作用是將當(dāng)前Hook鏈中的Hook信息傳遞給下一個(gè)Hook。
hHook是當(dāng)前Hook的句柄,一個(gè)應(yīng)用程序接收這個(gè)句柄,作為先前調(diào)用SetWindowsHookEx函數(shù)的結(jié)果。
nCode指的是傳遞到當(dāng)前Hook過程的Hook代碼,下一個(gè)Hook過程使用這段代碼去決定如何處理Hook信息。
wParam指傳遞給當(dāng)前Hook過程的wParam值,它的具體含義是由當(dāng)前Hook鏈中的相關(guān)Hook的類型決定的。
lParam指傳遞給當(dāng)前Hook過程的lParam值,它的具體含義是由當(dāng)前Hook鏈中的相關(guān)Hook的類型決定的。
2. 定義的常量是:
- Public hnextHookproc As Long
- Public Const WH_KEYBOARD = 2 ‘這個(gè)是表明Hook的種類是鍵盤Hook
- Public Const PM_KEY_SPACE = &H20 ‘空格鍵
3.VB.NET HOOK功能代碼段
- Public Sub UnHookKBD()‘解鍵盤HOOK函數(shù)
- If hnextHookproc <> 0 Then
- UnHookWindowsHookEx hnextHookproc
- hnextHookproc = 0
- End If
- End Sub
- Public Function EnableKBDHook() ‘設(shè)置鍵盤HOOK
- If hnextHookproc <> 0 Then
- Exit Function
- End If
- hnextHookproc = SetWindowsHookEx(WH_KEYBOARD, AddressOf _
- MyKBHFunc, App.hInstance, 0)
- If hnextHookproc <> 0 Then
- EnableKBDHook = hnextHookproc
- End If
- End Function
- Public Function MyKBHFunc(ByVal iCode As Long, _
- ByVal wParam As Long, ByVal lParam As Long) As Long
- MyKBHFunc = 0
- If iCode < 0 Then
- MyKBHFunc = CallNextHookEx(hnextHookproc, iCode, wParam, lParam)
- Exit Function
- End If
- If wParam = PM_KEY_SPACE Then ''偵測 有沒有按到空格鍵
- MyKBHFunc = 1
- ‘加入自己的代碼,用于表明響應(yīng)
- form1.text1.text=”Hook成功!”
- End If
- End Function
4.在Form中的代碼很簡單:
- Private Sub Form_Load()
- Call EnableKBDHook
- End Sub
- Private Sub Form_Unload(Cancel As Integer)
- Call UnHookKBD
- End Sub