首页 > 编程 > .NET > 正文

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函数中写的代码了。




发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表