☰
TrollStore 构建前置:用 Victim/make_cert.sh 生成与目标 App 同 Team ID 的开发者证书
2026/10/1 1:52:49 网站建设 项目流程
  • 应用安全

【免费下载链接】TrollStore

Jailed iOS app that can install IPAs permanently with arbitary entitlements and root helpers because it trolls Apple

项目地址:https://gitcode.com/GitHub_Trending/tr/TrollStore
点击查看免费下载

TrollStore 是一个可永久安装 IPA、并附带任意 entitlements 与 root helper 的 Jailed iOS 应用。在其构建流程中,生成 pwned(被植入持久化工具链)的 TrollHelperOTA arm64 IPA 时,需要一个与你所选 "victim"(受害者)应用相同 Team ID 的开发者证书。本文以仓库中 Victim/README.md 为线索,完整讲解这一证书的用途、./make_cert.sh <TEAM_ID>的用法,并结合 Victim/make_cert.sh 逐行剖析其底层证书链构建逻辑,说明产物victim.p12如何被 Makefile 的 IPA 组装流程与 fastPathSign 的 CoreTrust 绕过机制所消费。

一、为什么需要 "Victim 证书":同 Team ID 是整套流程的前提

Victim/README.md 开宗明义:

In order to compile a pwned TrollHelperOTA arm64 IPA, you need to provide a dev cert with the same team ID as your victim app in this directory.

也就是说,如果你希望以某个已在 App Store 上架的 App(即 "victim app")作为载体来构建 TrollHelper 安装包,那么本目录(Victim/)中必须预先放置一份与该 victim app 具有相同 Team ID的开发者证书。

这一要求的深层原因可以在 Exploits/fastPathSign/src/coretrust_bug.c 的绕过逻辑中找到:当 fastPathSign 将 App Store 签名结构移植到目标二进制时,会从 App Store CodeDirectory 中提取 Team ID,并强制要求真实 CodeDirectory 与它保持一致:

// For the bypass to work, both code directories need to have the same team ID char *appStoreTeamID = csd_code_directory_copy_team_id(appStoreCodeDirectoryBlob, NULL); ... if (csd_code_directory_set_team_id(realCodeDirBlob, appStoreTeamID) != 0) {

可见Team ID 匹配是整个 CoreTrust 校验绕过的硬性前提。因此make_cert.sh的第一个(也是唯一一个)参数就是<TEAM_ID>,它会被写进整条证书链每个证书的OU字段。

二、使用方式与产物

在仓库根目录下,将<TEAM_ID>替换为你 victim app 的真实 Team ID 后执行:

./make_cert.sh <TEAM_ID>

脚本运行完毕后,Victim/目录下会得到唯一的最终产物:

产物说明
Victim/victim.p12带完整证书链的 PKCS#12 格式开发者证书(友好名 "TrollStore iPhone OS Application Signing"),密码为空

仓库中已存在一份Victim/victim.p12,即此前用该脚本生成的示例产物。除victim.p12外的所有中间文件(各 PEM 证书、私钥、CSR、序列号文件)都会在脚本末尾被清理,保证目录干净、只保留最终需要的签名材料。

运行前提

  • 需要可用的openssl命令行工具。脚本在make_cert.sh开头导入了 Homebrew 的 OpenSSL 3 路径:
    export PATH="/opt/homebrew/Cellar/openssl@3/3.0.5/bin:$PATH"

    这意味着脚本默认面向 macOS + Homebrew 环境,若你的 OpenSSL 不在该路径,请自行调整PATH。

  • 脚本使用set -e,任何一步失败都会立即中止,避免产出不完整的证书链。
  • 注意脚本以rm清理中间文件,如需保留中间证书用于调试,可自行注释末尾的清理段落(仓库当前以最终产物为准)。

三、脚本逐行拆解:三条证书链的构建

Victim/make_cert.sh 实际构建了一个三级证书链:Root CA → CodeSigning CA(代码签名二级 CA)→ Leaf 开发证书,再打包为victim.p12。$1(Team ID)会贯穿全部三级证书的OU字段。

1. 自签 Root CA(TrollStore iPhone Root CA)

openssl req -newkey rsa:2048 -nodes -keyout root_key.pem -x509 -days 3650 -out root_certificate.pem \ -subj "/C=CA/O=TrollStore/OU=$1/CN=TrollStore iPhone Root CA" \ -addext "1.2.840.113635.100.6.2.18=DER:0500" \ -addext "basicConstraints=critical, CA:true" -addext "keyUsage=critical, digitalSignature, keyCertSign, cRLSign"
  • 生成 2048 位 RSA 密钥(-nodes表示私钥不加密),自签-x509,有效期3650 天(10 年)。
  • Subject 中OU=$1写入 Team ID,CN为 "TrollStore iPhone Root CA"。
  • 关键点:附加了 Apple 专有的证书扩展 OID1.2.840.113635.100.6.2.18,值为 DER 编码的0500。1.2.840.113635是 Apple 的企业 OID 前缀,该扩展用于标记"可签发 Apple 相关签名证书"的 CA;0500是 DER 编码的空 NULL 值,表示该扩展只作标记、不含额外数据。
  • 同时声明CA:true与keyCertSign等 CA 基本约束。

2. 二级 CodeSigning CA(TrollStore iPhone Certification Authority)

openssl req -newkey rsa:2048 -nodes -keyout codeca_key.pem -out codeca_certificate.csr \ -subj "/C=CA/O=TrollStore/OU=$1/CN=TrollStore iPhone Certification Authority" \ -addext "1.2.840.113635.100.6.2.18=DER:0500" \ -addext "basicConstraints=critical, CA:true" -addext "keyUsage=critical, keyCertSign, cRLSign" openssl x509 -req -CAkey root_key.pem -CA root_certificate.pem -days 3650 \ -in codeca_certificate.csr -out codeca_certificate.pem -CAcreateserial -copy_extensions copyall
  • 先生成 CSR,再由 Root CA 签发,同样 3650 天。
  • -copy_extensions copyall会把 CSR 中的扩展(包括 Apple 专有 OID 扩展)复制进签发的证书中。
  • 该 CA 同样带CA:true,但 keyUsage 只保留keyCertSign, cRLSign(无digitalSignature),职责更收敛——它只负责给叶子证书签发。

3. 叶子开发证书(TrollStore iPhone OS Application Signing)

openssl req -newkey rsa:2048 -nodes -keyout dev_key.pem -out dev_certificate.csr \ -subj "/C=CA/O=TrollStore/OU=$1/CN=TrollStore iPhone OS Application Signing" \ -addext "basicConstraints=critical, CA:false" \ -addext "keyUsage = critical, digitalSignature" -addext "extendedKeyUsage = codeSigning" \ -addext "1.2.840.113635.100.6.1.3=DER:0500" openssl x509 -req -CAkey codeca_key.pem -CA codeca_certificate.pem -days 3650 \ -in dev_certificate.csr -out dev_certificate.pem -CAcreateserial -copy_extensions copyall
  • 叶子证书CA:false,keyUsage 仅digitalSignature,并声明extendedKeyUsage = codeSigning(OID1.3.6.1.5.5.7.3.3),表明它是一张标准的代码签名证书。
  • 额外附加 Apple 专有 OID1.2.840.113635.100.6.1.3(值同样为 DER0500),这是 Apple 用于标记"应用签名(Application Signing)"用途的扩展。
  • 签发后同样拷贝全部扩展。

4. 组装证书链并导出 victim.p12

cat codeca_certificate.pem root_certificate.pem >certificate_chain.pem /usr/bin/openssl pkcs12 -export -in dev_certificate.pem -inkey dev_key.pem -certfile certificate_chain.pem \ -keypbe NONE -certpbe NONE -passout pass: \ -out victim.p12 -name "TrollStore iPhone OS Application Signing"
  • 将二级 CA 与 Root CA 拼接为证书链文件,随叶子证书与私钥一起导出 PKCS#12。
  • 注意这里特意调用/usr/bin/openssl(macOS 系统自带版本)而非前面 PATH 中的 Homebrew OpenSSL,因为 macOS 系统 OpenSSL 的pkcs12实现支持-keypbe NONE -certpbe NONE参数,可导出无密码保护的 p12——这正是后续ldid免密加载证书的前提。
  • -name指定友好名 "TrollStore iPhone OS Application Signing",与叶子证书 CN 一致。

5. 清理中间文件

脚本末尾依次删除certificate_chain.pem、各级 CSR/PEM/私钥等全部中间产物,只留下victim.p12。

四、证书参数速查表

证书CNOU(Team ID)keyUsage其他关键扩展
Root CATrollStore iPhone Root CA$1digitalSignature, keyCertSign, cRLSignCA:true;Apple OID 1.2.840.113635.100.6.2.18=DER:0500
CodeSigning CATrollStore iPhone Certification Authority$1keyCertSign, cRLSignCA:true;Apple OID 1.2.840.113635.100.6.2.18=DER:0500
Leaf(开发证书)TrollStore iPhone OS Application Signing$1digitalSignatureCA:false;EKU=codeSigning;Apple OID 1.2.840.113635.100.6.1.3=DER:0500

三个证书有效期均为 3650 天(10 年),密钥统一为 2048 位 RSA。

五、victim.p12 在构建流程中的消费点

victim.p12并非孤立产物,它被仓库顶层 Makefile 的 IPA 组装流程直接引用:

build_installer15(iOS 15 系列安装器)

build_installer15: @unzip ./Victim/InstallerVictim.ipa -d ./_build/tmp15 @cp ./_build/PersistenceHelper_Embedded_Legacy_arm64 ./_build/TrollStorePersistenceHelperToInject @pwnify set-cpusubtype ./_build/TrollStorePersistenceHelperToInject 1 @ldid -s -K./Victim/victim.p12 ./_build/TrollStorePersistenceHelperToInject ... @pwnify pwn ./_build/tmp15/Payload/$$APP_NAME/$$BINARY_NAME ./_build/TrollStorePersistenceHelperToInject

流程要点:

  1. 解包InstallerVictim.ipa(即 victim app 的 IPA);
  2. 取出编译好的PersistenceHelper_Embedded_Legacy_arm64,先用pwnify set-cpusubtype调整 CPU subtype,再执行ldid -s -K./Victim/victim.p12用我们生成的victim.p12对它重新签名——这正是victim.p12的核心用途;
  3. 通过pwnify pwn将已签名的 PersistenceHelper 植入 victim App 的主二进制,重新打包为TrollHelper_iOS15.ipa。

build_installer64e(arm64e 版本安装器)

build_installer64e: @unzip ./Victim/InstallerVictim.ipa -d ./_build/tmp64e ... @pwnify pwn64e ./_build/tmp64e/Payload/$$APP_NAME/$$BINARY_NAME ./_build/PersistenceHelper_Embedded_Legacy_arm64e

逻辑与 iOS 15 版一致,差异仅在于使用 arm64e 变体与pwnify pwn64e,同样以./Victim/InstallerVictim.ipa为 victim 载体,并依赖此前用victim.p12签名的持久化辅助程序。

注意:以上两个 target 依赖./Victim/InstallerVictim.ipa这一文件——它是本机侧的 victim app IPA,由使用者自行准备,未随仓库分发(仓库只包含Victim/victim.p12与证书生成脚本)。因此完整构建前,需要先把自己选定的 victim app IPA 放入Victim/目录并命名为InstallerVictim.ipa。

六、Team ID 匹配与 CoreTrust 绕过的关系

回到 Exploits/fastPathSign/src/coretrust_bug.c 的apply_coretrust_bypass函数,可以完整串起 "victim 证书" 的意义:

  1. 函数把二进制原有的真实 SHA-256 CodeDirectory 降级为CSSLOT_ALTERNATE_CODEDIRECTORIES,并把从 Exploits/fastPathSign/src/Templates/AppStoreCodeDirectory.h 模板取出的App Store CodeDirectory(SHA-1)插入为主 CodeDirectory(Exploits/fastPathSign/src/coretrust_bug.c 中的注释说明了修改后的槽位顺序);
  2. 随后提取 App Store CodeDirectory 中的 Team ID,并用csd_code_directory_set_team_id将真实 CodeDirectory 的 Team ID 改为一致,同时把 flags 清零(去除 adhoc 等标志位);
  3. 通过 Exploits/fastPathSign/src/Templates/CADetails.h 中内嵌的 CA 证书/私钥,基于 CDHash 生成新的 CMS 签名槽,完成"看起来由 Apple 签发"的签名。

而victim.p12中的 Team ID(OU=$1)必须与 victim app 的 Team ID 完全一致,才能保证第 2 步的匹配关系成立、使整条链路在设备侧通过校验。这就是 Victim/README.md 所强调的 "same team ID as your victim app" 的完整技术背景。

七、常见问题与注意事项

  • Team ID 从哪来:Team ID 是 victim app 开发者账号的 10 位字符团队标识,可从 Apple Developer 后台或已签名 IPA 的 entitlements/证书信息中查看。./make_cert.sh <TEAM_ID>只把它写进证书OU字段,脚本本身不校验其真实性。
  • p12 密码为空:-passout pass:配合-keypbe NONE -certpbe NONE使victim.p12无密码,这是为了ldid -K能直接加载;如需安全存储,可自行调整导出参数(需同步修改 Makefile 的签名调用方式)。
  • 证书有效期:各级证书均为 3650 天(10 年),长期有效,无需频繁重建;重建时直接重新运行./make_cert.sh覆盖victim.p12即可。
  • 环境依赖:脚本面向 macOS + Homebrew OpenSSL 环境,且pkcs12导出刻意使用系统/usr/bin/openssl。在 Linux 上运行时需确保 openssl 命令与参数兼容。
  • 只读仓库说明:本文涉及的Victim/目录是构建材料目录,仓库中只包含make_cert.sh与已生成的victim.p12;实际构建时需自行放置InstallerVictim.ipa并执行脚本,无需修改仓库源码。

八、总结

从 Victim/README.md 的 3 行说明出发,可以看到 TrollStore 的完整构建链条中,"victim 证书"并非可有可无的装饰,而是连接victim app 选择 → Team ID 注入 → ldid 签名 → PersistenceHelper 植入 → CoreTrust 绕过校验整条流水线的关键一环。Victim/make_cert.sh 用三条 openssl 命令构建出 Apple 风格的三级代码签名证书链并产出无密码victim.p12,配合 Makefile 的build_installer15/build_installer64e与 Exploits/fastPathSign 的 Team ID 对齐逻辑,即可产出可在目标设备上运行的 TrollHelper OTA 安装包。理解这一前置步骤,是自行复现与定制 TrollStore 构建流程的必修课。

  • 应用安全

【免费下载链接】TrollStore

Jailed iOS app that can install IPAs permanently with arbitary entitlements and root helpers because it trolls Apple

项目地址:https://gitcode.com/GitHub_Trending/tr/TrollStore
点击查看免费下载
上一篇:SSD目标检测学习率调度终极指南:快速提升训练收敛速度的7个技巧
下一篇:推荐 NestJS:构建高效 Node.js 后端应用的首选框架

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询