使用shsh降级,

使用shsh降级,

本文还有配套的精品资源,点击获取

简介:SHSH(Software SHSH blobs)是苹果iOS设备在系统恢复和升级过程中用于验证固件合法性的数字签名,对实现自制固件和不完美降级至关重要。本文详细介绍了SHSH的原理、备份方法及在iPhone等设备上的应用,涵盖其在越狱、版本回退中的实际用途。通过案例“3.1shsh”说明了特定iOS版本SHSH文件的价值,帮助高级用户掌握如何利用SHSH突破官方固件限制,实现个性化系统管理。

1. SHSH的定义与核心作用机制

SHSH的基本概念与技术本质

SHSH(Signed by Apple’s SHAttered Hash)是苹果设备在系统验证过程中使用的一种加密签名哈希,由设备唯一标识符(如ECID)、固件版本、设备型号及随机数(ApNonce)等参数生成。它并非普通哈希,而是基于CMS(Cryptographic Message Syntax)封装的RSA数字签名数据块,确保存储于APTicket.blob中的内容不可伪造。

# 示例:通过tsschecker提取SHSH请求的核心命令

tsschecker -d iPhone10,1 -i 15.3 -e 123456789ABCDEF --apnonce A1B2C3D4E5F6...

注:该命令向苹果TSS服务器发起模拟请求,获取对应设备和固件的签名许可。

SHSH在iOS信任链中的核心职能

SHSH作为“时间钥匙”,绑定特定固件与硬件指纹,在设备进入恢复或更新模式时参与Bootchain校验流程。苹果TSS服务器仅对仍在签名窗口期内的固件返回有效APTicket,一旦关闭,即使本地拥有完整固件也无法通过官方验证通道刷入——这构成了iOS降级封锁的技术根基。

2. SHSH在iOS系统升级与降级中的关键角色

苹果对iOS设备的固件更新和版本控制,构建了一套高度封闭但技术严谨的安全验证体系。在这一体系中, SHSH签名 扮演着决定性角色——它不仅是设备能否成功安装某一特定固件的关键凭证,更是实现或阻止用户进行系统“降级”的核心机制。本章将深入剖析SHSH如何在日常升级流程中动态生成,在降级操作中成为唯一突破口,并揭示其作为“时间钥匙”所承载的技术意义。

2.1 iOS固件验证机制的技术背景

iOS系统的固件验证并非简单的文件校验过程,而是一套由硬件、加密协议与远程服务器协同完成的信任链建立流程。每当用户通过iTunes/Finder发起OTA更新或恢复模式刷机时,设备并不会直接下载并写入固件,而是先进入一个名为 TSS(Ticket Signing Service)请求阶段 的通信环节。这一环节的核心任务是向苹果的 tessellation.apple.com 服务器提交包含设备唯一标识与目标固件信息的数据包,以获取一份经过数字签名的 APTicket(Apple Personalized Ticket),即我们通常所说的 SHSH blob。

该机制的设计初衷在于防止未经授权的固件被刷入设备,从而杜绝越狱工具滥用旧版漏洞、规避安全补丁的行为。整个流程依赖于公钥基础设施(PKI)与设备专属密钥材料(如 UID、ECID)的结合使用,确保每一张签发的 APTicket 都只能用于指定设备和特定固件组合。

2.1.1 苹果OTA更新与iTunes恢复流程解析

当用户点击“软件更新”按钮时,iOS会首先检查当前可用的最新版本,并从苹果CDN下载完整的IPSW(iPhone Software)镜像包。然而,这并不意味着可以立即安装。真正的验证发生在进入恢复流程前的最后一环: TSS 请求 。

流程阶段 触发条件 主要行为 OTA 下载 用户选择“下载并安装” 获取IPSW镜像至本地缓存 恢复准备 设备重启进入DFU/Recovery模式 构建TSS请求数据结构 TSS 签名请求 iTunes/Finder连接设备 向 tessellation.apple.com 发送POST请求 APTicket 返回 服务器验证通过 接收CMS封装的 .shsh 或 .apticket 文件 固件烧录 开始刷机 使用签名票据解锁Bootloader加载权限

sequenceDiagram

participant User

participant Device

participant iTunes

participant AppleServer as tessellation.apple.com

User->>Device: 点击“更新”

Device->>iTunes: 请求启动恢复流程

iTunes->>Device: 获取ECID、ApNonce等参数

iTunes->>AppleServer: POST /sign TSS请求体(JSON)

AppleServer-->>iTunes: 返回APTicket.blob (CMS格式)

iTunes->>Device: 注入签名并开始刷写固件

Device->>Device: 校验签名有效性,执行LLB/iBoot加载

此流程的关键在于:即使你拥有完整正确的IPSW文件,若无法获得对应的有效SHSH签名,刷机过程将在最后一步失败,表现为错误代码如 3194 或 3000系列 。这意味着苹果已关闭对该固件版本的签名通道。

此外,值得注意的是, OTA更新本身也受SHSH控制 。虽然表面上看OTA是空中推送,无需电脑介入,但实际上在后台仍会触发类似的TSS验证逻辑。只不过由于设备处于正常运行状态,系统可自动完成部分参数采集与请求发送,因此用户体验更为无缝。

2.1.2 TSS请求与APTicket签发过程详解

TSS请求的本质是一个结构化的JSON数据包,其中包含了多个用于身份绑定与防重放攻击的关键字段。以下是典型TSS请求的主要组成部分:

{

"ApNonce": "a8d7e2f0...",

"ApBoardID": 6,

"ApChipID": 8960,

"UniqueBuildID": "b12c3d4e5f...",

"ProductType": "iPhone8,1",

"OSVersion": "15.4",

"BuildIdentity": "iPhone12,3_15.4_19E241"

}

ApNonce :随机数,由SEP(Secure Enclave Processor)生成,防止签名重用。 ApBoardID 和 ApChipID :硬件标识符,用于区分不同主板与SoC型号。 UniqueBuildID :指向具体固件构建版本的哈希值。 ProductType :设备型号字符串(如iPad7,4)。 BuildIdentity :plist中定义的构建标识,关联到IPSW内的Restore.plist。

苹果TSS服务器接收到该请求后,会执行以下步骤:

合法性校验 :确认设备型号与请求固件是否匹配; 签名窗口期判断 :检查当前是否仍在为该固件提供有效签名; 生成APTicket :使用苹果私钥对上述参数集合进行RSA签名,输出CMS格式的二进制blob; 返回响应 :将 .apticket 文件回传给客户端(iTunes/Finder)。

该过程可通过抓包工具(如Wireshark)结合HTTPS解密(需安装iTunes根证书)观察实际通信内容。例如:

openssl cms -in apnonce_ticket.apticket -inform DER -noout -cmsout

执行上述命令可查看CMS结构中的签名者信息与摘要算法(通常为SHA-256 + RSA-2048)。这也说明了为何伪造APTicket极为困难——除非掌握苹果私钥或利用BootROM漏洞绕过验证。

2.1.3 APTicket如何绑定设备并参与启动校验

APTicket一旦签发,便与设备的硬件指纹深度绑定。在后续的刷机过程中,设备的低级引导程序(LLB → iBoot → KernelCache)会在每个阶段调用SEP模块验证当前加载组件的完整性与授权状态。

具体流程如下:

LLB阶段 :加载iBoot前,读取APTicket中的 ApNonce 并与当前设备生成的Nonce比对; iBoot阶段 :验证KernelCache的CMS签名是否来自可信源,且未被篡改; Kernel阶段 :最终确认所有分区映像(如System、Data)均符合原始签名描述。

如果任一环节发现不匹配(如SHSH缺失、Nonce不符、签名无效),设备将拒绝继续启动,并返回错误码。这种逐层递进的信任链设计,使得即便攻击者能修改固件内容,也无法绕过最底层的硬件级验证。

2.2 升级过程中的SHSH动态生成与验证

每一次合法的iOS升级都伴随着一次全新的SHSH签名生成。这个过程看似透明无感,实则蕴含复杂的加密交互与策略控制。理解其动态特性,有助于把握苹果签名政策的时间规律,进而预判未来哪些版本可能保留较长的开放窗口。

2.2.1 设备发起TSS请求的数据结构分析

TSS请求的数据结构由多个层次构成,主要来源于两个方面: 设备端采集的硬件参数 与 固件侧提供的构建元数据 。

参数名 来源 类型 示例值 作用 ApNonce SEP生成 Hex String a1b2c3d4... 抗重放攻击,每次请求唯一 ECID 设备唯一ID Integer 123456789ABCDEF 设备身份标识 UniqueChipID SoC熔丝区 Integer 0x12345678 芯片级唯一性保证 BoardID 主板配置 Integer 6 区分不同PCB设计 ChipID SoC型号 Integer 8960 如A14芯片为8010 ProductType 设备型号 String iPhone13,2 明确设备类别 BuildManifest IPSW内Restore.plist XML Base64 ... 描述支持的分区结构

这些字段共同构成了TSS请求的主体。尤其重要的是 BuildManifest ,它是从IPSW解压后提取的 Restore.plist 文件经Base64编码后的结果,定义了该固件允许刷写的全部分区及其签名要求。

例如,在使用 tsschecker 工具时,可通过以下命令提取并查看BuildManifest内容:

tsschecker -d iPhone13,2 -i 15.4 -o --boardconfig d53gallium --ecid 123456789ABCDEF

该命令将自动生成符合规范的TSS请求体,并尝试向苹果服务器请求签名。输出的日志中可以看到类似:

[INFO] Sending TSS request to https://tessellation.apple.com/sign

[DEBUG] Request Body: {"ApNonce":"...", "ApBoardID":6, ...}

[SUCCESS] Received APTicket for iOS 15.4 (19E241)

Saved as: ./shsh2/iPhone13,2_15.4_19E241.shsh

这表明整个流程完全可复现,也为后续离线保存SHSH提供了技术支持。

2.2.2 苹果TSS服务器响应内容解读(SEPOS、Baseband等)

苹果TSS服务器返回的APTicket不仅包含主系统签名,还可能涵盖其他组件的独立签名条目,尤其是基带处理器(Baseband)与安全协处理器(SEPOS)。

典型的响应结构如下(简化表示):

{

"APTicket": { /* CMS签名主体 */ },

"Signatures": {

"LLB": "signed_blob_...",

"iBoot": "signed_blob_...",

"kernelcache.release.iphoneos": "signed_blob_...",

"BasebandFirmware": "bb_sig_...",

"SEPOS": "sep_os_sig_..."

}

}

Baseband Firmware :蜂窝网络模块的固件签名,影响通话与信号功能; SEPOS :Secure Enclave的操作系统镜像签名,涉及Touch ID/Face ID安全; Trust Cache :现代iOS中用于加速App加载的可执行白名单签名。

这些附加签名的存在说明: 即使主系统能降级,若基带或SEPOS无法匹配原有签名,也可能导致设备变砖或功能异常 。这也是为什么某些“降级成功”但无法激活电话服务的根本原因。

更进一步地,苹果近年来引入了 Signed Image Ticket (SIT) 机制,将多个签名打包成统一结构,提升效率与安全性。SIT采用ASN.1编码格式,嵌套在CMS容器内,仅能在具备完整密钥链的设备上解析。

2.2.3 签名有效性窗口期与“开放签章”的时间规律

苹果通常在新版本发布后保留旧版本 3~7天 的签名通道,之后永久关闭。这一策略被称为“ 短暂开放签章 ”,目的在于:

允许用户回滚存在重大Bug的新版本; 防止开发者因强制升级导致兼容性问题; 控制旧漏洞的扩散周期。

通过对历史数据的统计分析(来源:ipsw.me API + @Axi0mX 监测记录),可归纳出以下规律:

新版本发布时间 旧版本关闭时间 平均间隔(小时) iOS 15.4 → 15.5 2022-05-16 2022-05-23 iOS 16.0 → 16.1 2022-10-24 2022-11-01 iOS 17.0 → 17.1 2023-09-18 2023-09-25 iOS 15.7.1 → 15.7.2 2023-03-27 2023-04-05

⚠️ 注意:小版本修复更新(如15.7.1→15.7.2)有时会延长关闭时间,可能是出于安全紧急响应考虑。

因此,最佳的SHSH备份时机是在 新版本发布的第一时间 ,而非等待几天后再行动。延迟可能导致错过黄金窗口。

2.3 降级限制的根本原因:签名关闭机制

许多用户误以为“不能降级”是因为新系统删除了向下兼容能力,但实际上, iOS内核始终保留下位兼容性 。真正阻止降级的,并非技术障碍,而是 SHSH签名的缺失 。

2.3.1 为何苹果会在新版本发布后关闭旧版签章

苹果关闭旧版签章的核心动机是维护生态安全。每一个已发布的iOS版本都可能存在未公开的漏洞(0-day),黑客常利用这些漏洞实现越狱或提权攻击。若长期保持旧版本签名开放,则相当于为恶意行为提供“逃生舱口”。

举例来说: - iOS 9.3.5 存在著名的 Pangu越狱漏洞 ,直到2021年仍有设备借此越狱; - 若苹果不关闭该版本签名,攻击者即可反复刷回9.3.5实施持久化控制。

因此,签名关闭是一种主动防御策略,属于“ 安全失效设计 ”(Security by Obsolescence)范畴。

2.3.2 用户无法降级的真实技术障碍并非版本差异而是SHSH缺失

假设某用户正运行iOS 16.5,希望降级至16.2。尽管两者功能相近、架构一致,只要苹果已关闭16.2的签名,iTunes就会报错:

The requested version of iOS cannot be installed on this device because it is not signed.

此时,即使手动替换IPSW、修改hosts文件,也无法绕过TSS验证,除非满足以下条件之一:

本地缓存有有效的SHSH blob ; 通过fakeTSS代理伪造签名响应 ; 设备存在BootROM漏洞,可跳过验证 (极少数情况)。

否则,刷机必然失败。

2.3.3 案例分析:iOS 15.4向15.3降级失败的日志追踪

某开发者尝试使用iTunes恢复iPhone 12 Pro至iOS 15.3,日志显示:

May 10 14:22:10 computer instproxy[234] : Sending request: {

Request = Restore;

...

}

May 10 14:22:11 apple-tss[567] : TSS evaluation failed:

Status: 410 Gone

Body: {"message":"Signing AppleCare for this build has expired"}

HTTP状态码 410 Gone 明确表示该固件已不再接受签名请求。对应的iTunes错误码为 3194 ,其本质就是TSS拒绝响应。

解决方案只有两种: - 提前保存了15.3的SHSH,则可通过自定义IPSW+本地TSS代理完成降级; - 否则只能等待社区发布基于漏洞的降级工具(如checkra1n配合特定版本)。

2.4 SHSH作为“时间钥匙”:突破版本封锁的可能性

SHSH之所以被称为“时间钥匙”,是因为它能让用户在未来任意时刻,“打开”过去某个短暂开放过的固件版本之门。只要有有效的SHSH blob,就能绕过苹果服务器的实时验证,实现非官方路径刷机。

2.4.1 已保存SHSH如何绕过服务器验证

原理在于: 苹果设备在校验SHSH时,并不强制联网查询,而是接受本地注入的合法签名 。只要签名包含正确的 ApNonce 、 ECID 等参数,且格式正确(CMS/RSA),设备便会认为这是“官方签发”的票据。

实现方式如下:

使用 img4tool 或 tsschecker 提取原始IPSW; 将预先保存的 .shsh 文件注入到Custom IPSW中; 搭建本地TSS代理(如 fakeTSS ),拦截对 tessellation.apple.com 的请求; 修改主机hosts文件,将域名指向本地代理; 在DFU模式下使用 idevicerestore 或 futurerestore 执行恢复。

futurerestore -t saved_shsh/15.3.shsh \

--no-baseband \

custom_ipsw/iPhone14,2_15.3_custom.ipsw

该命令将强制使用本地SHSH完成验证,跳过苹果服务器。

2.4.2 利用本地缓存签名实现非官方路径刷机

iTunes在成功升级后,会自动缓存最后一次使用的SHSH blob(位于 ~/Library/Apple Computer/Preferences/com.apple.iTunes.plist 或临时目录)。虽然苹果未公开支持此功能用于降级,但第三方工具(如 TinyUmbrella)曾利用这一点提取缓存签名。

然而,自iTunes 12.7起,苹果逐步移除了本地缓存机制,转而依赖在线验证,使得自动备份变得不可靠。因此, 主动手动备份SHSH已成为唯一可靠手段 。

2.4.3 实践前提:设备未完全激活新固件前的窗口期利用

有一种特殊情形允许“无SHSH降级”:即在设备首次开机设置前中断升级流程。例如:

设备开始从iOS 15.3升级至15.4; 在进度条完成前强制断电或退出恢复模式; 此时系统尚未完成最终激活,TSS票据仍有效; 可尝试重新进入DFU模式,使用原固件+缓存签名恢复。

此方法成功率有限,且依赖运气与精确操作,远不如提前保存SHSH稳妥。

综上所述,SHSH不仅是iOS升级流程中的必要组件,更是打破版本封锁、实现自由系统管理的核心资源。掌握其生成、存储与应用机制,是高级用户掌控设备命运的技术基石。

3. SHSH文件的生成逻辑与服务器验证全流程

在苹果iOS设备的固件更新和恢复机制中,SHSH(Signed Hash)签名不仅是系统安全架构的核心组件,更是决定用户能否跨越版本封锁实现降级操作的关键“时间钥匙”。理解SHSH文件的生成过程及其在整个TSS(Ticket Signing Service)验证链中的流转路径,是掌握现代iOS越狱、定制刷机以及长期固件保留能力的前提。本章将深入剖析SHSH从设备端发起请求到苹果TSS服务器响应并完成本地验证的完整技术流程,揭示其背后复杂的加密通信机制、硬件绑定特性以及多层信任链构建原理。

3.1 SHSH生成的核心要素与依赖参数

SHSH签名并非一个独立存在的静态文件,而是基于一组高度敏感且不可更改的设备唯一参数动态生成的结果。这些参数共同构成了苹果用于识别特定设备是否具备合法安装某版本固件资格的基础依据。只有当所有字段匹配时,苹果TSS服务器才会签发有效的APTicket.blob(即SHSH blob),否则拒绝签名请求。

3.1.1 ECID、Board ID、Unique Chip ID等硬件指纹的作用

每一台苹果设备都拥有多个层级的硬件标识符,它们在TSS请求中扮演着至关重要的角色:

参数名称 全称 是否可变 在SHSH中的作用 ECID Exclusive Chip ID 否(熔断于芯片) 主要设备身份标识,防止伪造 Board ID - 否 区分同一型号不同主板版本(如Wi-Fi/蜂窝版) Unique Chip ID UID 否 芯片级唯一标识,增强防克隆能力 IMEI / Serial Number - 是(部分可重写) 不参与SHSH生成 APNonce Application Processor Nonce 每次重启变化 防止重放攻击

其中, ECID 是最核心的身份凭证。它是一个64位十六进制数值,直接来源于A系列SoC的安全熔丝区(fuses),无法通过软件修改。任何试图伪造ECID的行为都会导致签名验证失败。例如,在使用 tsschecker 工具获取SHSH时,必须准确输入设备的真实ECID:

tsschecker -d iPhone8,1 -i 12.5.7 -e 0x123456789ABCDEF --boardconfig N71m

参数说明: - -d : 设备标识符(如iPhone8,1代表iPhone 6s) - -i : 目标iOS版本 - -e : 十六进制格式的ECID(注意前缀为0x) - --boardconfig : 对应设备的Board Configuration代码

该命令会构造一个符合苹果TSS协议规范的请求体,并向 tessellation.apple.com 发起HTTPS POST请求以获取当前仍开放签名的固件对应的APTicket。

逻辑分析:

此命令执行过程中, tsschecker 内部首先读取对应设备的 BuildManifest.plist 文件(通常来自IPSW镜像包),从中提取出所有允许被签名的分区信息(如LLB、iBoot、KernelCache等)。然后根据传入的ECID、Board ID、ApNonce等字段组装成JSON结构化的TSS请求数据体,最终通过TLS加密通道发送至苹果服务器。

{

"ApBoardID": 4,

"ApChipID": 287,

"ApSecurityDomain": 1,

"ApNonce": "a1b2c3d4e5f6...",

"UniqueBuildID": "abc123def456...",

"OSVer": "12.5.7"

}

上述字段均需严格匹配真实设备状态,否则服务器返回 {"error":"Invalid request"} 或空签名。

3.1.2 构建TSS请求包的关键字段说明(ApNonce, UniqueBuildID)

为了防止中间人攻击与签名重放,苹果引入了两个关键随机值: ApNonce 和 UniqueBuildID 。

ApNonce :由设备安全隔区(Secure Enclave Processor, SEP)生成的一次性随机数,每次进入DFU或恢复模式都会刷新。它的存在确保即使攻击者截获了一次成功的SHSH blob,也无法重复使用。 UniqueBuildID :指向特定固件构建版本的唯一哈希标识,嵌入在 BuildManifest.plist 中,用于区分同一iOS版本下的不同编译产物(如修复紧急漏洞的修订版)。

这两个字段的组合使得每个SHSH blob具有极强的时效性和专属性。若尝试用旧ApNonce配合新固件请求,则服务器直接拒绝;反之亦然。

下面是一个典型的TSS请求流程图(Mermaid表示):

sequenceDiagram

participant Device

participant iTunes

participant TSS_Server as tessellation.apple.com

Device->>iTunes: 进入恢复模式,生成ApNonce

iTunes->>Device: 请求ECID、BoardID、ChipID等硬件信息

iTunes->>TSS_Server: POST /sign with JSON payload (含ApNonce)

TSS_Server-->>iTunes: 返回CMS封装的APTicket.blob(含SHSH)

iTunes->>Device: 刷写固件时携带APTicket进行校验

图解:整个TSS请求流程始于设备端生成一次性随机数ApNonce,经由iTunes/Finder聚合其他必要参数后提交至苹果服务器,后者验证无误后签发加密票据。

3.1.3 固件plist配置文件中Manifest与Restore Behavior的关系

每个IPSW固件包内均包含一个名为 BuildManifest.plist 的XML文件,它是TSS请求的数据源之一。该文件定义了哪些组件可以被单独签名,以及它们的兼容性规则。

SupportedProductTypes

iPhone8,1

OSVersion

12.5.7

ProductBuildVersion

16H81

此外, RestoreBehavior 字段决定了恢复行为类型:

RestoreBehavior 值 含义 Erase 完全擦除并重新安装系统 Update 保留用户数据升级 CustomerUpgrade 面向消费者的OTA升级

某些情况下,即使SHSH可用,若请求中指定的 RestoreBehavior 不被支持(如越狱社区常用的 Custom 模式),也会导致签名失败。因此,在手动构建TSS请求时,必须确保 RequestType=Install 或 Restore ,并与目标操作一致。

3.2 从设备到苹果TSS服务器的完整通信链路

SHSH签名的生成并非发生在本地设备上,而是在一次精密协调的客户端-服务器交互之后完成的。这一过程涉及iTunes/Finder、设备本身以及苹果远程TSS服务之间的协同工作。

3.2.1 iTunes/Finder触发TSS请求的具体时机

TSS请求主要在以下三种场景下自动触发:

通过iTunes恢复设备(.ipsw刷机) OTA更新下载完成后准备安装 设备进入DFU或恢复模式并连接电脑

以第一种情况为例,当用户选择“恢复iPhone”功能时,iTunes首先解析所选IPSW包内的 BuildManifest.plist ,收集所需签名的分区列表(如iBoot、KernelCache、AppleLogo等),然后向设备查询当前的ECID、Board ID、Chip ID及ApNonce,并将其打包成标准TSS请求。

注意:自macOS Catalina起,Finder接替了iTunes的设备管理职责,但底层逻辑未变。

3.2.2 HTTPS POST请求发送至tessellation.apple.com的过程剖析

TSS服务的入口地址为:

https://tessellation.apple.com/tss/transmitTiss

这是一个受TLS 1.2+保护的HTTPS端点,仅接受POST方法请求。请求头中必须包含正确的User-Agent和Content-Type:

POST /tss/transmitTiss HTTP/1.1

Host: tessellation.apple.com

Content-Type: application/x-apple-plist+xml

User-Agent: iTunes/12.12.3.0

请求体为Plist格式(XML),示例如下:

ApBoardID

4

ApChipID

287

ApNonce

a1b2c3d4e5f6...

RequestType

Install

OSVersion

12.5.7

服务器收到请求后,会在内部数据库中查找是否存在针对该设备型号、ECID、固件版本的有效签名策略。如果该版本仍在“签章开放期”,则返回如下响应:

APTicket

MII...

这个 APTicket 即是我们常说的SHSH blob,通常保存为 .shsh 或 .shsh2 扩展名。

3.2.3 服务器返回APTicket.blob的结构与加密方式(CMS + RSA)

APTicket采用 CMS(Cryptographic Message Syntax) 格式封装,内部使用RSA-PSS算法进行数字签名,确保证据不可篡改。

# 使用 OpenSSL 查看 CMS 结构

openssl cms -verify -in APTicket.blob -inform DER -noverify -noout

输出显示其签名者为苹果根证书体系下的专用TSS CA,内容包括:

所有已签名的固件组件Hash 设备约束条件(ECID范围、Board ID等) 签名有效期(隐式,由服务器控制)

该blob随后被iTunes缓存至本地目录(Windows: %APPDATA%\Apple Computer\iTunes\SC Info\ ),以便后续离线恢复时复用。

3.3 验证流程中的信任链建立机制

即便获得了有效的SHSH blob,刷机过程仍需经过设备内部多阶段的信任链校验。这是苹果Secure Boot Chain的核心体现。

3.3.1 SEP安全隔区如何参与签名核验

Secure Enclave Processor(SEP)负责管理ApNonce的生成与验证。每当设备尝试加载新固件时,SEP会比对当前运行环境中的ApNonce是否与SHSH blob中记录的一致。如果不符,则立即终止启动流程,防止签名盗用。

3.3.2 LLB、iBoot、KernelCache各阶段加载时的签名比对

iOS启动分为多个阶段,每步都需要验证下一阶段映像的完整性:

graph TD

A[LLB] -->|验证| B[iBoot]

B -->|验证| C[KernelCache]

C -->|验证| D[RootFS]

每个阶段的映像都包含一个CMAC(Cipher-based MAC)或Ambrona签名摘要,存储在APTicket中。加载器在内存中计算实际映像的哈希值,并与SHSH提供的预期值对比。任一环节不匹配即报错。

3.3.3 若SHSH不匹配导致的错误代码(如3194、3000系列)含义解析

错误码 可能原因 3194 hosts未屏蔽 tessellation.apple.com ,服务器返回无效签名 3014 设备未处于正确模式(非DFU) 16 IPSW损坏或签名参数错误 21 固件完整性校验失败(SHA1 mismatch)

例如,错误3194最常见的原因是未能正确修改 hosts 文件,导致iTunes仍尝试连接苹果服务器,而此时目标固件已关闭签章,返回空响应。

解决方案是在 C:\Windows\System32\drivers\etc\hosts 中添加:

127.0.0.1 gs.apple.com

127.0.0.1 swcdn.apple.com

127.0.0.1 setup.icloud.com

强制流量回环,使iTunes转而使用本地缓存的SHSH blob。

3.4 本地缓存与远程验证的协同关系

虽然TSS服务器是SHSH的权威签发方,但苹果也设计了本地缓存机制来提升用户体验。

3.4.1 iTunes自动缓存SHSH的行为条件与局限性

自动缓存生效需满足: - 设备曾成功通过iTunes恢复或升级 - 当时目标固件正处于签章开放期 - iTunes未被清理或重装

缓存路径示例:

~/Music/iTunes/iTunes Music/Mobile Applications/SC Info/

但该机制存在明显局限: - 不支持批量备份多版本 - 缓存易随iTunes更新丢失 - 无法导出供其他工具使用

3.4.2 如何判断当前是否有可用本地签名

可通过以下脚本检测缓存目录中是否存在对应设备的 .shsh 文件:

import os

import glob

ecid = "123456789abcdef" # 替换为实际ECID

pattern = f"/path/to/SC_Info/*{ecid}*.shsh*"

matches = glob.glob(pattern)

if matches:

print("Found cached SHSH:", matches)

else:

print("No local SHSH found.")

3.4.3 手动注入SHSH补丁实现离线恢复的技术可行性

借助 futurerestore 或 irestore 等工具,可将预存的SHSH blob注入自定义IPSW中,绕过苹果服务器验证。

futurerestore -t saved.shsh custom.ipsw

参数说明: - -t : 指定SHSH blob路径 - custom.ipsw : 经过patch的固件包

此方法已在A9以下设备上广泛验证成功,成为实现完美降级的标准流程之一。

综上所述,SHSH的生成与验证是一套融合硬件绑定、加密通信与信任链传递的复杂系统工程。掌握其内在机制,不仅有助于规避常见刷机错误,更为高级越狱与固件考古提供了坚实基础。

4. 使用TinyUmbrella等工具备份SHSH的实践方法

在iOS设备维护与越狱生态中, SHSH签名的备份 是一项至关重要的前置操作。尽管苹果不断强化其固件验证机制,但通过合理利用现有工具对仍处于开放签章状态的固件进行SHSH捕获,用户可以为未来可能的降级或系统恢复保留关键“时间钥匙”。本章节深入探讨主流SHSH备份工具的实际应用、自动化方案构建、常见问题排查以及安全存储策略,旨在为具备一定技术背景的从业者提供一套可落地、可复用、可持续演进的操作框架。

4.1 主流SHSH备份工具的功能对比

随着iOS系统版本迭代和安全机制升级,SHSH备份工具也经历了从图形化便捷操作到命令行精准控制的技术演进。不同工具有各自适用场景,理解其功能差异有助于选择最适合当前设备状态与目标需求的解决方案。

4.1.1 TinyUmbrella的历史地位与操作界面介绍

TinyUmbrella(简称TU)由著名开发者@muscleNerd与@planetbeing主导开发,是2010年代初期最广泛使用的SHSH备份工具之一。它以Java编写,支持Windows、macOS和Linux平台,提供了直观的GUI界面,极大降低了普通用户的使用门槛。

+----------------------------+

| TinyUmbrella GUI |

| |

| [Check TSS Status] |

| [Save SHSH Blobs] |

| [Manage Devices] |

| |

| Device: iPhone5,3 (iPhone 5)|

| ECID: 123456789ABCDEF |

| iOS Version: 9.3.5 |

| Signing: YES |

+----------------------------+

该工具的核心逻辑在于监听iTunes与苹果TSS服务器之间的通信,并自动拦截返回的APTicket.blob文件,将其保存为 .shsh 或 .shsh2 格式。其工作流程如下图所示:

graph TD

A[iTunes启动恢复模式] --> B{TinyUmbrella运行}

B --> C{检测到TSS请求}

C --> D[拦截HTTPS响应]

D --> E[提取CMS封装的APTicket]

E --> F[解析并保存为本地SHSH文件]

F --> G[提示用户备份成功]

代码块示例:TinyUmbrella日志输出片段

[INFO] Detected iTunes restore request for iPhone5,2

[DEBUG] Received TSS response from tessellation.apple.com

[INFO] Extracted APTicket for BuildID: 13G37, ApNonce: a1b2c3d4...

[SAVE] Saved as /blobs/iPhone5_2_13G37.shsh2

参数说明 : BuildID : 对应固件版本的唯一标识,如 13G37 代表iOS 9.3.5。 ApNonce : 随机数,用于绑定本次签名请求,防止重放攻击。 .shsh2 扩展名表示采用新版结构化签名格式,兼容后续工具链。

虽然TinyUmbrella操作简便,但其局限性日益明显:依赖过时的Java环境、无法处理现代设备的Secure Enclave协商过程、不支持A12及以上芯片组的新签名机制(如SEP T2验证)。此外,自2016年后官方停止更新,导致其在iOS 10以后系统中兼容性大幅下降。

4.1.2 tsschecker命令行工具的优势:灵活性与精准控制

相较于图形化工具, tsschecker 成为当前专业级SHSH管理的事实标准。该项目由Luca Todesco(后由axi0mX维护)开发,基于C语言实现,具备高度可脚本化特性,适用于批量处理多设备、多固件版本的签名请求。

安装方式如下(以macOS为例):

# 安装Homebrew(若未安装)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 克隆tsschecker源码并编译

git clone https://github.com/tihmstar/tsschecker.git

cd tsschecker

make && sudo make install

执行一次典型SHSH获取命令:

tsschecker \

-d iPhone10,3 \

-i 13.3 \

--boardconfig D221AP \

--ecid 123456789ABCDEF \

--save-path ./shsh_backups/

逐行逻辑分析 : -d iPhone10,3 : 指定设备型号(iPhone X); -i 13.3 : 请求iOS 13.3版本的签名; --boardconfig D221AP : 提供主板配置信息,确保请求包完整性; --ecid : 输入十六进制ECID(需去除前导零); --save-path : 指定输出目录,生成 .shsh2 文件。

此工具的优势体现在以下几个方面:

特性 描述 实时性 可查询苹果当前是否仍在签署某版本固件 精确性 支持指定BuildID而非仅版本号,避免歧义 扩展性 可集成至Shell脚本、CI/CD流水线中 跨平台 支持macOS/Linux,可通过Wine在Windows运行

更重要的是, tsschecker 能直接对接苹果公开的 api.ipsw.me/v4 接口,动态获取最新固件元数据,无需手动查找IPSW下载地址。

4.1.3 Prometheus、FutureRestore套件在现代越狱中的整合应用

进入iOS 15时代后,传统的单一SHSH备份已不足以支撑完整降级流程。以Prometheus为代表的现代越狱工具链引入了“nonce设置”与“个性化IPSW”概念,要求SHSH签名必须包含特定 ApNonce 值才能被加载。

在此背景下, futurerestore 与 tsschecker 形成协同闭环:

flowchart LR

A[tsschecker] -->|生成带固定nonce的SHSH| B(Prometheus)

B --> C[注入签名到Custom IPSW]

C --> D[futurerestore --use-shsh-cache]

D --> E[完成不完美降级]

例如,在使用 futurerestore 时,常配合以下指令:

futurerestore \

--no-reboot \

--restore-custom \

--latest-baseband \

--use-pwndfu \

custom_ipsw_with_shsh.ipsw

其中 --use-pwndfu 表示利用PWNED DFU模式绕过部分校验,而所有签名有效性依赖于前期通过 tsschecker 正确捕获的SHSH blob。

综上所述,工具选型应根据实际需求权衡:

工具 适用人群 推荐场景 TinyUmbrella 初学者、历史设备持有者 iOS 6–9时代的快速备份 tsschecker 中高级用户、开发者 多设备自动化管理、精确版本控制 Prometheus套件 越狱研究者 需要nonce操控的高级降级实验

4.2 基于tsschecker的自动化备份方案

对于拥有多个测试设备或致力于长期维护旧版系统的团队而言,手动逐个备份SHSH效率低下且易出错。构建基于 tsschecker 的自动化脚本体系,不仅能提升工作效率,还能实现签名资产的系统化归档。

4.2.1 安装依赖环境(OpenSSL、libipatcher等)

tsschecker 本身依赖若干底层库来完成加密解密与网络请求处理。在Ubuntu/Debian系统中,建议预先安装以下组件:

sudo apt update

sudo apt install -y \

libssl-dev \

libcurl4-openssl-dev \

libjson-c-dev \

git build-essential

这些库的作用分别为:

libssl-dev : 提供RSA/CMS签名解析能力; libcurl : 支持HTTPS协议与苹果服务器交互; libjson-c : 解析ipsw.me API返回的JSON格式数据。

安装完成后,可通过以下命令验证 tsschecker 是否正常工作:

tsschecker -h | head -n 10

预期输出应显示帮助菜单,表明编译成功。

4.2.2 提取设备ECID与生成正确请求参数的方法

ECID(Exclusive Chip ID)是每台设备独一无二的硬件标识符,通常以十进制或十六进制表示。获取方式有多种:

方法一:通过iTunes+FUTurerestore提取

futurerestore -v /dev/null 2>&1 | grep "ECID"

# 输出示例: [INFO] Got device info: ecid: 0x1a2b3c4d5e6f

方法二:使用libimobiledevice工具链

ideviceinfo -k UniqueChipID

# 返回纯数字形式ECID(需转换为十六进制)

将十进制转为十六进制(Python脚本):

ecid_decimal = 123456789123

ecid_hex = hex(ecid_decimal)[2:].upper()

print(f"ECID Hex: {ecid_hex}") # 输出: 1CBE99B6E3

注意:某些工具要求ECID去前导零,因此最终传入 tsschecker 的参数应为 --ecid 1CBE99B6E3 而非 0x... 。

4.2.3 批量下载多个设备、多版本固件SHSH的脚本编写

以下是一个完整的Shell脚本示例,用于批量备份三台设备(iPhone 8、iPad Pro、iPhone X)在iOS 14.8、15.0、15.1三个版本下的SHSH签名:

#!/bin/bash

# batch_save_shsh.sh

devices=(

"iPhone10,1|D201AP|iPhone_8"

"iPad6,7|J127AP|iPad_Pro"

"iPhone10,3|D221AP|iPhone_X"

)

versions=("14.8" "15.0" "15.1")

ecids=(

"1A2B3C4D5E" # iPhone 8

"6F7G8H9I0J" # iPad Pro

"K1L2M3N4O5" # iPhone X

)

output_base="./shsh_archive"

for i in "${!devices[@]}"; do

IFS='|' read -r model board name <<< "${devices[i]}"

ecid="${ecids[i]}"

mkdir -p "$output_base/$name"

for ver in "${versions[@]}"; do

echo "[*] Saving $name ($model) @ $ver ..."

tsschecker \

-d "$model" \

-i "$ver" \

--boardconfig "$board" \

--ecid "$ecid" \

--save-path "$output_base/$name" \

--overwrite > /dev/null 2>&1 && \

echo "[+] Success" || echo "[-] Failed or not signed"

done

done

逻辑分析 : 使用数组结构组织设备信息,便于扩展; IFS='|' 实现字符串分割,提取型号、板型、别名; --overwrite 确保每次都能获取最新状态; 重定向日志至 /dev/null 保持终端整洁。

该脚本可每日定时运行(结合cron),形成持续监控机制:

# 添加定时任务(每天凌晨2点执行)

crontab -e

# 写入:

0 2 * * * /path/to/batch_save_shsh.sh

4.3 备份过程中的常见问题与解决方案

即使使用成熟工具,SHSH备份仍可能因参数错误、网络异常或苹果策略变更而失败。掌握常见故障的诊断方法至关重要。

4.3.1 “No signatures for this device and firmware”错误应对

这是最常见的报错之一,意味着苹果已关闭对该固件的签名通道。

根本原因分析 : 苹果通常在新版本发布后48小时内关闭旧版签章。一旦关闭,TSS服务器将不再返回有效APTicket。

解决策略 : - 使用 tsschecker --list-supported 查看当前哪些版本仍可签名: bash tsschecker -d iPhone10,3 -l - 若发现无可用签名,可尝试寻找社区共享的SHSH仓库(见第七章); - 或等待临时重新开放(罕见,如iOS 14.4.2曾短暂重开);

4.3.2 ECID输入错误导致签名无效的排查步骤

ECID错误会导致即使获取到SHSH也无法用于真实设备恢复。

排查流程表 :

步骤 操作 验证方式 1 核对ECID来源 使用 ideviceinfo 二次确认 2 检查进制格式 十六进制不应含 0x 前缀 3 验证长度一致性 A11及以下为8字节,A12+为10字节 4 测试签名有效性 使用 img4tool 解析blob

4.3.3 如何验证已保存SHSH文件的有效性(使用img4tool检测)

img4tool 是验证SHSH完整性的权威工具。安装后执行:

img4 -s backup.shsh2 -m manifest.im4m

成功输出应包含类似信息:

[BLOB] Successfully parsed incoming SHSH blob

[APNONCE] Found ApNonce: a1b2c3d4...

[SEPOSSIBLE] SEP Policy: Allow downgrade to 15.0.2

若提示 Invalid signature 或 Unknown ECID ,则说明该SHSH不可用。

4.4 安全存储与管理策略

SHSH文件本质上是通往过去iOS世界的“密钥”,一旦丢失或泄露,可能导致设备永久失去降级能力。

4.4.1 分类归档不同设备、不同iOS版本的SHSH文件

推荐目录结构如下:

/shsh_storage/

├── iPhone_8/

│ ├── 14.8.shsh2

│ └── 15.0.shsh2

├── iPad_Pro/

│ └── 15.1.shsh2

└── manifest.json # 记录每个文件对应的BuildID、ECID、日期

配合Git进行版本追踪:

git init

git add .

git commit -m "Initial SHSH backup for Q3 2025"

4.4.2 使用GitHub私有仓库或加密硬盘进行长期保存

GitHub私有库优点 :支持跨设备同步、具备历史回滚能力; 缺点 :存在意外公开风险,务必设置为private;

替代方案:使用VeraCrypt创建加密容器,存储所有SHSH文件:

veracrypt --create shsh_vault.hc --password=yourpass --filesystem=exfat

4.4.3 避免泄露ECID等敏感信息的安全注意事项

ECID虽不能单独解锁设备,但结合其他信息可能被用于定向攻击。防范措施包括:

不在公共论坛张贴完整SHSH文件; 在分享时移除ECID字段(仅保留通用签名部分); 定期审计存储位置访问权限。

唯有将技术操作与安全管理并重,方能在日益收紧的苹果生态中守住最后一道自由之门。

5. 不完美降级的概念界定与实现条件分析

在iOS设备的越狱和固件管理生态中,“不完美降级”(Semi-restore 或 Semi-downgrade)是一项极具技术挑战性的操作,它代表了用户在无法获得完整系统启动能力的前提下,仍能将设备恢复至一个更早版本的iOS系统。这一过程虽不能让设备像正常刷机那样长期稳定运行,但在特定场景下具备不可替代的价值。理解“不完美降级”的本质、前提条件及其操作边界,是掌握高级越狱技术和历史系统研究的关键一步。

与传统的“完美降级”不同,不完美降级并不追求系统重启后的持久可用性。相反,它的目标是在一次引导过程中加载旧版固件,并在内存中运行该系统的内核与用户空间环境,即使设备断电后无法再次自动进入该系统。这种机制依赖于BootROM级别的漏洞利用和临时签名注入,其成功与否高度依赖于设备硬件架构、已保存的SHSH签名以及是否存在可利用的引导链漏洞。

随着苹果对安全机制的不断强化,尤其是从A8芯片开始引入Secure Enclave和更严格的签名校验流程,不完美降级的适用范围逐渐缩小,主要集中于A5到A7芯片组的设备上。这些设备由于BootROM存在未修补的漏洞(如limera1n),为研究人员提供了绕过Apple签名验证的能力。因此,探讨不完美降级不仅是对技术可行性的分析,更是对iOS安全演进路径的一次逆向追溯。

本章将深入剖析不完美降级的技术定义、实现所需的核心条件、关键操作节点及实际应用场景,结合代码示例、工具调用逻辑与系统交互流程图,全面揭示这一复杂而精巧的操作体系。

5.1 不完美降级的技术定义与典型场景

5.1.1 与“完美降级”的本质区别:能否正常启动与持久运行

“完美降级”指的是用户通过合法或非官方手段将iOS设备恢复至某个旧版固件后,设备可以正常启动、持续运行且无需每次重新执行降级流程。这意味着整个系统分区已被持久写入旧版固件镜像,包括iBoot、LLB、DeviceTree等关键组件均已完成替换,并通过了SEP(Secure Enclave Processor)的完整性校验。只要设备不断电或未触发恢复模式,即可像普通升级一样正常使用。

相比之下,“不完美降级”则不具备这种持久性。其核心特征在于: 设备仅能在当前会话中运行旧版系统,一旦重启或断电,必须重新进入DFU模式并重复整个降级流程才能再次访问该系统 。这是因为不完美降级通常只修改了部分内存中的引导加载程序行为,或者通过漏洞注入了一个临时的、未经签名的内核补丁(kpatch),而并未真正持久化地更改设备的固件内容。

特性 完美降级 不完美降级 是否需要每次重启后重刷 否 是 系统是否写入NAND闪存 是 部分/否 依赖BootROM漏洞 视情况而定 必须依赖 支持设备范围 A4及更早(部分A5) A5-A7为主 用户体验 接近原生系统 存在功能缺失或不稳定

例如,在使用 futurerestore 配合有效的SHSH blob进行完美降级时,工具会在恢复过程中向设备发送完整的定制IPSW包,并确保所有组件都经过正确签名验证。而在不完美降级中,如使用 irestore 或 custom restore 方式加载iOS 6.x系统到iPhone 4S,虽然系统界面可以短暂出现,但基带可能无法初始化,Wi-Fi驱动缺失,甚至无法完成首次设置向导。

不完美降级的本质:内存级覆盖而非存储级重写

不完美降级之所以“不完美”,根本原因在于它未能突破苹果的持久化签名校验机制。现代iOS设备在启动过程中会经历多个阶段的签名检查:

LLB (Low-Level Bootloader) 校验 iBoot iBoot 校验 KernelCache KernelCache 校验 RootFS

如果其中任意一环的签名无效或缺失,系统将拒绝加载。而不完美降级往往只能在iBoot阶段通过漏洞跳转执行自定义代码,从而加载一个被修补过的内核,但这个修补仅存在于RAM中,不会写入NAND。因此,下次开机时,原始签名校验流程依旧生效,导致旧系统无法再次启动。

graph TD

A[设备开机] --> B{是否处于DFU模式?}

B -- 是 --> C[加载外部IPSW]

B -- 否 --> D[执行内置LLB]

D --> E[校验iBoot签名]

E --> F[校验KernelCache签名]

F --> G[加载RootFS]

G --> H[正常启动]

C --> I[注入kpatched内核]

I --> J[绕过签名验证]

J --> K[临时运行旧系统]

K --> L[断电即失效]

上述流程图清晰展示了两种降级路径的差异:完美降级走的是绿色路径C→I→J→K,且最终将结果固化;而不完美降级则停留在K→L的临时状态。

5.1.2 典型案例:iPhone 4S从iOS 9降级至iOS 6的可行性边界

iPhone 4S(搭载A5芯片)是目前最常被用于不完美降级的经典机型之一。其主要优势在于:

A5芯片的BootROM中存在著名的 limera1n 漏洞(基于ASN.1解析错误) 可支持iOS 5.0–9.3.6等多个版本 社区已有成熟的越狱工具链(如absinthe、redsn0w)

假设某用户希望将一台原本运行iOS 9.3.6的iPhone 4S降级至iOS 6.1.6(最后一个支持该设备的越狱版本),其技术路线如下:

确认已有iOS 6.1.6的有效SHSH blob - 使用 tsschecker 查询当前是否仍可获取签名: bash tsschecker -d iPhone4,1 -i 6.1.6 -o -s - 若返回 Signed ,说明苹果仍在签署该版本(极罕见);否则需依赖本地保存的blob。 准备Custom IPSW镜像 - 下载官方iOS 6.1.6 IPSW文件 - 使用 IPSW Tools 或 PyIPSW 提取固件内容 - 注入已保存的SHSH blob 至 BuildManifest.plist 利用limera1n漏洞进入pwned DFU模式 - 使用 redsn0w 或 odysseus 工具链触发漏洞 - 在特定时间点按下音量键组合以激活exploit 执行不完美恢复 - 调用 irestore 命令强制刷入: bash irestore -w custom_616.ipsw --boardconfig n90ap --ecid 123456789ABCDEF 系统短暂运行后提示“无法激活”或卡在设置向导

此时系统已成功加载iOS 6.1.6内核,但由于缺少持久化分区写入和Baseband固件兼容问题,设备无法长期使用。然而,对于越狱研究者而言,这已经足够用于调试早期越狱插件或分析旧版SpringBoard行为。

⚠️ 注意:此操作可能导致基带损坏或IMEI丢失,建议仅在备用设备上尝试。

5.1.3 当前支持不完美降级的主要设备型号范围(A5-A7芯片组)

截至目前,能够实现不完美降级的设备主要集中在以下几类:

设备型号 芯片组 支持起始版本 关键漏洞 工具链 iPhone 4 A4 iOS 4.0–7.1.2 limera1n redsn0w, sn0wbreeze iPhone 4S A5 iOS 5.0–9.3.6 limera1n absinthe, p0sixspoon iPad 2 A5 iOS 4.3–9.3.5 limera1n redsn0w, futurerestore iPad 3 A5X iOS 5.1–9.3.6 limera1n futurerestore iPhone 5 A6 iOS 6.0–9.3.6 escap0wn evasi0n, p0sixspoon iPhone 5c A6 iOS 7.0–9.3.6 escap0wn futurerestore iPad 4 A6X iOS 6.0–10.3.3 escap0wn futurerestore

其中,A5设备因 limera1n 漏洞为永久性BootROM漏洞(无法通过软件更新修复),成为最理想的实验平台。而A6/A6X设备虽有 escap0wn 漏洞,但仅在特定固件版本中有效,限制了其灵活性。

值得注意的是, A7及以上芯片组(如iPhone 5s及以后)几乎无法实现任何形式的不完美降级 ,原因包括:

引入Secure Enclave(SEP)加强签名校验 LLB与iBoot之间增加了更多加密层 所有系统组件采用APTicket统一验证 BootROM漏洞极少且已被陆续修补

因此,当前社区的研究重点仍集中于A5-A6设备的维护与复现工作。

5.2 实现不完美降级的前提条件

5.2.1 必须拥有目标固件的有效SHSH签名

没有有效的SHSH blob,任何降级尝试都将失败。SHSH作为苹果TSS服务器签发的APTicket的一部分,是证明该固件版本对该设备合法授权的关键凭证。即使设备具备BootROM漏洞,若无对应版本的SHSH,iTunes/Finder仍会在恢复过程中拒绝加载IPSW。

获取SHSH的方式主要有两种:

实时请求 :在苹果仍在签署某版本时,通过iTunes连接设备触发TSS请求。 本地缓存或备份 :使用TinyUmbrella、tsschecker等工具提前保存。

推荐使用 tsschecker 自动化备份:

tsschecker -d iPhone4,1 -i 6.1.6 -e 123456789ABCDEF --save-path ./shsh/

参数说明: - -d : 指定设备标识符(可通过 ideviceinfo 获取) - -i : 目标iOS版本 - -e : 设备ECID(十六进制,无冒号) - --save-path : 输出目录

执行后生成 .shsh 或 .shsh2 文件,结构为CMS封装的RSA签名数据,可用于后续注入。

如何验证SHSH有效性?

使用 img4tool 检测:

img4tool -e -s firmware.shsh2

输出应包含类似信息:

ApNonce: 1a2b3c4d...

SEPOrCEP: CEP

BoardID: 5

ChipID: 8947

若字段匹配当前设备,则签名有效。

5.2.2 设备BootROM漏洞的存在与否决定可利用性(如limera1n)

BootROM漏洞是实现不完美降级的“钥匙”。不同于用户态或内核态漏洞,BootROM位于只读存储器中,出厂即固化,无法通过OTA更新修复。因此,只要某设备存在未修补的BootROM漏洞,理论上就永远可以被利用。

以 limera1n 为例,其原理是利用ARM处理器在处理某些异常中断时的寄存器状态泄露,结合ASN.1编码缺陷,在LLB阶段劫持控制流。具体触发方式为:

进入DFU模式 发送特制payload导致LLB崩溃 控制PC寄存器跳转至shellcode地址

该漏洞影响所有A5及更早芯片,构成了不完美降级的基础支撑。

5.2.3 越狱工具链是否支持目标旧版本系统

即便成功降级至旧系统,若缺乏对应的越狱工具,也无法获得root权限或安装第三方应用。因此,选择目标版本时必须确认社区是否提供成熟越狱方案。

例如: - iOS 6.1.6 → absinthe 2.0(完美越狱) - iOS 7.1.2 → evasi0n7(支持iPhone 4S) - iOS 9.3.5 → doubleh3lix(支持iPad 2/3/4)

若目标系统无可用越狱,则即使降级成功,也只能作为“展示机”使用。

5.3 操作流程中的关键节点控制

5.3.1 进入DFU模式与伪造TSS响应的技术细节

DFU(Device Firmware Update)模式是唯一允许直接刷写底层固件的状态。进入方法(以iPhone 4S为例):

关机 按住Power + Home 3秒 松开Power,继续按Home 10秒

此时设备无显示,但iTunes可识别为“恢复模式”。

为绕过苹果服务器验证,需伪造TSS响应。常用方法是搭建本地 fakeTSS 服务:

# fake_tss_server.py

from http.server import HTTPServer, BaseHTTPRequestHandler

class TSSHandler(BaseHTTPRequestHandler):

def do_POST(self):

self.send_response(200)

self.end_headers()

with open("APTicket.blob", "rb") as f:

self.wfile.write(f.read())

if __name__ == "__main__":

server = HTTPServer(('127.0.0.1', 5555), TSSHandler)

server.serve_forever()

然后修改hosts文件:

127.0.0.1 gs.apple.com

并将iTunes流量指向本地服务。

5.3.2 使用irestore或Custom IPSW配合signature proxy服务

irestore 是一个命令行恢复工具,支持手动指定APTicket:

irestore -w custom.ipsw \

--tss-url http://127.0.0.1:5555 \

--boardconfig n90ap \

--ecid 123456789ABCDEF

逻辑分析: - -w : 写入模式 - --tss-url : 指定本地TSS代理 - --boardconfig : 匹配设备配置名 - --ecid : 提供唯一设备ID

该命令会拦截原本发往苹果服务器的TSS请求,替换为本地预存的签名,从而实现离线恢复。

5.3.3 降级后首次启动的稳定性问题与数据丢失风险提示

不完美降级后常见问题包括:

基带未初始化 → 无信号 Wi-Fi/BT模块缺失 → 功能受限 文件系统损坏 → 自动重启 设置向导卡死 → 需重新降级

建议操作前备份重要数据,并接受“仅限测试用途”的现实定位。

5.4 不完美降级的实际应用场景

5.4.1 为研究历史越狱技术保留原始测试环境

许多经典越狱技术(如JailbreakMe 3.0)依赖特定内核漏洞,仅在iOS 4–6范围内存在。通过不完美降级,研究人员可在真实设备上演练exploit开发流程。

5.4.2 应对新型勒索软件或系统崩溃后的极端恢复手段

当设备因恶意配置描述文件或越狱冲突导致无限重启时,不完美降级可作为一种“急救通道”,临时进入旧系统清除异常项。

5.4.3 开发者调试早期App兼容性的特殊需求

某些企业级应用或教育软件仅适配iOS 6时代的API。开发者可通过不完美降级快速验证旧版行为,避免虚拟机模拟失真。

综上所述,不完美降级虽非日常操作,却是iOS安全研究生态中不可或缺的一环。它不仅承载着技术探索的意义,也延续了经典设备的生命力。

6. 利用已保存SHSH实现旧版固件的完整恢复流程

在现代iOS设备维护与越狱生态中,能够成功回退至历史版本固件是极为关键的能力。尽管苹果公司通过不断关闭旧版固件签名通道来强化系统安全性与更新强制性,但若用户提前备份了对应设备和固件组合的有效SHSH签名,则仍具备绕过远程验证、实现本地恢复的技术可行性。本章节将深入解析如何基于已保存的SHSH文件,构建一个完整的降级恢复流程,涵盖环境准备、操作执行、结果验证以及常见故障应对策略。整个过程不仅依赖于对底层通信机制的理解,还需精确控制设备状态、网络拦截行为及自定义固件包的合法性构造。

该流程的核心逻辑在于“欺骗”设备使其相信当前所刷入的旧版固件仍然处于苹果官方签名有效期内——这一目标通过结合 Custom IPSW镜像制作 、 本地TSS代理服务部署 与 DNS屏蔽技术 共同达成。尤其值得注意的是,此方法适用于支持不完美降级(如A5-A7芯片组)或具备BootROM漏洞的设备,在这些特定条件下,即便无法长期稳定运行,也能完成系统级别的还原操作。

为确保恢复成功率,所有步骤必须严格按照时间顺序与参数一致性进行配置。任何微小偏差,例如ECID输入错误、ApNonce不匹配或IPSW构建不当,都可能导致签名校验失败并触发3194等经典错误代码。因此,本章不仅提供详细的操作指南,还将引入工具链协同机制、数据流路径分析图示以及可复用的自动化脚本模板,帮助高级用户建立可靠的降级工作流。

6.1 准备工作:构建可信赖的降级环境

要成功实施基于SHSH的旧版固件恢复,首要任务是创建一个干净、可控且隔离于苹果实时验证体系的操作环境。这一步骤决定了后续所有操作的基础稳定性,任何外部干扰(如自动更新的iTunes、未屏蔽的Apple服务器连接)均可能导致签名请求被重定向至远程TSS服务器,从而暴露本地无有效签名的事实。

6.1.1 使用洁净操作系统避免iTunes干扰

推荐使用一台独立的计算机作为专用降级主机,操作系统建议选择轻量级Linux发行版(如Ubuntu LTS)或macOS虚拟机(VMware Fusion / Parallels Desktop),以避免Windows平台上iTunes自动后台更新带来的兼容性问题。关键点在于确保使用的iTunes/Finder版本与目标iOS版本兼容,并禁用所有自动更新功能。

# 示例:在macOS终端中锁定iTunes版本(防止SIP保护下修改困难)

sudo softwareupdate --ignore "iTunes"

逻辑分析 : softwareupdate --ignore 命令用于阻止系统推送指定应用的更新。对于需要长期维持特定iTunes版本的用户而言,这是防止意外升级导致工具链失效的重要防护措施。 参数说明 : - --ignore :添加到忽略列表,系统不再提示更新; - "iTunes" :需准确匹配Apple发布的软件名称。

此外,应关闭防火墙中的出站规则监控,或明确放行相关端口(如5555用于fakeTSS代理监听),确保本地服务通信不受阻断。

6.1.2 下载匹配的Custom IPSW镜像并嵌入SHSH签名

Custom IPSW是指经过修改的iOS固件镜像,其内部包含已被注入合法SHSH签名的APTicket.blob文件,从而使设备在恢复过程中无需向苹果服务器请求新签名。

常用工具包括 ipsw 和 idevicerestore ,但更高效的方式是使用 tsschecker 配合 img4tool 完成签名提取与注入:

# 步骤1:使用tsschecker下载并保存SHSH

./tsschecker -d iPhone8,1 -i 12.5.7 -o -w

# 步骤2:提取APTicket.blob

./img4tool -e -s ./shsh/12.5.7.shsh -m BuildManifest.plist -o APTicket.blob

# 步骤3:解包原始IPSW

unzip iPhone_4.7_P3_12.5.7_16H81_Restore.ipsw -d custom_ipsw/

# 步骤4:替换其中的Restore.plist中的APTicket引用(部分机型需patch)

cp APTicket.blob custom_ipsw/Firmware/all_flash/

逐行解读 : 1. -d iPhone8,1 指定设备型号(iPhone 6s); 2. -i 12.5.7 目标iOS版本; 3. -o -w 表示输出到shsh目录并等待签名窗口开放; 4. img4tool -e 提取CMS封装内的签名字节; 5. -m BuildManifest.plist 提供构建元信息以正确解析签名域; 6. 最终生成可用于注入的APTicket.blob。

工具 功能定位 是否必需 tsschecker 获取/验证SHSH签名 ✅ 必需 img4tool 解析CMS签名结构 ✅ 必需 ipsw 解压/打包IPSW 推荐 idevicerestore 替代iTunes命令行刷机 可选

graph TD

A[原始IPSW] --> B{解压}

B --> C[KernelCache, LLB, iBoot等组件]

D[已保存SHSH] --> E[img4tool提取APTicket.blob]

E --> F[注入Firmware分区]

C --> G[重新打包为Custom IPSW]

G --> H[用于本地恢复]

该流程展示了从标准IPSW到可信任Custom IPSW的转换路径,强调了签名注入的关键节点。

6.1.3 配置本地TSS代理服务器(如tsschecker –save-path结合fakeTSS)

为了彻底切断设备与苹果TSS服务器(tessellation.apple.com)之间的通信,需搭建本地签名响应服务,即“Fake TSS Server”。当设备发起TSS请求时,代理会立即返回预存的SHSH blob,模拟合法签发过程。

使用 fake_tss.py (Python实现)启动本地代理:

# fake_tss.py 简化版示例

from http.server import HTTPServer, BaseHTTPRequestHandler

import os

class TSSHandler(BaseHTTPRequestHandler):

def do_POST(self):

self.send_response(200)

self.end_headers()

with open("APTicket.blob", "rb") as f:

self.wfile.write(f.read())

if __name__ == "__main__":

server = HTTPServer(("127.0.0.1", 5555), TSSHandler)

print("Fake TSS Server running on port 5555...")

server.serve_forever()

逻辑分析 :此脚本创建了一个简单的HTTP服务器,监听5555端口,接收POST请求后直接返回本地存储的APTicket.blob内容。设备在DFU模式下恢复时会尝试连接tessellation.apple.com:443,通过host文件重定向至此服务即可完成拦截。

参数说明 : - HTTPServer(("127.0.0.1", 5555)) :绑定本地回环地址与指定端口; - do_POST :处理iTunes发出的TSS签名请求; - APTicket.blob :必须与当前设备型号、iOS版本完全一致。

配合修改hosts文件:

# /etc/hosts 添加以下条目

127.0.0.1 gs.apple.com

127.0.0.1 tessellation.apple.com

这样所有原本发往苹果验证服务器的请求都会被导向本地fakeTSS服务,实现离线签名验证闭环。

6.2 实施恢复操作的核心步骤

完成前期准备后,即可进入实际恢复阶段。此过程要求极高精度的时间控制与设备状态管理,任何中断都可能导致恢复失败甚至变砖风险。

6.2.1 将设备置于DFU模式的操作规范(时间点精准把控)

DFU(Device Firmware Update)模式是唯一允许加载未经苹果在线签名确认的固件状态。进入方式因设备而异,以iPhone 6s为例:

关机状态下,同时按住 电源键 + Home键 8秒; 松开电源键,继续按住Home键约10–15秒; iTunes检测到“恢复模式”设备(显示iTunes+USB图标)即表示成功。

注意 :若屏幕亮起Apple Logo,则已进入普通恢复模式而非DFU,需重新尝试。

可通过第三方工具 libimobiledevice 中的 ideviceenterdfu 自动化进入:

ideviceenterdfu

该命令依赖设备已启用开发者模式并信任电脑,适合批量操作场景。

6.2.2 修改hosts文件屏蔽苹果验证服务器(续用本地签名)

如前所述,必须确保设备无法访问真实TSS服务器。可在恢复前再次确认hosts配置:

# Linux/macOS 查看当前配置

cat /etc/hosts | grep apple

# Windows 路径:%SystemRoot%\System32\drivers\etc\hosts

必要时刷新DNS缓存:

# macOS

sudo dscacheutil -flushcache

sudo killall -HUP mDNSResponder

# Windows

ipconfig /flushdns

若未清除缓存,系统可能仍尝试连接原始IP地址,绕过host拦截。

6.2.3 执行restore命令并监控日志输出以判断成败

推荐使用命令行工具替代图形化iTunes,以便实时捕获底层日志:

# 使用 idevicerestore 恢复Custom IPSW

./idevicerestore -w -l DEBUG custom_ipsw/BuildManifest.plist

参数说明 : - -w :擦除设备并写入新固件; - -l DEBUG :输出详细调试日志; - BuildManifest.plist :指明固件清单文件。

典型成功日志片段:

DEBUG: Sending TSS request to http://127.0.0.1:5555 ...

DEBUG: Received APTicket from local server

INFO: Restore operation completed successfully

反之,若出现:

ERROR: TSS request failed: No valid signing ticket

则表明签名注入失败或fakeTSS未正常运行。

6.3 成功恢复后的验证与后续处理

6.3.1 检查系统版本、功能完整性与基带状态

重启设备后,首先进入设置 → 通用 → 关于本机,确认: - 软件版本是否为预期旧版; - IMEI是否正常显示(排除基带丢失); - Wi-Fi/Mobile Data能否连接。

使用 Clutch 或 libimobiledevice 工具检查基带固件:

ideviceinfo | grep "Baseband"

若返回空值或“N/A”,说明基带未正确恢复,可能需重新刷入含BBTicket的完整包。

6.3.2 是否需要重新越狱及选择合适的越狱工具(如evasi0n、Pangu)

旧版固件通常存在已知漏洞,但需根据具体版本选择匹配的越狱方案。例如:

iOS 版本 支持越狱工具 类型 iOS 9.3.5 Phoenix Bootrom + Pangu9 不完美 iOS 7.1.2 evasi0n7 完美 iOS 6.1.3 redsn0w 半完美

推荐优先使用社区验证过的稳定版本,避免使用测试版越狱导致系统崩溃。

6.3.3 数据迁移与用户设置重建的最佳实践

由于降级过程通常涉及全盘擦除,原有数据无法保留。建议采用以下策略恢复关键信息:

提前通过iCloud或第三方备份工具导出联系人、照片; 使用 iMazing 或 PhoneView 手动提取App文档目录; 在新系统中手动重新登录账户并同步云数据。

注意:不同iOS版本间数据库格式可能存在差异,直接恢复备份可能导致冲突。

6.4 常见失败情形与应急对策

6.4.1 错误3194:host文件未生效或签名注入失败

现象 :iTunes报错“无法恢复 iPhone — 发生未知错误 (3194)”

原因分析 : - hosts文件未正确配置; - DNS缓存未刷新; - APTicket未正确注入Custom IPSW; - fakeTSS服务未运行或端口占用。

解决方案 : 1. 检查 /etc/hosts 是否包含 tessellation.apple.com 127.0.0.1 2. 使用 ping tessellation.apple.com 确认解析为127.0.0.1 3. 启动fakeTSS服务并查看日志是否有请求到达 4. 重新生成APTicket并验证其有效性:

img4tool -S -s saved.shsh

输出应包含 Signed manifest 字样,否则签名无效。

6.4.2 错误1015/16:IPSW不匹配或签名参数错误

原因 : - 使用了错误的BuildManifest.plist; - 设备型号(Board ID)、ECID、ApNonce不匹配; - IPSW未针对目标设备定制。

应对措施 : - 使用 tsschecker -d [device] -i [version] --list-files 核对所需文件列表; - 确保所有标识符与原始备份时一致; - 重新打包IPSW并验证完整性。

6.4.3 设备卡在Apple Logo:尝试重启并重新执行流程

若设备长时间停留在Apple Logo界面,可能是内核加载失败或签名链断裂。

应急步骤 : 1. 长按电源+Home键强制重启; 2. 再次进入DFU模式; 3. 使用相同Custom IPSW重试恢复; 4. 若持续失败,考虑更换另一份已验证有效的SHSH文件。

极端情况下可尝试使用checkra1n等基于BootROM漏洞的引导器辅助启动。

flowchart LR

A[设备卡在Apple Logo] --> B{是否能进DFU?}

B -->|能| C[重新恢复Custom IPSW]

B -->|不能| D[使用checkra1n尝试引导]

D --> E[进入越狱环境备份数据]

E --> F[评估硬件健康状态]

此流程图提供了从死机状态中恢复的基本决策路径,适用于高级用户排查复杂故障。

7. iOS 3.1等历史版本SHSH的应用价值与社区传承意义

7.1 早期iOS系统的独特技术特征回顾

7.1.1 iOS 3.x时代的系统架构与安全性水平

iOS 3.x(2009–2010年)是苹果移动操作系统的早期成熟阶段,其内核基于XNU混合内核,运行在ARMv6或ARMv7架构处理器上(如S5L8920、S5L8930)。相较于现代iOS,该时期的安全机制极为薄弱: - 代码签名验证不完整 :早期iBoot和LLB阶段的签名校验存在绕过可能。 - 无ASLR完全支持 :内存布局可预测,便于ROP链构造。 - 文件系统加密较弱 :使用简单的AES-128-CBC加密,且密钥存储位置暴露。

这一时期的漏洞利用门槛较低,为越狱社区提供了广阔的技术实验空间。

7.1.2 第一代App Store上线前后生态变化的技术影响

随着iOS 3.0正式引入App Store,第三方应用分发从“野蛮生长”转向沙盒化管理。然而,此时的沙盒规则尚未完善,权限控制松散,导致: - 应用可通过私有API访问底层服务; - 越狱工具(如PwnageTool)能直接修改系统分区并植入Cydia; - 苹果签发机制未强制绑定设备唯一标识,TSS请求结构简单,使得批量保存SHSH成为可能。

# 示例:tsschecker 请求 iOS 3.1.3 签名(iPhone 3GS)

./tsschecker -d iPhone3,1 -i 3.1.3 -e 123456789ABCDEF --boardconfig n88ap --save-path shsh_ios3/

参数说明: -d :设备型号; -i :目标固件版本; -e :ECID(十六进制); --boardconfig :对应设备主板配置名; 此命令将向苹果TSS服务器发起请求,若签名仍开放则返回APTicket.blob。

7.1.3 BootROM漏洞普遍存在的时代背景

在A5芯片之前,多数设备(如iPhone 3GS、iPad 1)搭载的BootROM存在永久性漏洞(如limera1n),其利用方式如下表所示:

设备型号 芯片组 存在BootROM漏洞 可实现降级类型 iPhone 3GS S5L8920 是(limera1n) 不完美降级 iPad 1 A4 是 完美降级 iPod touch 3G S5L8922 是 不完美降级 iPhone 4 (GSM) A4 否 需依赖SHSH iPhone 4 (CDMA) S5L8930 是 可越狱降级

这些硬件级漏洞允许攻击者在最底层执行任意代码,即使没有有效SHSH也能进入定制恢复环境。

7.2 保存古老SHSH的科研与收藏价值

7.2.1 数字考古视角下的移动操作系统演化研究

长期保存iOS 3.1等版本的SHSH文件,相当于保留了数字文明演进的关键节点。研究人员可通过还原原始系统环境分析: - 苹果安全模型的迭代路径; - 用户交互设计的历史变迁; - 移动浏览器(WebKit)的性能瓶颈与漏洞分布。

例如,在逆向分析iOS 3.1.3的SpringBoard时,发现其未启用堆栈保护机制(Stack Canary),极易受到缓冲区溢出攻击。

7.2.2 教学演示中展示越狱起源与破解原理的理想平台

高校计算机安全课程常以iOS 3.x作为教学案例,因其具备以下优势: - 漏洞利用链清晰(如greenpois0n 使用 userland + kernel exploit); - 工具源码公开(如redsn0w、PwnageTool); - 可视化越狱过程便于理解启动流程各阶段权限提升。

graph TD

A[设备进入DFU模式] --> B{iTunes发送TSS请求}

B --> C{苹果TSS服务器验证}

C -->|签名有效| D[返回APTicket.blob]

C -->|签名关闭| E[拒绝安装]

D --> F[TinyUmbrella缓存SHSH]

F --> G[未来用于离线恢复]

7.2.3 经典设备(如初代iPad)维持原始体验的文化意义

对于收藏者而言,保留未经更新的iOS 3.2.2系统不仅是一种怀旧行为,更是对产品生命周期完整性的尊重。许多博物馆级展品要求“出厂状态运行”,而SHSH正是实现这一目标的技术保障。

7.3 社区驱动的SHSH共享与协作机制

7.3.1 iPhone Dev Team、The Chronic Dev Team的历史贡献

这两个组织在2010年代初主导了越狱工具开发,并推动建立了首个公共SHSH归档项目——SaurikIT。他们通过GitHub托管脚本,帮助用户自动化备份流程。

7.3.2 在Reddit、XDA、MacRumors论坛中获取帮助的渠道

当前活跃的技术讨论集中于以下平台: - r/jailbreak:提供iOS 3.x降级教程链接; - XDA Forums > iOS Development:分享自定义IPSW构建方法; - MacRumors Guides:详述如何使用futurerestore进行签名注入。

7.3.3 公共SHSH仓库项目的运作模式与伦理争议

部分网站(如api.ipsw.me/v4/shsh)提供匿名上传/下载服务,但引发争议: - 支持观点:促进知识自由流通,延续老设备生命; - 反对观点:可能被用于非法刷机牟利,违反苹果EULA。

因此,负责任的社区倡导“仅为自己设备备份”的原则。

7.4 面向未来的设备维护策略建议

7.4.1 对仍在使用的老旧设备制定长期固件保护计划

建议采取以下措施: 1. 使用脚本定期检查是否有新固件开放签名; 2. 将所有SHSH文件按 _.shsh 命名归档; 3. 备份至多个物理介质(SSD+光盘)以防数据丢失。

7.4.2 利用现代工具延续经典设备生命力的技术展望

借助 futurerestore 与 img4tool ,可实现跨版本签名重用。例如:

# 提取并验证SHSH有效性

img4tool -a -s manifest.plist -o apnonce.txt

# 注入签名并恢复

futurerestore -t shsh/iphone3gs_313.shsh --no-baseband custom_ipsw.ipsw

7.4.3 推动开源社区完善自动化备份与恢复框架的发展方向

未来应发展集成式解决方案,包含: - 自动识别设备ECID; - 实时监控苹果签章状态; - 一键生成可启动Custom IPSW; - 内建错误诊断模块(如自动解析3194错误原因)。

此类工具不仅能服务复古爱好者,也为数字遗产保存提供基础设施支持。

本文还有配套的精品资源,点击获取

简介:SHSH(Software SHSH blobs)是苹果iOS设备在系统恢复和升级过程中用于验证固件合法性的数字签名,对实现自制固件和不完美降级至关重要。本文详细介绍了SHSH的原理、备份方法及在iPhone等设备上的应用,涵盖其在越狱、版本回退中的实际用途。通过案例“3.1shsh”说明了特定iOS版本SHSH文件的价值,帮助高级用户掌握如何利用SHSH突破官方固件限制,实现个性化系统管理。

本文还有配套的精品资源,点击获取

相关推荐

德玛西亚大礼包是什么?如何获取更多福利?
365bet体育线上

德玛西亚大礼包是什么?如何获取更多福利?

📅 12-30 👁️ 5786
[云路由器] AP隔离的使用设置
365bet娱乐网站

[云路由器] AP隔离的使用设置

📅 01-22 👁️ 9480
攻城掠地御宝什么最好
3654687

攻城掠地御宝什么最好

📅 02-04 👁️ 4889
画中世界全关卡图文攻略大全 画中世界1-6全章节通关流程