从 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

相关新闻

量化推理的精度损失评估:INT8 和 FP16 的选择不是绝对的

量化推理的精度损失评估:INT8 和 FP16 的选择不是绝对的

量化推理的精度损失评估:INT8 和 FP16 的选择不是绝对的 一、量化部署的现实纠结:精度和速度不是简单的取舍 大模型推理服务的部署决策中,量化是最常被讨论的技术选项。INT8 量化可以将模型体积缩小到 FP16 的 50%,推理吞吐提升…

2026/7/19 16:17:26阅读更多 →
【 Atlas】元数据管理在现代数据平台中的作用是什么?Atlas 如何支持?

【 Atlas】元数据管理在现代数据平台中的作用是什么?Atlas 如何支持?

元数据管理在现代数据平台中的作用是什么?Atlas 如何支持?——构建可信数据基础设施的基石 用户问题原文:元数据管理在现代数据平台中的作用是什么?Atlas 如何支持? 2026年4月23日 作者:九师兄 在某全球电…

2026/7/19 16:17:26阅读更多 →
【 Atlas】 Apache Atlas 主要解决哪些数据治理问题?

【 Atlas】 Apache Atlas 主要解决哪些数据治理问题?

Apache Atlas 主要解决哪些数据治理问题?——从元数据黑洞到可信数据地图的实战解析 用户问题原文:Apache Atlas 主要解决哪些数据治理问题? 2026年4月23日 作者:九师兄 在某大型金融机构的一次合规审计中,监管机构要…

2026/7/19 16:17:26阅读更多 →
ngx_output_chain_get_buf

ngx_output_chain_get_buf

1 定义 ngx_output_chain_get_buf 函数 定义在 src/core/ngx_output_chain.cstatic ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) {size_t size;ngx_buf_t *b, *in;ngx_uint_t recycled;in ctx->in->buf;size ctx->buf…

2026/7/20 0:15:05阅读更多 →
互联网大厂常见Java面试题及答案汇总(2026持续更新)

互联网大厂常见Java面试题及答案汇总(2026持续更新)

金九银十即将来袭,又是一个跳槽的好季节,准备跳槽的同学都摩拳擦掌准备大面好几场,今天为大家准备了互联网面试必备的 1 到 5 年 Java 面试者都需要掌握的面试题,分别 JVM,并发编程,MySQL,Tomca…

2026/7/20 0:15:05阅读更多 →
python数据可视化技巧的100个练习 -- 31. 类别数据的点图

python数据可视化技巧的100个练习 -- 31. 类别数据的点图

重要性★★★☆☆ 难度★★☆☆☆ 你是一家零售公司的数据分析师。你的经理要求你可视化最近产品发布的客户满意度评级分布。评级是分类的,范围从“非常不满意”到“非常满意”。创建一个点图以显示每个评级类别的频率。使用 Python 进行数据处理和可视化。在代码中生成输入…

2026/7/20 0:13:05阅读更多 →
智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

在2026世界人工智能大会(WAIC 2026)举办期间,千里科技董事长、阶跃星辰董事长印奇作为特邀嘉宾出席大会开幕式并在大会主论坛(上午场)发表主题演讲《当智能体进入物理世界》。在印奇看来,"智能体"…

2026/7/20 0:13:05阅读更多 →
商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

7月18日,在WAIC 2026商汤科技 “基座大模型架构创新与生态合作论坛”上,商汤科技联合创始人、大装置事业群总裁杨帆发表《智变共生——加速AI基础设施持续升级》主题演讲,系统呈现了商汤大装置国产AI基础设施“技术-生态-商业”闭环布局&…

2026/7/20 0:13:05阅读更多 →
2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026年想在郑州学美发,很多零基础学员最先搜索的问题就是:郑州美发学校哪家好?这个问题没有一个只看学校名字就能得出的答案。因为不同学校的课程方向、学习周期、教学方式和适合人群并不一样。有的更适合零基础,有的偏向发型师进修,还有的只做某一项短期技术培训。对于完全没…

2026/7/20 0:11:05阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

2026/7/20 0:50:54阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/20 0:50:54阅读更多 →
2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:01:04阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:01:04阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/19 22:50:49阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →