从 Hook 原理分析 Inline Hook 的实现(以 WeiXin 为例)
📅 2026/7/21 13:37:45
👁️ 次浏览
网上很多 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
Qwen3.5-9B-da8w8-torchao-v0.17.0 vs 原版模型:3.55%精度损失换来了什么?🚀 【免费下载链接】Qwen3.5-9B-da8w8-torchao-v0.17.0 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Qwen3.5-9B-da8w8-torchao-v0.17.0
在AI模型部署的…
📅 2026/7/19 16:19:40
内容:老板们,是不是觉得现在的流量越来越贵,获客成本高得让人睡不着觉?传统SEO做不动了,投广告又怕打水漂。这篇内容直接告诉你,如何利用Geo AI搜索优化加盟模式,低成本获取精准本地流量,解决你找不到客户、转化低的痛点。别再去死磕那些泛泛的大词了。现在的用户搜索习…
📅 2026/7/19 16:19:02
近日,广州市工业和信息化局正式公布“2026年度广州市绿色制造认定名单”,广东保伦电子股份有限公司(以下简称“itc保伦股份”)凭借在绿色生产体系、低碳智造制造、资源循环利用等方面全链条卓越表现,成功获评“广州市绿…
📅 2026/7/19 16:18:39
先给可执行答案
针对2026年自媒体创作者选视频解析工具的需求,核心要围绕你做内容二次创作的实际需求选,不要为用不到的功能付费。我长期测试过目前主流的5款工具,亲测筛选后,如果你需要把视频内容整理成逐字稿、推文素材或者创作…
📅 2026/7/21 18:14:11
Why-Not-Compose动画秘籍:10个超炫效果实现教程与源码解析 【免费下载链接】Why-Not-Compose A collection of animations, compositions, UIs using Jetpack Compose. You can say Jetpack Compose cookbook, showcase or play-ground if you want! 项目地址: ht…
📅 2026/7/21 18:14:11
threepp跨平台部署指南:Windows、Linux、macOS与WebAssembly全平台配置教程 【免费下载链接】threepp A cross-platform C20 3D library with the high-level API of three.js 项目地址: https://gitcode.com/gh_mirrors/th/threepp
想要在Windows、Linux、m…
📅 2026/7/21 18:14:11
如何高效使用Qbot量化交易平台:从数据获取到智能决策的完整实战指南 【免费下载链接】Qbot [🔥updating ...] AI 自动量化交易机器人(完全本地部署) AI-powered Quantitative Investment Research Platform. 📃 online docs: https://ufund-m…
📅 2026/7/21 18:14:11
背景需求:
为了发被子,我做了全校批量的圆形挂牌,可以绑在“被子包”提手上,便于再操场上发放被子时,很多老师可以协助根据学号发放。
https://blog.csdn.net/reasonsummer/article/details/149755556?spm=1011.2415.3001.5331https://blog.csdn.net/reasonsummer/arti…
📅 2026/7/21 18:14:11
昨天凌晨两点,我盯着屏幕上那堆乱码一样的英文文档,头发都快抓秃了。客户甩过来一份关于Geo Ken的技术参数表,说是急用,明天一早就要交差。我第一反应是打开翻译软件,结果出来的东西简直没法看,什么“地理肯”、“地质肯”,这翻译是认真的吗?那一刻我真想顺着网线过去问…
📅 2026/7/21 18:13:14
本文关键词:geo geo测试你是不是也遇到过这种奇葩事?明明你的网站内容写得比同行好,图片更清晰,甚至价格还更低,但在搜索结果里就是排不进去。特别是做本地生意的老板,那种看着隔壁老王明明啥也不是,却天天坐在收银台数钱的滋味,真的憋屈。我最近为了搞懂这个所谓的“地…
📅 2026/7/21 0:00:39
1. Octane Render与C4D的黄金组合:为什么选择这个方案?在三维创作领域,渲染器的选择往往决定了作品的最终呈现质量和工作效率。作为Cinema 4D(C4D)用户,Octane Render的GPU加速特性与实时预览功能ÿ…
📅 2026/7/21 0:00:41
1. GPMC接口设计:从硬件连接到软件配置的全局视角在嵌入式系统开发中,尤其是基于TI Sitara系列如AM263x这类高性能微控制器的项目里,外部存储器的扩展几乎是绕不开的一环。无论是存放大量非易失性代码的NOR Flash,还是作为高速数据…
📅 2026/7/21 0:00:41
1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…
📅 2026/7/21 1:04:03
1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…
📅 2026/7/21 1:04:03
更多请点击:
https://intelliparadigm.com
第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…
📅 2026/7/21 1:04:03
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/21 7:04:23
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/21 17:04:52
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/21 5:04:16