ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

substitute vs Substrate vs fishhook:iOS/Mac Hook工具终极选型指南

substitute vs Substrate vs fishhook:iOS/Mac Hook工具终极选型指南 substitute vs Substrate vs fishhookiOS/Mac Hook工具终极选型指南【免费下载链接】substituteA free runtime modification library.项目地址: https://gitcode.com/gh_mirrors/su/substitute如果你在 iOS 或 Mac 上开发需要劫持系统函数或第三方库的方法substitute、Substrate 和 fishhook是最常被拿来对比的三款 Hook 工具。其中substitute是一个免费的运行时修改库libsubstitute核心能力是在运行时改写函数机器码并安全地重定向调用Substrate是越狱生态里元老级的代码注入框架fishhook则是专注于重新绑定动态库符号的轻量工具。这篇文章用大白话讲清三者的原理差异、能力边界和适用场景帮你 3 分钟做出靠谱的选型决策。一、三分钟认识这三款 Hook 工具 substitute灵活的运行时函数劫持库substitute即 libsubstitute主打想 hook 谁就 hook 谁。它的做法是先反汇编目标函数的开头几字节把被覆盖的指令搬到一块**跳板trampoline**里再在原函数入口处写入跳转指令把调用重定向到你提供的替换函数同时回传一个旧函数指针方便你在钩子里继续调用原实现。除了函数级钩子它还提供两种更轻量的拦截方式——GOT/PLT 符号拦截和ObjC 消息拦截全部公共接口都集中在lib/substitute.h中核心改写逻辑在lib/hook-functions.c各架构ARM / ARM64 / x86的汇编与反汇编实现分别位于lib/arm/、lib/arm64/、lib/x86/目录。Substrate越狱生态的元老级框架SubstrateCydia Substrate是越狱 tweak 的地基绝大多数 Cydia 插件都建立在它之上。它提供MSHookFunction钩 C 函数、MSHookMessageEx钩 ObjC 方法并配套一批便捷宏和实例变量访问工具。值得一提的是substitute 内置了一个兼容层substrate/substrate.h让你原本写 Substrate 的代码几乎不改就能跑在 substitute 上迁移成本极低。fishhook轻量级动态符号重绑定工具fishhook 只做一件事把某个动态库引用的符号重新绑定到你的实现例如把malloc、read替换成自定义版本。它只改 GOT/PLT 表、不碰函数代码因此体积小巧、上手极快特别适合做底层函数透明替换。二、原理对比它们到底劫持了什么 三款工具的差异根源在于劫持点不同。理解了这一点选型就不再靠感觉机制代表工作方式副作用内联代码补丁substitute、Substrate改写函数入口指令 跳板转发需要可写可执行内存GOT/PLT 重绑定fishhook、substitute 的 interpose修改符号表指向不改代码但只覆盖动态符号ObjC 运行时Substrate、substitute替换方法 IMP仅限 ObjC 方法不碰 C 函数简单说内联补丁能力最强但动刀最深符号重绑定最温和、可沙盒化ObjC 运行时最省心但只能钩到 Objective-C 方法。三、关键维度横向对比 维度substituteSubstratefishhook可劫持范围任意 C/C 函数 ObjC 方法C 函数 ObjC 方法 实例变量动态库引用的 C 符号是否改写可执行代码是interpose 除外是否沙盒 / 非越狱 iOSinterpose 技术可用需越狱受只读 GOT 限制线程安全强主线程 暂停线程较弱较强架构支持ARM / ARM64 / x86多架构ARM / x86_64 为主是否依赖越狱否是否上手难度中等低宏丰富低维护状态已停更建议用 fork官方停更稳定但较老四、按场景选型我该用哪一个✅想 hook 任意 C/C 函数且要线程安全→ 选substitute它的substitute_hook_functions会暂停其他线程、原子地完成补丁还能回传旧实现指针是最全能的方案。维护老项目 / 越狱 tweak代码已经用MSHookFunction→ 选Substrate或直接用 substitute 的兼容层substrate/substrate.h平滑替换底层。只想替换少数几个 C 函数如日志、内存分配→ 选fishhook代码量最小、最不易出错。钩 Objective-C 方法 / 重写类行为→ 三者皆可substitute 的substitute_hook_objc_message和 Substrate 的MSHookMessageEx都能胜任且都比手写 ObjC 运行时代码干净。要在沙盒App Store 合规内做拦截→ 优先看 substitute 的substitute_interpose_imports或 fishhook二者都不依赖改写可执行内存。五、新手避坑指南 ⚠️注意维护状态substitute 上游已标注Unmaintained生产使用建议寻找活跃维护的 fork 版本Substrate 官方也已停更。选型时把谁在维护也纳入考量。主线程限制substitute 的函数钩子要求在主线程调用它会暂停其他线程以避免竞态非主线程调用会直接返回错误码可用substitute_strerror把错误码转成可读字符串定位问题。别 hook 太短的函数当函数开头的可补丁区域内就出现无条件返回等危险指令时内联补丁会失败——这正是 substitute 提供substitute_interpose_imports这类替代方案的价值所在。fishhook 的边界它只重绑定动态符号改不了内联调用、静态链接代码以及在较新 iOS 上只读的 dyld shared cache 里的系统符号。别混用非原子运行时修改substitute 的文档明确提示它与 Substrate 这类非原子替换方法的实现并存时可能产生竞态同一进程内尽量统一一套 Hook 方案。六、substitute 核心 API 速查 全部接口定义在lib/substitute.h最常用的几个substitute_hook_functions— 内联函数钩子主线程调用线程安全返回旧实现指针substitute_interpose_imports— GOT/PLT 符号拦截不改代码、原子操作技术层面可沙盒substitute_hook_objc_message— ObjC 方法钩子基于原子的class_replaceMethodsubstitute_open_image/substitute_find_private_syms— 查找已加载镜像中的私有符号地址substitute_strerror— 把SUBSTITUTE_ERR_*错误码转成可读字符串结语一句话总结要全能和线程安全选 substitute要越狱生态与低迁移成本选 Substrate要轻量替换少数 C 符号选 fishhook。三者并非互斥——理解内联补丁 / 符号重绑定 / ObjC 运行时这三种劫持机制你就能根据目标函数的类型、运行环境是否越狱、是否沙盒和线程要求做出最合适的选择。【免费下载链接】substituteA free runtime modification library.项目地址: https://gitcode.com/gh_mirrors/su/substitute创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表