iOS 隐蔽注入两路线:TrollFools 和 Roothide

iOS 隐蔽修改/注入的两条路线:TrollStore + TrollFools 不越狱、只改单个 App,进程内多出的动态库可被检出;Dopamine + Roothide 是真越狱,但对进了黑名单的目标 App,进程内目前没有任何可靠的检测手段。


1. 概览

方案一:TrollStore + TrollFools方案二:Dopamine + Roothide
本质非越狱:永久签名安装器 + 原位 dylib 注入越狱:rootless 半不完美越狱 + 越狱环境隐藏
是否越狱否是(semi-untethered,重启后需重新激活)
系统版本范围iOS 14.0–17.0iOS 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,无需越狱。
  • 可注入的目标只有三类:
    1. 可卸载的系统 App(removable system apps);
    2. TrollStore 安装的 App;
    3. 加密的 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 的逆向分析):

  1. ct_bypass 对 dylib 签名——同样构造双签名者 CMS blob;
  2. 把签好的 dylib 复制进目标 App 的 Frameworks/ 目录;
  3. insert_dylib 向目标二进制写入 LC_LOAD_DYLIB load command;
  4. ldid -S 做 ad-hoc 签名;
  5. install_name_tool -change 把 dylib 安装名改为 @rpath/xxx.dylib;
  6. 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 + TrollFoolsDopamine + 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_DYLIBlaunchd 层 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. 对防守方的启示

  1. 检测阵地必须分路线设防:
    • 对 TrollStore + TrollFools:进程内枚举已加载镜像 + 读磁盘 Mach-O 的 load command + 官方页哈希基线比对,三者任一即可检出,成本低、可靠;
    • 对 Dopamine + Roothide(黑名单场景):客户端进程内检测基本无效,不要再投入。
  2. 客户端残余检测只对"取到设备控制权"的场景有意义:.jbroot-* 枚举、越狱工具缓存、SSH 痕迹等,需要 root 或物理接触;适用于设备审计/取证,不适用于 App 内嵌 SDK。

  3. 防线应上移到服务端风控:设备指纹异常(同一设备指纹下出现不可能的环境组合)、行为序列、以及针对相机伪造的音视频流物理一致性校验(画面与陀螺仪/加速度计数据的相关性、光照一致性等)。

  4. 系统版本本身就是一道防线:TrollStore 在 17.0.1 后失效,Dopamine 目前也只覆盖到 18.7.1 / 26.0.1——推动设备升级新系统,攻击工具即失去立足点。

  5. 攻击工具迭代很快,检测规则需要持续运营:Dopamine 在 2026-11-03 刚发布 3.0.13,TrollFools 月更,Roothide 集成版跟版发布——不存在一劳永逸的特征库。


7. 参考资料


版本快照(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 抓取网络数据包

发表留言

您的电子邮箱地址不会被公开,必填项已用*标注。发布的留言可能不会立即公开展示,请耐心等待审核通过。