VB.net中HOOK的應用(一)
2024-07-10 13:00:44
供稿:網友
本文不是講解hook原理的文章,僅是討論一下在vb.net如何調用hook功能,以及vb.net中api使用的變化問題。
由于hook種類較多,本文中以最常用的鍵盤hook為例進行分析。
一、先來看一下在vb中是如何實現的。截的是空格鍵。表現的目標是:一個form,上面有一個textbox,不管焦點是否落在textbox里,按空格鍵,不會在textbox中輸入一個空格,而是變成在textbox中寫入一句話:“hook成功!”
1.在一個module中寫入下列代碼:
調用的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
函數說明:本函數是用于啟動hook設置。
idhook是hook的類型,即處理的消息類型。
lpfn是hook子程(函數或過程)的地址指針。如果dwthreadid參數為0或是一個由別的進程創建的線程的標識,lpfn必須指向dll中的hook子程。除此以外,lpfn可以指向當前進程的一段hook子程代碼(我們利用的就是這個性質)。
hmod是應用程序實例的句柄,標識包含lpfn所指的子程的dll。如果dwthreadid 標識當前進程創建的一個線程,而且子程代碼位于當前進程,hmod必須為null。
dwthreadid是與安裝hook子程相關聯的線程的標識符,如果為0,hook子程與所有的線程關聯。 返回值:函數成功則返回hook子程的句柄,失敗返回null。
declare function unhookwindowshookex lib "user32" (byval hhook as long) as long
函數說明: 本函數是解除hook之用。hhook是hook函數的句柄。
declare function callnexthookex lib "user32" (byval hhook as long, byval ncode as long, byval wparam as long, lparam as any) as long
函數說明:本函數的作用是將當前hook鏈中的hook信息傳遞給下一個hook。
hhook是當前hook的句柄,一個應用程序接收這個句柄,作為先前調用setwindowshookex函數的結果。
ncode指的是傳遞到當前hook過程的hook代碼,下一個hook過程使用這段代碼去決定如何處理hook信息。
wparam指傳遞給當前hook過程的wparam值,它的具體含義是由當前hook鏈中的相關hook的類型決定的。
lparam指傳遞給當前hook過程的lparam值,它的具體含義是由當前hook鏈中的相關hook的類型決定的。
2. 定義的常量是:
public hnexthookproc as long
public const wh_keyboard = 2 ‘這個是表明hook的種類是鍵盤hook
public const pm_key_space = &h20 ‘空格鍵
3.代碼段
public sub unhookkbd() ‘解鍵盤hook函數
if hnexthookproc <> 0 then
unhookwindowshookex hnexthookproc
hnexthookproc = 0
end if
end sub
public function enablekbdhook() ‘設置鍵盤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
‘加入自己的代碼,用于表明響應
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
打完收工!現在在form窗體狀態下,敲空格鍵,就會響應你在mykbhfunc函數中寫的代碼了。