windows HOOK学习(一)

了解HOOK

    • 一:HOOK是什么?
    • 二:HOOK的分类
    • 三:HOOK的原理?
    • 四:为什么全局钩子HOOK必须写到DLL中?
    • 五:HOOK的类型

一:HOOK是什么?

hook就是我们平时听到的钩子,它其实就是windows操作系统中的一种消息处理机制。

windows的消息在到达窗口处理函数之前,钩子(hook)可以提前获取这些消息(鼠标、键键盘,窗口移动等等消息),所以当我们获取到这些消息后,我们就可以把我们想做的事情,或者说要处理的某些逻辑放在钩子中。

所以:钩子实际上就是一段消息处理的程序段,通过系统调用,将程序段(钩子函数)挂入系统。每当特定的消息发出,在没有到达目的窗口之前,钩子程序就先捕获改消息,就是钩子函数先一步得到控制权。在这里插入图片描述

二:HOOK的分类

  • 进程内钩子:最对当前进程起作用
  • 全局钩子:对系统所有的进程起作用。也是最强大,也最常用的。但是全局钩子函数必须放在独立的动态链接库(DLL)中。至于为什么,后面我们会解释一下。

三:HOOK的原理?

任何一个钩子都有系统维护一个指针链表(钩子链);其中每个指针指向每个钩子的的处理函数。这个钩子链类似链表的头插:最后安装的钩子放在链表的开始,当监视的消息出现时,系统从链表的第一个钩子开始调用处理函数。

下面简单说下钩子安装,卸载用的API:

  • 安装钩子:SetWindowsHookEx()
  • 卸载钩子:UnhookWindowsHookEx()
  • 钩子传递(调用下一个钩子):CallNextHookEx()

这些函数具体的返回值,参数类型可以参考微软文档,后期我实现简单的例子的时候,会具体说说每个参数的作用。

四:为什么全局钩子HOOK必须写到DLL中?

先说一下DLL:
动态链接库文件(DLL)里面存放的各类程序的函数的实现过程,当程序需要调用函数时先载入DLL,取得函数的地址,然后进行调用。使用DLL的好处就是不需要再程序运行的开始前就要加载所有代码,只需在程序要用某个函数时,从DLL中取出得到这个函数地址,进行调用就行。

当多个进程共享一个DLL时,其实内存中只保留了一个分dll代码,而每个进程调用dll的带出函数是是在单独在自己进程的堆栈上分配空间的,也就是说:每个调用DLL的进程单独保留自己用到的数据。所谓的多进程共享其实就在内存中保留dll代码的空间内“做文章”,如多个进程共享一个dll时,使用LoadLibrary和GetProcAddress得到的地址是一样的,也说明内存中保留一份dll,每个进程共享dll

如果希望更加详细的了解动态库的原理,参考这篇大神的博客:多进程共享动态链接库的原理

【总结一下:】
全局钩子是对所有进程起作用,所有的GUI线程要调用钩子函数的时候。那如果全局钩子不做成一个共享的DLL。所有的进程都要加载一次钩子函数的代码到自己进程中,那属实浪费空间。所以钩子函数做成一个dll,在内存中只保留一份代码。

举个例子:
比如某流氓软件PP.exe 写了钩子函数HOOK_PassWord(),当我们运行微信.exe 输入密码时,HOOK_PassWord()要被成功执行,系统就得把函数实现加载到内存中去,如果钩子函数写在PP.exe 难不成系统要再把PP.exe 再加载一遍到内存中么? 既费内存,又引入了风险。DLL的优势就是模块化,随用随加载。

五:HOOK的类型

在这里插入图片描述
常见Hook技术介绍:

  • Inline Hook:
    API函数都保存在操作系统提供的DLL文件中,当在程序中调用某个API函数并运行程序后,程序会隐式地将API函数所在的DLL文件加载入内存中,这样,程序就会像调用自己的函数一样调用API。Inline Hook这种方法是在程序流程中直接进行嵌入jmp指令来改变流程的。
    Inline Hook流程
    1:构造跳转指令。
    2:在内存中找到欲Hook函数地址,并保存欲Hook位置处的前5字节。
    3:将构造的跳转指令写入需Hook的位置处。
    4:当被Hook位置被执行时会转到自己的流程执行。
    5:如果要执行原来的流程,那么取消Hook,也就是还原被修改的字节。
    6:执行原来的流程。
    7:继续Hook住原来的位置

  • 导入地址表钩子-IAT HOOK
    导入地址表是PE文件结构中的一个表结构。在可执行文件中使用其他DLL可执行文件的代码或数据,成为导入或者输入。当PE文件需要运行时,将被系统加载至内存中,此时windows加载器会定位所有的导入的函数或者数据将定位到的内容填写至可执行文件的某个位置供其使用。这个地位是需要借助于可执行文件的导入表来完成的。导入表中存放了所使用的DLL的模块名称及导入的函数名称或函数序号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/140529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCA(主成分分析)数据降维技术代码详解

引言 随着大数据时代的到来,我们经常会面临处理高维数据的问题。高维数据不仅增加了计算复杂度,还可能引发“维度灾难”。为了解决这一问题,我们需要对数据进行降维处理,即在不损失太多信息的前提下,将数据从高维空间…

NFTScan | 11.06~11.12 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2023.11.06~ 2023.11.12 NFT Hot News 01/ 《辛普森一家》提及 NFT 及区块链,相关 NFT 地板价涨至 0.35 ETH 11 月 6 日,据 Coindesk 报道,美国时间周…

thinkphp8 数据库的连接

账号:root 密码:自己设置 http://localhost:888/index.php当出现这个并且能登陆就算成功了。 回到项目config/database.php .env 里面(如果已经.example.env 改成了.env,则改下边,db_name改成你的数据库表名) 多个…

HTTP服务器——tomcat的安装和使用

文章目录 前言下载tomcattomcat 文件bin 文件夹conf 文件lib 文件log 文件temp 文件webapps 文件work 目录 如何使用 tomcat 前言 前面我们已经学习了应用层协议 HTTP 协议和 HTTP 的改进版——HTTPS,这些协议是我们在写与服务器相关的代码的时候息息相关的&#x…

STM32两轮平衡小车原理详解(开源)

一、引言 关于STM32两轮平衡车的设计,我想在读者阅读本文之前应该已经有所了解,所以本文的重点是代码的分享和分析。至于具体的原理,我觉得读者不必阅读长篇大论的文章,只需按照本文分享的代码自己亲手制作一辆平衡车&#xff0c…

响应式摄影科技传媒网站模板源码带后台

模板信息: 模板编号:540 模板编码:UTF8 模板颜色:黑白 模板分类:摄像、婚庆、家政、保洁 适合行业: 模板介绍: 本模板自带eyoucms内核,无需再下载eyou系统,原创设计、手…

[WSL] 安装hive3.1.2成功后, 使用datagrip连接失败

org.apache.hadoop.ipc.RemoteException:User: xxx is not allowed to impersonate anonymous 下载driver-hive-jdbc-3.1.2-standalone 解决 修改hadoop 配置文件 etc/hadoop/core-site.xml,加入如下配置项 <property><name>hadoop.proxyuser.你的用户名.hosts…

跨越编程界限:C++到JavaSE的平滑过渡

JDK安装 安装JDK 配置环境变量&#xff1a; Path 内添加 C:\Program Files\Java\jdk1.8.0_201\bin 添加 JAVA_HOME C:\Program Files\Java\jdk1.8.0_201 添加 CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 第一个Java程序 HelloWorld.java public class…

Linux之gdb

gdb就是一个Linux的调试工具&#xff0c;类似与vs里面的调试 可执行程序也有格式&#xff0c;不是简单的二进制堆砌

Excel函数-将A1中的字符串剔除B1中的字符串

比如A2中是类型单位&#xff0c;B2中是单位&#xff0c;在C2中体现A2-B2的结果&#xff0c;即大米 公式&#xff1a;SUBSTITUTE(A2,B2,“”) SUBSTITUTE函数功能&#xff1a;将字符串中的部分字符用新字符替换&#xff0c;替换序号忽略说明进行全部替换 结构&#xff1a;SUB…

SSM德庆县乡村教育图书管理系统-计算机毕设 附源码 24668

SSM德庆县乡村教育图书管理系统 摘 要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在德庆县乡村教育图书管理的要求下&…

23种设计模式 - 模板方法模式

1. 认识模板方法模式 1.1 模式定义 定义一个操作算法中的框架&#xff0c;而将这些步骤延迟加载到子类中。 它的本质就是固定算法框架。 1.2 解决何种问题 让父类控制子类方法的调用顺序 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 1.3…

Unity中Shader光照探针的支持

文章目录 前言一、光照探针用在哪怎么用1、光照探针的应用场景2、我们按照以上条件&#xff0c;在Unity中搭建一个相同的环境3、创建光照探针 二、在我们自己的Shader中&#xff0c;实现支持光照探针1、使用常用的 cginc2、在 v2f 中&#xff0c;准备如下变量3、在顶点着色器中…

macOS文本编辑器 BBEdit 最新 for mac

BBEdit是一款功能强大的文本编辑器&#xff0c;适用于Mac操作系统。它由Bare Bones Software开发&#xff0c;旨在为开发者和写作人员提供专业级的文本编辑工具。 以下是BBEdit的一些主要特点和功能&#xff1a; 多语言支持&#xff1a;BBEdit支持多种编程语言和标记语言&…

负债1320万美元的【思宏集团/Neo-Concep】申请900万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于香港的思宏集团Neo-Concept International Group Holdings Limited(简称&#xff1a;思宏集团&#xff09;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c…

【解刊】IEEE(trans),中科院2区,顶刊,CCF-A类,圈外人别想投?

计算机类 • 好刊解读 今天小编带来IEEE旗下计算机领域好刊的解读&#xff0c;如有相关领域作者有意向投稿&#xff0c;可作为重点关注&#xff01;后文有真实发表案例&#xff0c;供您投稿参考~ 01 期刊简介 IEEE Transactions on Computers ☑️出版社&#xff1a;IEEE …

layui 表格(table)合计 取整数

第一步 开启合计行 是否开启合计行区域 table.render({elem: #myTable, url: ../baidui/, page: true, cellMinWidth: 100,totalRow:true,cols: [[ //表头//{ type: checkbox },{ type: checkbox,totalRowText: "合计" },//合计行区域{ field: id, align: center,…

稀疏数组如何帮助我们节省内存,提升性能

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 什么是稀疏矩阵 稀疏矩阵是指矩阵中大部分元素为零的矩阵。在实际应用中&#xff0c;很多矩阵都是稀疏的&#xff0c…

RocketMQ 如何保证消息正常【投递】和【消费】

消息整体处理过程&#xff0c;这里我们将消息的整体处理阶段分为3个阶段进行分析&#xff1a;1、Producer发送消息阶段。 2、Broker处理消息阶段。 3、Consumer消费消息阶段。一、Producer发送消息阶段 1、安全机制保障1&#xff0c;发送方式。 1、同步发送 2、异步发送 3、O…

JPA Buddy快速创建update、find、count、delete、exists方法

JPA Buddy快速创建update、find、count、delete、exists方法&#xff0c;JPA默认提供的CrudRepository\JpaRepository提供的方法比较少&#xff0c;一般我们会手写一些方法&#xff0c;这里我们选择通过JPA Buddy快速生成&#xff0c;之前文章中讲到了JPA Buddy原本是IDEA收费插…