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的模块名称及导入的函数名称或函数序号。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2 数字软键盘 封装 可拖动 使用简单

1、效果图 2、使用方式 <Keyboard v-if"show" close"show false" :inputDom"$refs.input" /> 封装的数字键盘 Keyboard.vue 组件代码 <template><divclass"keyboard"ref"keyboard":style"{ left: …

算法通关村第八关-白银挑战二叉树的深度和高度问题

大家好我是苏麟 , 今天说说几道二叉树深度和高度相关的题目 . LeetCode给我们造了一堆的题目&#xff0c;研究一下104、110和111三个题&#xff0c;这三个颗看起来挺像的&#xff0c;都是关于深度、高度的。 最大深度问题 描述 : 二叉树的 最大深度 是指从根节点到最远叶子…

SharePoint 是什么

SharePoint 平台使您能够以在线方式和本地方式轻松地管理和协调业务数据。因为其灵活性和易使用性&#xff0c;公司可以快速采用SharePoint来管理其业务数据。 SharePoint Microsoft 365 一种基于云的服务&#xff0c;由 Microsoft 托管&#xff0c;适用于各种规模的企业。 任何…

【Redis】redis-server和redis-cli

上一篇《redis 的下载和安装》 https://blog.csdn.net/m0_67930426/article/details/134341071?spm1001.2014.3001.5501 安装完之后开始使用 打开客户端之前需要先打开服务端 redis-server 直接使用该命令打开就行 然后在打开客户端 redis-cli 使用ping命令查看是否连接服…

云原生 黑马Kubernetes教程(K8S教程)笔记——kubernetes介绍。Master集群控制节点、Node工作负载节点、Pod控制单元

参考文章&#xff1a;kubernetes介绍 文章目录 1. Kubernetes介绍1.1 应用部署方式演变传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上虚拟化部署&#xff1a;可以在一台物理机上运行多个虚拟机&#xff0c;每个虚拟机都是独立的一个环境&#xff…

如何提升管理组织能力?

组织能力能力属于管理能力中的一部分&#xff0c;所以也称之为管理组织能力&#xff0c;组织是将人和事物的组合&#xff0c;有效的梳理和导向结果的能力。每个人都有组织能力&#xff0c;只是能力和效率上存在较大的差异。 一人的组织能力从学生时代就能体现出来&#xff0c;…

华为ensp:vrrp双机热备负载均衡

现在接口ip都已经配置完了&#xff0c;直接去配置vrrp r1上192.168.1.100 作为主 192.168.2.100作为副 r2上192.168.1.199 作为副 192.168.2.100作为主 这样就实现了负载均衡&#xff0c;如果两个都正常运行时&#xff0c;r1作为1.1的网关&#xff0c;r2作为2.1网关…

springboot高校全流程考勤系统-计算机毕设 附源码 27637

Springboot高校全流程考勤系统 摘 要 本文针对高校考勤等问题&#xff0c;对其进行研究分析&#xff0c;然后开发设计出高校全流程考勤系统以解决问题。高校全流程考勤系统系统主要功能模块包括&#xff1a;考勤签到、课程信息、考勤情况、申请记录列表等&#xff0c;系统功能设…

OpenWRT浅尝 / 基于RAVPower-WD009便携路由文件宝的旁路网关配置

目录 前言需求分析手头的设备家庭网络拓扑图旁路网关配置OpenWRT固件选择OpenWRT固件刷入旁路网关配置流程 旁路网关的使用前置工作日常存储/关键备份内网穿透24小时待命下载器 前言 近期由于个人需求&#xff0c;需要一台OpenWRT设备实现一些功能。所以本文主要还是为了自己后…

堆的应用-----Top k 问题

目录 前言 Topk问题 1.问题描述 2.解决方法 3.代码实现&#xff08;C/C&#xff09; 前言 在人工智能算法岗位的面试中&#xff0c;TopK是问得最多的几个问题之一&#xff1a; 到底有几种方法&#xff1f; 这些方案里蕴含的优化思路究竟是怎么样的&#xff1f; 为啥T…

ARM Linux 基础学习 / 系统相关,文件系统,文件属性

编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料&#xff08;如 百问网的《嵌入式Linux应用开发完全手册》&#xff0c;在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO&#xff1a;开发板资料》或《2.2 全系列Linux教程&#xf…

高性能收发原始数据包的框架(Netmap)

一、Netmap 简介 Netmap 是一个高性能收发原始数据包的框架&#xff0c;由 Luigi Rizzo 等人开发完成&#xff0c;其包含了内核模块以及用户态库函数。其目标是&#xff0c;不修改现有操作系统软件以及不需要特殊硬件支持&#xff0c;实现用户态和网卡之间数据包的高性能传递。…

链表的逆置

方法1&#xff1a; 依次将指针反向&#xff0c;最后令头指针指向尾元素。 逆置过程如下&#xff1a; 当q指针为空时&#xff0c;循环结束。 //试写一算法&#xff0c;对单链表实现就地逆置&#xff0c; void Reverse1(List plist)//太复杂,不用掌握 {assert(plist ! NULL);i…

大二第四周总结——用原生js封装一个分页器

用原生js封装一个分页器 起因&#xff1a;这次项目还是用原生的js来写的&#xff0c;我负责的是后台&#xff0c;分页是后台最常见的一个功能了&#xff0c;于是干脆封装一下,废话少说&#xff0c;直接上代码 这里是基本的样式 .pagination {display: flex;width: 600px;hei…

git的分支及标签使用结合全网最详细的情景演示

目录 一git的分支 ⭐⭐ 补充一个拓展知识&#xff1a; 1.1 git分支 1.2 git分支的增删查命令 1.3 情景演示 二.git标签 2.1 分支与标签的关系 2.2 git标签的基本命令 2.3 情景演示 一git的分支 ⭐⭐ 补充一个拓展知识&#xff1a; 软件开发中常见的四个环境&…

jdk21 虚拟线程原理及使用分享

虚拟线程概述 jdk21已于北京时间9月19日21点正式发布, 其中引人注目的就是虚拟线程(Virtual Thread)随之正式发布, 不再是此前jdk19、jdk20中的预览版本。 平台线程&#xff1a;java传统的线程是对系统线程的包装&#xff0c;为了区别于虚拟线程&#xff0c;因此将通过传统方式…

【Git】工作中的留痕:分支及标签的超神搭配

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Git的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Git分支是什么 二.Git分支的使用 1.分…

HTTPS协议

目录 HTTPS概念加密是什么常见加密方式对称加密非对称加密数据摘要&&数据指纹数据签名 HTTP工作过程探究方案一&#xff1a;只使用对称加密方案二&#xff1a;只使用非对称加密方案三&#xff1a;双方都使用非对称加密方案四&#xff1a;非对称加密对称加密中间人攻击 …

常见面试题-JDK和CGLIB动态代理

JDK 动态代理和 CGLIB 动态代理对比 JDK 动态代理只能代理实现了接口的类&#xff0c;而 CGLIB 可以代理未实现任何接口的类。另外CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用&#xff0c;因此不能代理声明为final 类型的类和方法就二者的效率来说&a…