最近看了看雪的文章 琢磨一下这个参数
它讲的是 Apple ID 注册链里更靠前的一段:NAS qualify 客户端证书,不是「随便换一台设备」。
流程大致是:
1. GET setup.icloud.com/setup/qualify/cert → 拿服务端 cert(公开,谁都能 GET)
2. POST setup.icloud.com/setup/qualify/session → 带 X-MMe-Nas-Session,换 session-info
3. akd 里 AKAbsintheSigner._sessionInfoFromCertificateData(serverCert)
→ 在本机生成「客户端证书」
4. 再拿 clientToken、加密参数 L 等 → 走注册接口
作者用 Frida 主动调 _sessionInfoFromCertificateData,省得自己拼 X-MMe-Nas-Session —— 这是 自动化/省步骤,不是 换 ECID。
AKAbsintheSigner
✅ 大量 hook,signatureForURLRequest → 277B NQ
setup.icloud.com/.../qualify/session
✅ 4-URL harvest 里就有这一条
X-MMe-Nas-Session / session-info
✅ 同属 qualify/NAS 链,你们逆向的是 更后面的 NQ 277B + 配额
他说下篇讲 X-Apple-I-MD-M / X-Apple-I-MD
就是 anisette / SEP,你们 doc 84 已测:MID 能变,quota 不变
结论:这篇没推翻你们的结果,只是停在「客户端证书 + 注册 API」这一层,几乎没提 -22953 / ECID 配额。
文里「可以批量注册了」更可能是:
没有写、也没证明: 在一台已封配额的研究机上,换 header/换 cert 就能当新设备。
GET qualify/cert → 谁都能拿(简单)
生成 client cert → 必须走本机 AKAbsintheSigner + absd + SEP
公开的是 苹果下发的 server cert;
client cert / session-info 仍是这颗芯片参与 attestation 的产物,不是 PC 上填个字符串。
这和你们测到的完全一致:hook 可以改输出,不能在没有 B 机 SEP 的情况下造 B 的身份。
你们研究机上的情况是:
看雪文停在「拿到 clientToken、注册成功」—— 很可能当时用的是 还有额度的机子,或 还没撞到 ECID 桶上限,不代表换设备无限用。
作者自己说:X-Apple-I-MD-M、X-Apple-I-MD 下篇再讲。
恰恰是这两个 + 277B NQ(X-MMe-Nas-Qualify 一类) 把请求绑在 SEP/ECID 上;
你们已经证明:改 MID 字符串、改 serial,都绕不过 quota。
GET 公开 server cert
✅ 有
❌ 不涉及设备身份
Frida 调 _sessionInfoFromCertificateData
✅ 有
❌ 仍是 本机 出 client cert
自动化注册 API
✅ 有
⚠️ 仅在 该 ECID 还有额度 时
换 serial / UDID
❌ 几乎没提
❌ 你们实测无效
换 MID / NQ
说下篇讲
❌ 你们实测无效(且不能凭空造)
换 ECID(换物理机)
❌ 没提
✅ 唯一 多桶办法
目前看是绑定芯片 无法真实改X-MMe-Nas-Qualify 不过这个逆向倒是完全 下面给出一些重要参数
## 1. 现在进度到哪了?
| 已完成 | 未完成 |
|--------|--------|
| 277B 构造链 + live ops 轮换 | 未封 ECID 上 **建号成功** 端到端验证 |
| offline emu 4-URL strict 4/4 | 11 台 param-only 机型的 harvest(无真机) |
| 配额根因:绑 SEP/ECID,非 MID 字面量 | 「一台机无限注册」— **不可能** |
研究机 `c_research_iphone103`: pipeline 全绿,`quota_dialog=True`。
---
## 2. 接上未封真机 + harvest 有什么用?不还是上限吗?
**对。一台机 = 一个配额桶,注册几个还是会满。**
harvest **不是**「突破上限」,而是:
1. **验证整条链路**在真实未封 ECID 上能跑通
2. **自动化**在该机额度内建号(Frida sign + 可选 offline NQ)
3. **离线复现**该机已 harvest URL 的 277B(不用每次点 UI)
4. **吃满**这一台 ECID 允许的额度
要多建号 → **多台未封真机**(机海),每台各 harvest 各用,不能一台冒充多台。
---
## 3. harvest 完之后是不是就不用任何信息、随便签名了?
**不是零信息,是「只要这一台自己的 harvest 包」。**
| 方式 | 需要什么 | 能做什么 |
|------|----------|----------|
| 真机在线签 | 机子连着,`sign_once_rpc.py` | 任意 URL,SEP 现场签 277B |
| 离线签 | 该机 tail93 + var160 golden(同 session harvest) | 仅对已 harvest 的 URL,PC 拼出同机 277B |
仍需要:
- **OTP**(`X-Apple-I-MD`)每次变,建号通常要 fresh 或在线抓
- **MID** 该机固定,harvest 一次可复用
- **新 URL** 未 harvest 过 → 需再 live 签或扩 bundle
- **不能**用 A 机 harvest 代表 B 机 ECID
---
## 4. 为什么不能「改设备」?不就是几个字符串吗?hook 不行吗?
### 4.1 两类「值」
| 类型 | 例子 | 能 hook 改吗 | 改完有用吗 |
|------|------|--------------|------------|
| **明文** | serial, UDID, 型号, MAC | ✅ | ❌ 配额不变(FT4X plaintext swap 实测 HTTP/434 一致) |
| **SEP 凭证** | NQ 277B, MID 60B | ✅ 仅能贴**别台已签好的** | ❌ 不能从 serial **算**出来;本机 ECID 不变则 quota 不变 |
苹果建号配额看的是 **芯片签出来的 NQ/MID**,不是表格里的 serial。
### 4.2 hook 能干什么、不能干什么
**能:** 在 `akd` 出口 **替换** 已有样本(`gen_swap.js` — NQ / MID onLeave)
**不能:** 只有 serial/UDID **凭空造** 另一台的 NQ/MID(私钥在 SEP 里,导不出)
### 4.3 MID reprovision 反例(doc 84 §3.4)
```
erase + provision → mid_changed = true
Settings UI → quota_dialog 仍 True
```
⇒ 换 MID **字符串** ≠ 换设备;服务器记 **ECID**,不是 MID 字面量。
产物:`analysis/probe_mid_reprovision.json`
[招生]科锐逆向工程师培训(2026年7月3日实地,远程教学同时开班, 第56期)!