Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >系统钩子

系统钩子

作者头像
用户1175783
发布于 2019-09-18 02:06:05
发布于 2019-09-18 02:06:05
1K00
代码可运行
举报
运行总次数:0
代码可运行

# 系统钩子

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

什么是钩子

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

项目需求:

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

涉及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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ElasticSearch 6.x 学习笔记:33.Java API之指标聚合
https://www.elastic.co/guide/en/elasticsearch/client/java-api/6.1/java-aggs.html To build aggregation requests, use AggregationBuilders helpers. Just import them in your class:
程裕强
2022/05/06
2980
ElasticSearch AggregationBuilders java api常用聚会查询
以球员信息为例,player索引的player type包含5个字段,姓名,年龄,薪水,球队,场上位置。 index的mapping为:
小勇DW3
2019/12/31
4.1K0
使用Java操作Elasticsearch(Elasticsearch的java api使用)
1、Elasticsearch是基于Lucene开发的一个分布式全文检索框架,向Elasticsearch中存储和从Elasticsearch中查询,格式是json。
别先生
2019/10/23
11.6K0
使用Java操作Elasticsearch(Elasticsearch的java api使用)
ElasticSearch java API - 聚合查询
以球员信息为例,player索引的player type包含5个字段,姓名,年龄,薪水,球队,场上位置。
林老师带你学编程
2019/05/25
2.2K0
ElasticSearch入门之彼行我释(四)
散仙在上篇文章中,介绍了关于ElasticSearch基本的增删改查的基本粒子,本篇呢,我们来学下稍微高级一点的知识: (1)如何在ElasticSearch中批量提交索引 ? (2)如何使用高级查询(包括,检索,排序,过滤,分页) ? (3)如何组合多个查询 ? (4)如何使用翻页深度查询 ? (5)如何使用基本的聚合查询 ? (一)首先,我们思考下,为什么要使用批量添加,这个毫无疑问,因为效率问题,举个在生活中的例子,假如我们有50个人,要去美国旅游,不使用批处理的方式是,给每一个
我是攻城师
2018/05/11
9360
java api使用ElastichSearch指南
比如想要addr是beijing的,同时必须满足条件:name是 paxi,或者,phoneNumber是 1234567890
爬蜥
2019/07/09
1.5K0
ElasticSearch入门
    全文搜索属于最常见的需求,开源的 Elasticsearch是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。 ElasticSearch 的底层是开源库 Lucene,Elasticsearch 是 Lucene 的封装,它提供了 REST API 的操作接口,开箱即用。
Java架构师必看
2021/05/14
1.3K0
ElasticSearch之Java Api聚合分组实战
最近有个日志收集监控的项目采用的技术栈是ELK+JAVA+Spring,客户端语言使用的是Java,以后有机会的话可以试一下JavaScript+Nodejs的方式,非常轻量级的组合,只不过不太适合服务化的工程,Kibana充当可视化层,功能虽然非常强大和灵活,但是需要业务人员懂Lucene的查询语法和Kibana的Dashboard仪表盘自定义功能才能玩的转,所以Kibana面向专业的开发人员和运维人员比较良好,但面向业务人员则稍微有点难度,我们这边就使用Java进行二次开发,然后前端定义几个业务人员关注
我是攻城师
2018/05/14
2.2K0
elasticsearch实践之代码结构设计
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linzhiqiang0316/article/details/81192994
林老师带你学编程
2019/05/26
1.2K0
elasticsearch的restful API和Java API
本人现在使用的是elasticsearch 5.2.1的,服务器IP为192.168.5.182.所以在Java API和jar包中会有所不同.
算法之名
2019/08/20
2.1K0
万字长文:详解 Spring Boot 中操作 ElasticSearch
ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多员工能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 语言开发的,并作为 Apache 许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
程序员小强
2020/04/15
3.2K0
【Elasticsearch】聚合分析
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
陶然同学
2023/02/24
9560
【Elasticsearch】聚合分析
ElasticSearch 6.x 学习笔记:22.桶聚合
https://www.elastic.co/guide/en/elasticsearch/reference/6.1/search-aggregations-bucket.html 在页面右下角可以看到各类具体的Bucket聚合连接
程裕强
2022/05/06
9370
ElasticSearch 6.x 学习笔记:22.桶聚合
ES聚合操作
shengjk1
2025/05/16
560
elasticsearch使用指南之桶聚合(Bucket)上篇
Buket Aggregations(桶聚合)不像metrics Aggregations(度量聚合)那样计算字段上的度量,而是创建文档桶,每个文件桶有效地定义一个文档集。除了bucket本身之外,bucket聚合还计算并返回“落入”每个bucket的文档的数量。
丁威
2019/06/10
6.7K1
【第十三篇】商城系统-商城检索服务
  商品检索页面我们放在search服务中处理,首页我们需要在mall-search服务中支持Thymeleaf。添加对应的依赖
用户4919348
2022/10/04
1.4K0
【第十三篇】商城系统-商城检索服务
SpringBoot2.2.X整合ElasricSearch7.8
这里默认大家已经掌握es基础语法 es版本为7.8 pom <!--引入es-high-level-client的坐标--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.8.0</version>
暴躁的程序猿
2022/07/12
2880
Elasticsearch项目实战,商品搜索功能设计与实现!
在SpringBoot中使用Elasticsearch本文不再赘述,直接参考《mall整合Elasticsearch实现商品搜索》即可。这里需要提一下,对于需要进行中文分词的字段,我们直接使用@Field注解将analyzer属性设置为ik_max_word即可。
macrozheng
2020/04/24
3.9K0
es_分组-分页-TransportClient实现
Elasticsearch Java API 有四种实现方式:分别是 TransportClient、RestClient、Jest、Spring Data Elasticsearch。 本文使用第一种方式,也就是 TransportClient 的方式进行实现。想要了解其他三种的方式可以看一下这篇文章:https://blog.csdn.net/qq_3331...
伍六七AI编程
2019/10/08
1.2K0
elasticsearch[四]-数据聚合排序查询、搜索框自动补全、数据同步、集群
**聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如:
汀丶人工智能
2024/01/17
5650
elasticsearch[四]-数据聚合排序查询、搜索框自动补全、数据同步、集群
相关推荐
ElasticSearch 6.x 学习笔记:33.Java API之指标聚合
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验