前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >系统钩子

系统钩子

作者头像
用户1175783
发布2019-09-18 10:06:05
9080
发布2019-09-18 10:06:05
举报

# 系统钩子

代码语言:javascript
复制
曾经有一段时间特别迷恋外挂程序,因此有所了解,但仅限于皮毛,由于缺乏的知识太多就放弃了,最近有个私活需要用到钩子,所以重行来研究一番,其实也谈不上研究,我是一个C#程序员,本来就没有多少系统的知识(并不是每个C#程序员都是这样),使用win32 api对我来说还是有些困难的,所以不能给出多么高深的讲解,这里仅限于我是如何使用C#调用win32 api来实现系统钩子的。

什么是钩子

我不觉得自己能说清楚什么是钩子,所以我推荐大家看一些 钩子简介

项目需求:

代码语言:javascript
复制
实现一个程序来禁用所有鼠标按键,禁用任务管理器,禁用注册表等。

涉及Win32 API

  1. SetWindowsHookEx (参考 )
  2. UnhookWindowsHookEx (参考 )

代码实现

  1. 要使用钩子首先我们得有一个钩子 我的钩子代码 //定义个委托类型,因为设置钩子的时候需要这种类型的委托实现 private delegate int HookProc(int nCode,IntPtr wparam,ref IntPtr lparam); //实现HookProc委托签名的方法 private static int HookProcCallback(int nCode, IntPtr wparam, ref IntPtr lparam) { //这里可以进行消息的过滤,返回0时所有的消息都不会进入下一个钩子 return 0; }
  2. 设置钩子到系统的钩子链中 SetWindowsHookEx的定义的参数:
    1. 钩子的类型,即它处理的消息类型(比如:键盘钩子,鼠标钩子,Shell钩子等)
    2. 钩子回调函数,即接收的消息由谁处理
    3. 需要钩子拦截的程序句柄,0/null为当前进程/模块,
    4. 是否为全局钩子,如果为0则与所有线程关联,即全局钩子;否则,这个线程一定属性上一个参数对应的进程/模块

    设置钩子代码 //定义一个钩子实例 var hookProc = new HookProc(HookProcCallback); //设置钩子 hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, proc, null, 0); if(hkeyboardHook!=IntPtr.Zero){ //设置成功 }

# 完整代码

代码语言:javascript
复制
public class Hook
{
    // 设置钩子
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr SetWindowsHookEx(int idHook, HookHandlerDelegate lpfn, IntPtr hmod, uint dwThreadID);

    // 卸载钩子 
    [DllImport("user32.dll")]
    public static extern bool UnhookWindowsHookEx(IntPtr idHook);

    // 获取模块句柄
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr GetModuleHandle(String modulename);
    public const int WM_KEYDOWN = 0x0100;
    public const int WH_KEYBOARD_LL = 13;
    public const int WM_SYSKEYDOWN = 0x0104;
    public struct KBDLLHOOKSTRUCT
    {
        public int vkCode;
        public int scanCode;
        public int flags;
        public int time;
        public int dwExtraInfo;
    }
    public delegate int HookHandlerDelegate(int nCode, IntPtr wparam, ref KBDLLHOOKSTRUCT lparam);
    //钩子回掉委托实例
    private static HookHandlerDelegate proc;
    //钩子句柄
    private static IntPtr hKeyboardHook;

    private static int HookCallback(int nCode, IntPtr wparam, ref KBDLLHOOKSTRUCT lparam)
    {
        if (
            nCode >= 0
            &&
            (wparam == (IntPtr)WM_KEYDOWN
            ||
            wparam == (IntPtr)WM_SYSKEYDOWN)
            )
        {
            if (lparam.vkCode == 91 || lparam.vkCode == 164 || lparam.vkCode == 9 || lparam.vkCode == 115)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        return 0;
    }

    public static void HookStart()
    {
        if (hKeyboardHook == IntPtr.Zero)
        {
            // 创建HookProc实例 
            proc = new HookHandlerDelegate(HookCallback);
            using (Process curPro = Process.GetCurrentProcess())
            using (ProcessModule curMod = curPro.MainModule)
            {
                //定义全局钩子 
                hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, proc,GetModuleHandle(curMod.FileName), 0);
            }

            if (hKeyboardHook == IntPtr.Zero)
            {
                HookStop();
                throw new Exception("钩子设置失败");
            }
        }

    }

    public static void HookStop()
    {
        bool retKeyboard = true;
        if (hKeyboardHook != IntPtr.Zero)
        {
            retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
            hKeyboardHook = IntPtr.Zero;
        }
        if (!(retKeyboard)) throw new Exception("卸载钩子失败");

    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 系统钩子
    • # 完整代码
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档