加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

浅议Visual Basic.NET中HOOK的应用

发布时间:2020-12-16 23:13:46 所属栏目:大数据 来源:网络整理
导读:本文不是讲解Hook原理的文章,仅是讨论一下在vb.net如何调用Hook功能,以及vb.net中API使用的变化问题。 由于Hook种类较多,本文中以最常用的键盘Hook为例进行分析。 一、先来看一下在vb中是如何实现的 截的是空格键。表现的目标是:一个form,上面有一个tex

本文不是讲解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 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 EnableKBDHookEnd SubPrivate Sub Form_Unload(Cancel As Integer) Call UnHookKBDEnd Sub

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读