c#键盘钩子详解

一、hook的概念及c#中的实现

1、hook在操作系统中是一个用于拦截系统消息和通知的机制。使用c#实现hook的方式有多种,其中最为常用的就是使用Windows API中的SetWindowsHookEx函数。

//声明SetWindowsHookEx函数  
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]  

//设置钩子  
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

//取消钩子  
private static extern bool UnhookWindowsHookEx(int idHook);  

//调用下一个钩子   
private static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

//定义委托  
private delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

//钩子指针  
private int hHook;

//钩子处理函数  
private int HookCallback(int nCode, IntPtr wParam, IntPtr lParam){  
   if (nCode >= 0){  
      Keys key = (Keys)wParam;  
      MessageBox.Show(key.ToString());  
   }  
   return CallNextHookEx(hHook, nCode, wParam, lParam);  
}

//启动钩子  
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, new HookProc(HookCallback), Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);

2、上面代码中的WH_KEYBOARD_LL表示keyboard hook,而其中的GetHINSTANCE函数和GetExecutingAssembly函数获取程序集中第一个模块的HINSTANCE以及程序集信息的方法,则是用于在钩子被取消时卸载钩子。

二、hook的使用范例

1、Hook可以被用于很多地方,以下实例是在邮箱登录界面中使用hook拦截用户密码等敏感信息:

//邮箱登录窗口类  
public partial class LoginForm : Form{  
    private int hHook;//钩子句柄  
    private static HookProc HookCallback;//钩子处理函数  
    private const int WH_CALLWNDPROC = 4;//Hook类型  
    private const int WM_KEYDOWN = 0x100;  
    private const int WM_KEYUP = 0x101;  
    private const int WM_SYSKEYDOWN = 0x104;  
    private const int WM_SYSKEYUP = 0x105;  
    public LoginForm(){  
        InitializeComponent();  
    }  
    private void LoginForm_Load(object sender, EventArgs e){  
        //启动钩子  
        HookCallback = new HookProc(FormHookProc);  
        hHook = SetWindowsHookEx(WH_CALLWNDPROC, HookCallback, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);  
    }  
    private void LoginForm_FormClosing(object sender, FormClosingEventArgs e){  
        //取消钩子  
        UnhookWindowsHookEx(hHook);  
    }  
    private int FormHookProc(int nCode, IntPtr wParam, IntPtr lParam){  
        if (nCode >= 0){  
            CallWndStruct cws = (CallWndStruct)Marshal.PtrToStructure(lParam, typeof(CallWndStruct));//获取消息结构体  
            Message? m = cws.message;//获取消息  
            if (m != null && (m.Value.Msg == WM_KEYDOWN || m.Value.Msg == WM_KEYUP || m.Value.Msg == WM_SYSKEYDOWN || m.Value.Msg == WM_SYSKEYUP)){  
                //获取按键值名称  
                string kstr = ((Keys)((int)m.Value.WParam)).ToString();  
                if ((kstr == "Enter" || kstr == "Return") && m.Value.Msg == WM_KEYDOWN){//如果是回车键,且是按下状态,则获取密码文本框中内容  
                    string pwd = this.password.Text.Trim();  
                    MessageBox.Show(pwd);//输出密码  
                }  
            }  
        }  
        return CallNextHookEx(hHook, nCode, wParam, lParam);  
    }  
}  

三、hook的危险性 & 安全建议

1、由于hook具有拦截系统消息和通知的机制,因此如果恶意程序使用hook,便可以窃取用户的输入信息,具有非常大的危险性。

2、使用hook需要谨慎,一般只用于开发调试、性能分析和系统管理等方面,而在用户场合则应禁止匿名用户使用hook,同时,不要随意安装任何第三方软件,以免被植入hook,造成个人信息泄露和安全问题。

四、小结

1、本文详细介绍了hook的概念和使用方式,以及hook的安全建议,通过对hook的了解和使用,可以更好地开发c#程序,同时了解如何防止hook被恶意程序利用。

2、在使用hook的过程中应该遵循安全建议,以防信息泄露造成不必要的损失。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/248142.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:25
下一篇 2024-12-12 13:25

相关推荐

  • 键盘如何启动运行

    键盘作为计算机的一部分,是输入设备的代表,具有启动运行的至关重要作用。本文将分多个方面详述键盘如何启动运行。 一、键盘的连接方式 键盘的连接方式有2种:一种是通过PS/2口连接,另…

    编程 2025-04-29
  • 如何用python键盘控制角色

    本文将从多个方面详细阐述如何用python键盘控制角色。 一、安装pygame库 首先我们需要安装pygame库,它是基于SDL库的Python多媒体库,用于开发2D游戏和多媒体应…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • Python接收键盘按键的方法用法介绍

    对于编程开发而言,常常需要获取用户输入,Python自然也不例外。Python提供了多种方式接收键盘按键,本文将从以下几个方面进行详细阐述: 一、基础方法 Python中最基础也是…

    编程 2025-04-28
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25

发表回复

登录后才能评论