首页 > 编程 > .NET > 正文

vb.net如何调用Hook

2024-07-10 13:07:10
字体:
来源:转载
供稿:网友
,欢迎访问网页设计爱好者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函数中写的代码了。

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