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.hqwc.cn/news/169308.html

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

相关文章

前端面试题 计算机网络

文章目录 ios 7层协议tcp协议和udp协议的区别tcp协议如何确保数据的可靠http和tcp的关系url输入地址到呈现网页有哪些步骤post和get本质区别,什么时候会触发二次预检GET请求:POST请求:触发二次预检(CORS中的预检请求)&…

ChatGPT付费创作系统V2.4.9独立版 +WEB端+ H5端 + 小程序端系统测试安装教程

播资源提供的GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序,是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT,流量超级大,引流不要太简单!一键下单即可拥有自己的GPT!…

python工具HIKVISION视频编码设备接入网关任意文件下载

python工具 构造payload /serverLog/downFile.php?fileName../web/html/serverLog/downFile.php漏洞证明 文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。 免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何…

在线制作仿真病历证明软件,易语言实现病例报告生成器,取画板快照+标签+编辑框

闲着无聊用易语言开发了一个病例生成器,当然我加了水印的,这个图片你就算截图你也用不了,模板是从百度图库搜的,很多,我就随便找了一个,然后实现逻辑就是加了一个画板,然后载入了素材图&#xf…

行为型模式-命令模式

这里写自定义目录标题 模式定义模式场景模式结构缺点优点总结 模式定义 将一个 请求封装为一个 对象,可以使用不同的请求进行参数化;对请求排队或者记录请求日志以及 支持可撤销的操作。别名动作模式或事务模式 模式场景 经常向某些对象发送请求&…

ChromeDriver谷歌浏览器驱动下载安装与使用最新版118/119/120

ChromeDriver谷歌浏览器驱动下载安装与使用最新版118/119/120 1. 确定Chrome版本 我们首先确定自己的Chrome版本 Chrome设置->关于Chrome 可以看到,当前chrome是最新版本:119.0.6045.124(正式版本) (64 位&#…

【CASS精品教程】cass3d加载点云(.ilas和.las)并处理应用

本文讲解cass11.0 3d中将las点云转为ilas加载并进行后续处理。(cass11.0下载与安装) 一、ilas点云格式介绍 点云ilas格式是现今数字化三维模型建模的--种普遍被使用的数据格式,也被称作点云、点集或聚集点。它把地球表面上的物体,比如森林、海洋、河流、山脉等自然物体,以…

AI 时代的企业级安全合规策略

目录 漏洞分类管理的流程 安全策略管理 在扫描结果策略中定义细粒度的规则 有效考虑整个组织中的关键漏洞 确保职责分离 尝试组合拳 本文来源:about.gitlab.com 作者:Grant Hickman 在应用程序敏捷研发、敏捷交付的今天,让安全人员跟上…

隐私计算python实现Paillier同态加密

1.基本概念 Paillier同态加密是一种公钥加密方案,具有同态加密的特性。它由Pascal Paillier于1999年提出。 Paillier同态加密基于数论问题,其安全性基于大整数分解问题和离散对数问题的困难性。该方案可以用于保护隐私数据,同时支持在加密状态…

将VS工程转为pro工程及VS安装Qt插件后没有create basic .pro file菜单问题解决

目录 1. 前言 2. VS工程转为pro工程 3. 没有create basic .pro file菜单 1. 前言 很多小伙伴包括本人,如果是在Windows下开发Qt程序,偏好用Visual Studio外加装个Qt插件进行Qt开发,毕竟Visual Studio确实是功能强大的IDE,但有时…

【Java】注解(Annotation)

1.注解 就是lava代码里的特殊标记,比如:Override、Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。 如下Override所示: 2.自定义注解 就是自己定义…

长虹智能电视使用123

1、开机 在接通电源的情况下,长虹智能电视开机有两种方式。 方式1: 按电视右下角开机按钮 方式2: 按电视遥控器开机按钮 长虹智能电视开机后会进入其操作系统(安卓)。 屏幕左右双箭头图表,手指点击会…