从 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/10/3 2:54:24 阅读更多 →
BOM配单服务哪家更专业?圣禾堂在线提供一站式电子元器件选型解决方案

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

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

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

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

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

2026/9/29 16:29:04 阅读更多 →

最新新闻

CTF RSA常见题型与攻击脚本系统整理:从模数分解到共模攻击

CTF RSA常见题型与攻击脚本系统整理:从模数分解到共模攻击

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:35:33 阅读更多 →
Layui后台管理系统实战:从项目搭建到组件避坑指南

Layui后台管理系统实战:从项目搭建到组件避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:35:33 阅读更多 →
Kafka自定义分区器实战:解决负载倾斜与消息有序性

Kafka自定义分区器实战:解决负载倾斜与消息有序性

1. 为什么“自定义分区”不是锦上添花,而是Kafka生产链路的命门你有没有遇到过这样的场景:某天凌晨三点,监控告警疯狂刷屏——订单Topic的消费延迟突然飙升到2小时,下游风控服务集体超时。运维同学第一时间杀掉所有消费者重拉&…

2026/10/13 5:35:33 阅读更多 →
Agent技能库设计指南:从工具调用到可复用技能包

Agent技能库设计指南:从工具调用到可复用技能包

从 agent-skills 这个项目命名就能看出来,它要解决的是 Agent 技能沉淀的问题。我一开始做聊天机器人,总是往系统提示词里塞各种“你是个会查天气的助手”“你是个会算数的助手”这类话,结果上下文越写越长,功能越加越乱。后来我把…

2026/10/13 5:35:33 阅读更多 →
算子与运行时:AI系统性能的底层双引擎

算子与运行时:AI系统性能的底层双引擎

1. 这不是“概念课”,是写代码时每天都要面对的底层真相“第05章-算子与运行时”——看到这个标题,很多人第一反应是:教材目录?课程PPT?或者某本厚得让人想合上的系统编程书里的一页?但如果你最近在调试一个…

2026/10/13 5:35:33 阅读更多 →
手写Tool Use面试题:从函数到生产级工具调度系统

手写Tool Use面试题:从函数到生产级工具调度系统

1. 面试现场的真实压力:当“手写 Tool Use”成为临场能力试金石“请手写一个 Tool Use 实现。”这句话从面试官嘴里说出来的时候,我正端着一次性纸杯喝第三口温水——不是因为紧张,而是前两轮算法题刚结束,嗓子发干。但这句话一落…

2026/10/13 5:34:33 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →