从 Hook 原理分析 Inline Hook 的实现(以 WeiXin 为例)
网上很多 Hook 教程都是直接告诉你找偏移、调用 Hook 模块即可真正讲清楚 Hook 为什么这样实现、每一步在干什么的却比较少。今天就从Inline Hook 的底层原理来分析整个流程。声明本文仅用于技术分析与学习交流。为了保护分析对象文中涉及的软件名称、偏移地址及部分代码均进行了修改不能直接用于任何实际软件。一个 Hook 调用长什么样很多 Hook 框架最终都是类似下面这样一个接口Hook( wechatwin_基址 偏移, 6, {96,86,232,0,0,0,0,97}, 接收消息, true );五个参数分别代表参数含义Hook地址需要Hook的位置模块基址偏移备份长度覆盖原指令长度调用数据写入的新代码模板回调地址我们自己的处理函数是否前置是否先执行自己的代码真正的 Hook其实就是围绕这五个参数完成的。Hook 的整体流程整个 Inline Hook 可以概括为下面几步原函数 │ │ ▼ 修改前5字节 │ ▼ jmp --- 新申请内存(JMP区) │ ▼ 恢复被覆盖指令 │ ▼ 执行自己的回调函数 │ ▼ 恢复现场 │ ▼ jmp 回原函数剩余代码整个流程可以理解成截胡 - 做自己的事情 - 再回去继续执行原来的代码。第一步备份原始指令首先要保存即将覆盖掉的机器码。ReadProcessMemory( -1, Hook地址, 原字节集, 备份长度, 长度 );例如准备覆盖 6 个字节55 8B EC 83 EC 10这些指令稍后还要继续执行因此必须提前备份。否则程序执行流程就断掉了。如下图图1Hook 前OD 中看到的是程序原始指令。图1第二步申请一块新的可执行内存JPM_地址 VirtualAlloc( 0, 1024, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE );例如申请得到00AF0000为什么要申请因为我们的 Hook 代码不能直接写到原来的函数里面。需要一块新的空间用来恢复原始指令调用自己的函数跳回原函数很多人把这里叫Trampoline或者跳板第三步恢复原始指令第一件事就是把刚才备份的数据复制过去。WriteProcessMemory( -1, JPM_地址, 原字节集, 备份长度, 0 );此时00AF0000 55 8B EC 83 EC 10这就是原来被覆盖掉的代码。第四步写入我们的 Hook 模板例如{96,86,232,0,0,0,0,97}很多人第一次看到这串数据都会懵。其实拆开以后非常简单。60 pushad 56 push esi E8 ???????? 61 popad其中E8表示call xxxx后面的四个00 00 00 00只是预留位置。稍后会计算真正的 CALL 地址。第五步计算回调函数地址代码里寻找字节集( 调用数据, {232} )实际上就是找到E8的位置。例如96 86 232 00 00 00 00 97那么E8位于第3个字节。随后回调偏移 备份长度假设3 6 9然后开始计算目标地址 - 当前地址 - 5也就是CALL偏移 回调函数 - CALL指令地址 - 5最终把算出的四字节偏移写回E8 XX XX XX XX这样执行到这里时就会调用我们的函数。如下图图2第六步写入跳回原函数的 JMP自己的代码执行完以后程序不能停在这里。还需要jmp跳回Hook地址 备份长度继续执行后面的代码。于是WriteProcessMemory( JPM地址备份长度写入长度, {E9}偏移, 5, 0 );此时跳板区域已经完整了。流程变成恢复原指令 ↓ 调用自己的函数 ↓ jmp ↓ 原函数剩余代码如下图图3第七步修改原函数真正开始 Hook。把原来的代码改成E9 XXXXXXXX对应代码WriteProcessMemory( Hook地址, {E9}偏移, 5, 0 );于是程序执行到这里时不会再继续执行原函数。而是jmp ↓ 我们申请的新内存OD 中就能看到原来的代码已经变成jmp 00AF0000如下图图4第八步NOP 填充因为jmp固定占5 字节如果原来覆盖的是6 7 8 9...那么多出来的字节必须NOP填充。例如90 90 90对应代码WriteProcessMemory( Hook地址5, 填充Dm, 长度, 0 );否则CPU 会把残留的半条指令继续执行。程序极有可能直接崩溃。如下图图5最终执行流程整个 Inline Hook 最终执行顺序如下程序运行 ↓ 执行 Hook 点 ↓ jmp 到跳板 ↓ 恢复被覆盖的原始指令 ↓ 执行自己的回调函数 ↓ jmp 回原函数 ↓ 继续执行剩余代码可以看到所谓的 Inline Hook本质上并不复杂它只是利用了一条JMP指令改变程序执行流再借助一块新申请的可执行内存Trampoline恢复现场、执行自定义逻辑最后跳回原函数继续运行。很多 Hook 框架如 MinHook、Detours 等虽然封装了大量细节但核心思想都与本文分析的流程一致保存原指令 → 跳转到跳板 → 执行自定义代码 → 返回原执行流。理解了这一过程再去阅读各种 Hook 框架源码会容易得多。123123

相关新闻

解决win11,macbookM1~4以及PD虚拟机安装ST-link驱动后会存在黄色感叹号的问题

解决win11,macbookM1~4以及PD虚拟机安装ST-link驱动后会存在黄色感叹号的问题

解决方法:给大家推荐一个b站博主up主:深夜小马哥通过他给的驱动安装包,我已在macbookm4上的虚拟机成功安装,经过我的调研,可以在任意MacBook芯片上安装以及其他品牌电脑上安装原因分析:官网驱动以及大部分人…

2026/7/22 16:18:24 阅读更多 →
BOM配单服务哪家更专业?圣禾堂在线提供一站式电子元器件选型解决方案

BOM配单服务哪家更专业?圣禾堂在线提供一站式电子元器件选型解决方案

一份BOM清单往往涉及几十种、几百种甚至上千种元器件型号,如何快速完成型号匹配、库存确认、价格优化以及替代方案寻找,成为很多企业采购过程中面临的重要问题。作为一家专注于电子元器件采购服务的分销商,圣禾堂(深圳&#xff09…

2026/7/22 17:02:34 阅读更多 →
电子元器件采购为什么越来越依赖现货供应商?

电子元器件采购为什么越来越依赖现货供应商?

对于电子制造企业来说,供应链最大的风险往往不是价格,而是不确定性。缺料可能导致项目延期、生产停线、订单交付受到影响。因此,越来越多企业开始重视电子元器件现货供应商。一、现货解决供应周期问题电子元器件市场型号众多,部分…

2026/7/22 15:12:51 阅读更多 →

最新新闻

不容错过的思维导图——XMind2025(全功能版)

不容错过的思维导图——XMind2025(全功能版)

(获取方式在文末)小伙伴们大家是否接触过思维导图软件呢,如果有那一定听说过XMind吧,今天我来为大家介绍一下,一起来看一下吧。软件介绍一、AI 核心功能革新一句话总结:写 PPT 前 10 分钟就能画出一张思维导…

2026/7/23 19:26:53 阅读更多 →
**轧辊测量精度突破0.003mm的3大关键技术**

**轧辊测量精度突破0.003mm的3大关键技术**

轧辊轮廓测量的技术突破与工程实践钢铁冷轧产线上,轧辊辊型精度直接影响带钢板形质量。传统机械式测量存在三个技术瓶颈:千分尺人工读数易引入0.005mm以上人为误差;V型块基准面磨损导致系统误差累积;车间震动与油污环境使接触式测…

2026/7/23 19:25:53 阅读更多 →
企业级数据中台建设方法论:从消除孤岛到资产复用的完整落地路径

企业级数据中台建设方法论:从消除孤岛到资产复用的完整落地路径

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:大数据、AI开发、Java、测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_6…

2026/7/23 19:25:53 阅读更多 →
YOLO26的SPASPP模块:提升红外小目标检测精度

YOLO26的SPASPP模块:提升红外小目标检测精度

1. 项目概述:YOLO26的SPASPP模块创新在目标检测领域,YOLO系列算法因其出色的实时性能而广受欢迎。最近提出的YOLO26模型在保持高效推理速度的同时,进一步提升了检测精度。然而,在处理红外小目标检测这类特殊任务时,传统…

2026/7/23 19:25:53 阅读更多 →
0 基础入门React Native鸿蒙跨平台开发:体重单位转换器功能实战

0 基础入门React Native鸿蒙跨平台开发:体重单位转换器功能实战

本文是基于HarmonyOS API 24的进行的ReactNative 鸿蒙跨平台开发依托适配鸿蒙的 RN 运行层,使用 React 与 JS 编写一套业务代码,无需大量 ArkTS 原生开发,通用业务实现代码复用,支持按需扩展原生桥调用鸿蒙特有能力,有…

2026/7/23 19:25:53 阅读更多 →
Python毕设项目:基于 Python 的智能期货模拟交易分析系统 虚拟资金期货交易演练管理平台 (源码+文档,讲解、调试运行,定制等)

Python毕设项目:基于 Python 的智能期货模拟交易分析系统 虚拟资金期货交易演练管理平台 (源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/23 19:25:53 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻