iOS 隐蔽注入两路线:TrollFools 和 Roothide
iOS 隐蔽修改/注入的两条路线:TrollStore + TrollFools 不越狱、只改单个 App,进程内多出的动态库可被检出;Dopamine + Roothide 是真越狱,但对进了黑名单的目标 App,进程内目前没有任何可靠的检测手段。
1. 概览
| 方案一:TrollStore + TrollFools | 方案二:Dopamine + Roothide | |
|---|---|---|
| 本质 | 非越狱:永久签名安装器 + 原位 dylib 注入 | 越狱:rootless 半不完美越狱 + 越狱环境隐藏 |
| 是否越狱 | 否 | 是(semi-untethered,重启后需重新激活) |
| 系统版本范围 | iOS 14.0–17.0 | iOS 15.0–17.3.1(arm64e)、15.0–18.7.1 及 26.0–26.0.1(arm64) |
| 修改范围 | 单个目标 App 进程内 | 全局(含系统守护进程),可按黑名单豁免指定 App |
| 持久性 | 写盘持久,重启不丢;App 更新/重装即被清除 | 半不完美:重启后系统恢复干净,需重新越狱 |
| 常规越狱特征 | 无(本来就不是越狱) | 黑名单 App 内几乎无;全局层面痕迹被三层防护覆盖 |
| 典型用途 | 给指定 App 装插件/换肤/功能增强 | 全局 hook、虚拟相机、对抗强检测的风控场景 |
一句话总结:TrollStore + TrollFools 不越狱、只改单个 App,进程内多出的动态库可被检出;Dopamine + Roothide 是真越狱,但对进了黑名单的目标 App,进程内目前没有任何可靠的检测手段。
2. 命名消歧(极易混淆)
- TrollStore(opa334/TrollStore):俗称"巨魔",永久签名安装器。本身不做注入。
- TrollFools(Lessica/TrollFools):运行在 TrollStore 之上的 dylib 注入工具,本文方案一的注入层。
- Dopamine(opa334/Dopamine):越狱本体。
- Dopamine-roothide(roothide/Dopamine-roothide):roothide 组织维护的官方集成版("Open-source integration of roothide and Dopamine 3.x"),本文方案二用的是这个分支。注意还有一个已归档的
Dopamine1.x-roothide仓库,是旧版,不要混淆。
3. 方案一:TrollStore + TrollFools(非越狱原位注入)
3.1 签名层:TrollStore
- 仓库:github.com/opa334/TrollStore,当前版本 v2.1.1(2026-04-01 发布)。
- 核心是 CoreTrust 漏洞 CVE-2023-41991:CoreTrust 在处理含多个签名者的 CMS blob 时,会用来自 App Store 签名模板的 SHA1 CodeDirectory 来决定策略标志(即"这个二进制按 App Store 程序对待"),而实际执行校验用的却是攻击者构造的 SHA256 CodeDirectory(页哈希是攻击者自己算的)。结果:任意 App 都能获得"永久有效、无需开发者账号、无需重签"的合法签名。
- 支持范围:iOS 14.0b2 – 16.6.1、16.7 RC(20H18)、仅 17.0。17.0.1 起漏洞被修复,之后系统一律不可用。
- 能力:任意 entitlement(ldid fakesign 伪造签名附带)、借助 persona 管理可运行 root 权限的 helper。
- 反检测设计:TrollStore 把自身的 URL scheme 替换为系统自带的
apple-magnifier(放大镜),规避"检测已安装越狱工具名单"类扫描。 - 官方明确声明做不到的事:不能 platformize(
TF_PLATFORM/CS_PLATFORMIZED)、不能派生 launch daemon、不能向系统进程注入。这一条直接决定了方案一的能力上限。
3.2 注入层:TrollFools
- 仓库:github.com/Lessica/TrollFools,README 定位:"In-place tweak injection with insert_dylib and ChOma",适用 iOS 14.0–17.0,无需越狱。
- 可注入的目标只有三类:
- 可卸载的系统 App(removable system apps);
- TrollStore 安装的 App;
- 加密的 App Store 应用(仅限"裸" dylib,即不依赖资源包的动态库)。
- 不能注入开发签名 / Ad-hoc 签名的 App:通过 Xcode 直接运行到设备上的调试包、或用
ios-deploy安装的未签名或 ad-hoc 签名包,均不在上述三类中,TrollFools 无法注入。原因是注入流程第 6 步需要用ct_bypass重新签名目标二进制,而ct_bypass依赖 CoreTrust 漏洞伪造 App Store 签名模板——开发签名的二进制没有 App Store 模板可复用,ct_bypass无法构造有效的双签名者 blob。 - v4.4 版本说明中提到:TrollFools 也能给官方 Dopamine 注入第三方插件。
3.3 注入流水线(源码级过程)
按 TrollFools InjectorV3 的实际执行序列(对照 xiangxiang 的逆向分析):
ct_bypass对 dylib 签名——同样构造双签名者 CMS blob;- 把签好的 dylib 复制进目标 App 的
Frameworks/目录; insert_dylib向目标二进制写入LC_LOAD_DYLIBload command;ldid -S做 ad-hoc 签名;install_name_tool -change把 dylib 安装名改为@rpath/xxx.dylib;ct_bypass -r -i对被改动的目标二进制重新签名。
为什么加密的 App Store 应用也能注入?
关键在第 6 步的双签名者 blob:SHA1 CodeDirectory 槽沿用 App Store 模板(保住 FairPlay 解密路径,系统仍认为这是加密的商店应用),SHA256 槽则是重算后的页哈希。于是 AMFI 校验通过、FairPlay 解密照常,被插了 dylib 的二进制正常启动。
持久性:改动全部写盘,重启不丢;但目标 App 一旦更新或重装,注入即被覆盖清除。
3.4 能力边界
| 能做 | 不能做 |
|---|---|
| 给任意可注入目标的 App 加载自定义 dylib(插件/增强/换肤) | 注入系统进程(mediaserverd、SpringBoard 等一概不可碰) |
| 免越狱、免开发者账号、签名永久 | 全局 hook——影响范围永远限于被注入的那一个 App |
| 持久化到磁盘 | 对抗"枚举已加载动态库"类的进程内检测 |
| 在 iOS 17.0.1 及以上系统使用(CoreTrust 已修复) |
3.5 可检测性:能检出,且成本不高
- 注入走的是
LC_LOAD_DYLIB(写进 Mach-O),不是DYLD_INSERT_LIBRARIES——因此检测环境变量这条路无效; - 但进程内枚举已加载镜像(
_dyld_image_count/_dyld_get_image_name)能直接看到多出来的、路径位于 App bundle 内的 dylib; - 读磁盘二进制的 Mach-O 头,可见官方版本没有的
LC_LOAD_DYLIB; - 签名虽然"合法"(ct_bypass 构造的证书链 AMFI 认可),但页哈希与 App Store 官方基线不一致,做官方哈希基线比对即可判定篡改;
- 结论:TrollFools 的注入对用户无感、对检测方有明确检测面。这也是它和 Roothide 最本质的区别。
4. 方案二:Dopamine + Roothide(隐藏式越狱)
4.1 版本现状(2026-11-04 核对)
- Dopamine(opa334/Dopamine):rootless 半不完美越狱,最新 3.0.13,2026-11-03 发布(仍在高频更新)。支持矩阵:
- A14–A17 / M1–M2(arm64e):iOS 15.0–17.3.1;
- A8–A13(arm64):iOS 15.0–18.7.1,以及 26.0–26.0.1。
- 内核利用链按机型/版本自动选择:kfd、weightBufs、multicast_byte_copy、Fugu15、Coruna;
- 默认 hook 框架 ElleKit,包管理器 Sileo + Zebra。
- Dopamine-roothide(roothide/Dopamine-roothide):官方集成版,默认分支
3.x,最新发布 3.0.12-29(2026-10-29),仓库截至 2026-11-04 仍在推送,1.8k+ star,topics 明确标着hide-jailbreak/jailbreak-detection-bypass。 - 半不完美(semi-untethered):重启后系统恢复干净状态,需打开越狱 App 重新激活;日常使用中这是常态,不影响"越狱环境随时可用"。
4.2 原版 Dopamine 为什么不够(为什么需要 Roothide)
原版 Dopamine 没有任何隐藏:/var/jb 软链全局可见、systemhook 注入所有进程、bind mount 能被 getmntinfo 看到。任何主流越狱检测(特征文件探测、挂载枚举、注入库枚举)一测一个准。Roothide 就是为解决这个问题而做的集成。
4.3 RootHide 的三层防护架构
第一层:随机化越狱根目录(jbroot)
越狱文件的真实根目录不再是固定的 /var/jb,而是 /var/containers/Bundle/Application/.jbroot-<随机16位十六进制>/,每次越狱重新随机;rootfs 被 bind-mount 回 jbroot/rootfs/。路径不可预测,扫描固定路径的探测器全部失效。
第二层:利用 App Sandbox 自身
.jbroot-* 藏在 /var/containers/Bundle/Application/ 下,而 iOS 沙箱禁止 App 进程 readdir 这个父目录——App 从原理上就枚举不到它。
第三层:黑名单式选择注入(核心)
默认配置下(未配置时)所有进程仍被注入,兼容传统越狱体验;一旦把某 App 配进黑名单,该 App(含其 PlugIns/扩展)在 launchd 的 posix_spawn hook 里走 isBlacklistedPath() 判断后,直接走原始 posix_spawn 路径:
- 没有 systemhook 注入、没有
DYLD_INSERT_LIBRARIES; - csflags(代码签名标志)与正常进程物理一致,不是运行时"改回来"的;
xpc_hook隐藏 jb 相关的 job/coalition 信息;jbs协议和cy:/lh:的 mach service lookup 按 audit token 排除,防止黑名单 App 通过 mach 端口间接探测。
配套改动:
- 不使用 bind mount:
getmntinfo输出干净,挂载枚举检测失效;用户空间的路径翻译改由 systemhook 在被注入进程内 hook 文件类系统调用(open/access/stat/readlink/opendir/readdir 等)完成; - sysctl OID 替换:隐藏
developer_mode_status(iOS 16+ 越狱必须开开发者模式,这本来是个检测信号); - trust cache 修改 + AMFI patch,让越狱组件和 tweak 二进制可执行。
4.4 黑名单机制的推论
对黑名单 App 来说,进程内不存在任何越狱引入的可观测差异:没有外来镜像、没有环境变量、签名标志干净、挂载表干净、mach 服务探测也被堵住。
源码分析的结论原话是:"黑名单 App 进程内目前没有任何可靠方式能识别出 Roothide 越狱"——这不是绕过检测,而是从结构上消除了被检测的客体。
4.5 能力边界
| 能做 | 不能做 |
|---|---|
| 完整 rootless 越狱能力:全局 hook、注入系统守护进程、文件系统全量读写 | 覆盖 iOS 17.3.1 之后的 arm64e 设备(26.0.1 以上暂无) |
| 黑名单 App 进程内"零特征" | 抹掉系统根文件系统上的全部痕迹(见 4.6) |
| 虚拟相机、全局网络改包、传感器数据伪造等系统级改造 | 对抗设备取证级检查(需 root/物理接触的取证另说) |
4.6 可检测性:进程内无解,残余痕迹在进程外
黑名单 App 进程内的检测目前无可靠手段。残余检测面集中在进程外,且大多需要越狱权限/物理接触才能触及:
- 系统根文件系统上的越狱工具缓存(com.opa334.Dopamine、Sileo、Filza、wiki.qaq.TrollFools 等),以及
/var/mobile/.ssh、SSH 端口监听等运维痕迹——XXTouch 的 roothide FAQ 对此逐项给出了清理方法,说明实战用户也在处理这些; .jbroot-*目录本身——但 App 沙箱枚举不到,只有取证工具能看到;- 这些痕迹对"App 内嵌检测"基本无意义,真正的威胁场景是设备取证与人工核查。
行业共识因此转向:客户端越狱检测对 roothide+黑名单组合已接近失效,防线应上移到服务端风控(设备指纹、行为序列、多传感器一致性校验等)。
5. 两方案能力对比总表
| 维度 | TrollStore + TrollFools | Dopamine + Roothide |
|---|---|---|
| 越狱 | 否 | 是(半不完美,重启重激活) |
| 系统版本 | iOS 14.0–17.0(17.0.1 起失效) | arm64e:15.0–17.3.1;arm64:15.0–18.7.1、26.0–26.0.1 |
| 注入机制 | 改写目标二进制,写入 LC_LOAD_DYLIB | launchd 层 posix_spawn hook + systemhook 注入 |
| 作用范围 | 单个 App | 全局(含系统进程),可按黑名单豁免 |
| 持久性 | 磁盘持久,App 更新即失效 | 每次重启需重新越狱 |
| 常规越狱特征 | 无(非越狱) | 黑名单 App 内无;非黑名单场景有 |
| 进程内检测 | 可检出(枚举加载镜像/对比官方哈希基线) | 黑名单 App 内目前无可靠手段 |
| 系统进程注入 | 不可能(TrollStore 官方声明) | 可以(如 mediaserverd) |
| 工具活跃度 | TrollStore v2.1.1(2026-04);TrollFools v4.4-257(2026-10) | Dopamine 3.0.13(2026-11-03);roothide 集成 3.0.12-29(2026-10-29) |
组合使用:两条路线并不互斥。TrollFools v4.4 版本说明明确提到可给官方 Dopamine 注入第三方插件——即非 TrollStore 生态的注入工具也能服务于越狱环境;反过来,越狱设备上做单 App 级别的精细注入时,TrollFools 的手法同样适用。
6. 对防守方的启示
- 检测阵地必须分路线设防:
- 对 TrollStore + TrollFools:进程内枚举已加载镜像 + 读磁盘 Mach-O 的 load command + 官方页哈希基线比对,三者任一即可检出,成本低、可靠;
- 对 Dopamine + Roothide(黑名单场景):客户端进程内检测基本无效,不要再投入。
客户端残余检测只对"取到设备控制权"的场景有意义:
.jbroot-*枚举、越狱工具缓存、SSH 痕迹等,需要 root 或物理接触;适用于设备审计/取证,不适用于 App 内嵌 SDK。防线应上移到服务端风控:设备指纹异常(同一设备指纹下出现不可能的环境组合)、行为序列、以及针对相机伪造的音视频流物理一致性校验(画面与陀螺仪/加速度计数据的相关性、光照一致性等)。
系统版本本身就是一道防线:TrollStore 在 17.0.1 后失效,Dopamine 目前也只覆盖到 18.7.1 / 26.0.1——推动设备升级新系统,攻击工具即失去立足点。
攻击工具迭代很快,检测规则需要持续运营:Dopamine 在 2026-11-03 刚发布 3.0.13,TrollFools 月更,Roothide 集成版跟版发布——不存在一劳永逸的特征库。
7. 参考资料
- TrollStore 仓库与 README(支持版本、CoreTrust 漏洞说明、"不能做的事"清单):https://github.com/opa334/TrollStore
- TrollFools 仓库与 README(注入目标、版本范围):https://github.com/Lessica/TrollFools
- TrollFools 注入流水线逆向分析(xiangxiang,2025-02-21):https://qweraqq.github.io/security/2025/02/21/TrollFools.html
- Dopamine 仓库与 README(支持矩阵、利用链):https://github.com/opa334/Dopamine
- Dopamine-roothide 集成仓库:https://github.com/roothide/Dopamine-roothide
- RootHide 源码级分析(三层防护、黑名单机制、残余痕迹)《iOS 越狱隐藏:从 Dopamine 到 RootHide》,2026-09-14:https://kanchuan.com/blog/243-ios-roothide
版本快照(2026-11-04 核对):TrollStore v2.1.1(2026-04-01)· TrollFools v4.4-257(2026-10-11)· Dopamine 3.0.13(2026-11-03)· Dopamine-roothide 3.0.12-29(2026-10-29)
版权信息:本文为 AI 创作内容。
相关文章:
pod package的不足和改进
iOS 13 适配
Address Sanitizer 的原理和使用
URL Decode中对于+号的处理
iOS 抓取网络数据包

留言板