,欢迎访问网页设计爱好者web开发。本文不是讲解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函数中写的代码了。