用 VB.NET 做全局键盘鼠标钩子,了解 Hook 技术及大致过程

网安智编 厦门萤点网络科技 2026-03-14 00:10 24 0
Hook 概述: 关于Hook技术的讲解,我还没那能力讲的全面,但是大致了解的就是,它是一种监控的技术,通过挂载钩子,我们能够监控系统中的各种消息来往,以及拦截处理。甚至可以将应用程序注入进程。具体请百度,这里主要讲解如何用做全局键盘鼠标钩...

Hook 概述:

关于Hook技术的讲解,我还没那能力讲的全面,但是大致了解的就是,它是一种监控的技术,通过挂载钩子,我们能够监控系统中的各种消息来往,以及拦截处理。甚至可以将应用程序注入进程。具体请百度,这里主要讲解如何用做全局键盘鼠标钩子。

Hook的大致过程

我看了微软和各位大佬博客关于的讲解,大致的过程就是,将应用程序的定义的钩子安装 钩子链中,这个钩子链就是个链表结构,那么消息就是从这链表结构中走过去的,就好像是一条河,消息就像河里的鱼,钩子就像是打鱼的人,一条河有多个打鱼的人,但是这里有个特点,新加入的钩子有优先控制权,什么意思呢,就是新加入的钩子处于旧钩子前面,消息先经过新的钩子,就好像你新加入河边打鱼,你处于上游,所以呢,你不要的消息你得传下去,要不然后面的钩子得不到消息的,比如你会发现你勾住键盘后,不用往下传,那么后面的就没有相应的消息,微软也说了,除非你是真的不想要别人得到你的消息,否则建议往下传。钩子挂上了,具体怎么处理呢?所以这里就得假如一个钩子处理函数,就好像你有鱼了,你应该怎么煮呢?所以你会发现安装钩子的函数里有个函数地址的参数,这个函数地址,告诉系统,调用这个函数,把消息放到这里让我处理,我处理完了再给你返回去所谓的回调,即是如此了,在里用委托代替,当然用Inptr替代也可以只是稍微麻烦点。用完后记得用把钩子卸载了,不卸载就好像你占着茅坑不拉屎一样,影响别人打鱼的进度。影响系统的性能,所以建议用完卸载。

鼠标钩子控制鼠标位置_Hook技术原理讲解_vb.net全局键盘鼠标钩子

总结一下:安装钩子->送上处理函数->系统回调处理函数->传递相关参数->用户在处理函数内部处理消息->传递下个钩子->卸载钩子。

示例代码

封装一个类Hook


    Public Class Hook
		 <DllImport("kernel32")>
    Public shared Function GetModuleHandle(lpModuleName As String) As IntPtr
    End Function
        Private Const WM_KEYDOWN = &H100 '键按下
        Private Const WM_KEYUP = &H101 '键弹起
        Private Const WM_SYSKEYDOWN = &H104 '全局系统按键
        ''' 
        ''' 鼠标钩子结构体
        ''' 
        ''' 
        <StructLayout(LayoutKind.Sequential)>
        Public Structure tagMSLLHOOKSTRUCT
            Dim Pt As Point '鼠标坐标
            Dim mouseData As Integer '鼠标按键数据
            Dim flags As Integer
            Dim time As Integer
            Dim dwExtraInfo As ULong
        End Structure
        ''' 
        ''' 键盘信息
        ''' 
        ''' 
        <StructLayout(LayoutKind.Sequential)>
        Public Structure tagKBDLLHOOKSTRUCT
            Dim vkCode As Keys '虚拟按键代码
            Dim scanCode As Keys  '硬件键盘代码
            Dim flags As Integer
            Dim time As Integer '消息时间
            Dim dwExtraInfo As ULong
        End Structure
        '''