面向 iCloud 认证、CloudKit/MMCS 备份下载以及 Octagon/PCS 恢复(ADP、恢复密钥、锁定模式)的实验性 .NET/WPF 取证工具包。由 Forensis-Lab 开发的研究软件——高度实验性;Apple 私有 API 可能一夜之间发生变化。
公开实验阶段 — 一个 WPF(.NET 10)应用,用于 iCloud 登录、设备备份列表以及通过 CloudKit/MMCS 下载。

研究/实验室软件。并非成品:使用未记录的 Apple API,存在账号封禁风险,不提供任何担保。请仅使用您自己的 Apple ID,并自行承担风险。
我叫 Giordano Sconti。我与取证实验室 Forensis-Lab 合作,同时担任软件研究员和技术顾问(Consulente Tecnico)。
本软件以 MIT 许可证发布,但它归属于 Forensis-Lab 取证实验室。
本项目应被视为高度实验性的,因为 Apple 的内部 API 可能一夜之间发生变化。
我之所以公开这个项目,是因为它在取证工作中很有价值——在极端情况下,我们必须恢复那些除了通过设备本身之外无法访问的备份和 CloudKit 数据。
与我使用过的商业工具不同,我实现了对自己个人备份的稳定且完整的下载,无论 ADP 启用还是禁用(当然,在启用时需要知道设备的 Octagon PIN 或恢复密钥)。
当锁定模式等保护措施启用且 iCloud.com 关闭时,它同样可以工作。
这个项目大约花费了七个月的研究。如果没有 Cursor 编码代理模型,耗时会更长:我只有在可能的工作时间或深夜才有时间。我尽量保持模块化的代码组织——希望我做到了。
如果您想请我喝杯咖啡,我更希望您感谢 Forensis-Lab,或者以其他形式表达认可。
任何想要尝试该软件、提出改进建议或帮助完成剩余功能的人都是受欢迎的。
您可以使用付费的编码代理模型(请避免使用免费的——它们在代码正确性方面往往不可靠)。重要的是您始终审查生成的代码,并且未经同意不得擅自挪用第三方代码。拉取请求将被非常仔细地审查。
联系方式:[email protected]
本项目中的每一行代码都归属于 Forensis-Lab,由我直接授权。任何使用或修改都必须保持归属于 Forensis-Lab。
如果您想在运行自己的 anisette 栈之前试用该软件,请私下联系我,申请访问我的 Anisette Server。
https://giordanosconti.github.io/iCloudKitExtractor/

恢复密钥解锁使用一个 Octagon 端点,该端点可以导出完整的加密 TLKShares 集合。从这些共享中,还可以恢复与恢复密钥对等方相关联的那些(签署恢复密钥的公钥的 SHA-384)。这样可以验证给定的恢复密钥是否存在于其中,如果存在,则恢复 CloudKit 区域的 Manatee/PCS KeySet——包括 ADP 保护的备份和钥匙串。
src/iCloudKitExtractorsrc/PhotosViewer(IKE 构建时复制到 viewer-payload)AnisetteServer(+ 可选桥接项目)用于 OTP / ADIdocs/ 下dotnet build src/iCloudKitExtractor/iCloudKitExtractor.csproj -c Release
dotnet run --project src/iCloudKitExtractor/iCloudKitExtractor.csproj -c Release
项目站点位于 docs/ 目录下(index.html + site.css)。
main 推送到 GitHub。main / folder:/docs。https://giordanosconti.github.io/iCloudKitExtractor/。获取一致的 iPhone/akd 身份的首选路径:OTP 通过 Frida 在设备上生成 → AuthKit/akd,然后由 AnisetteServer 提供。
pip install frida-tools)python 调用(或设置 FRIDA_ANISETTE_PYTHON)fetch_anisette.py(Frida 附加脚本)。通过 FRIDA_ANISETTE_FETCH_PY 设置其路径越狱安装步骤:请参阅下方的 准备越狱 iPhone(详情待补充)。
| 变量 | 必需 | 默认值 | 含义 |
|---|---|---|---|
ANISETTE_SERVER_BACKEND | 是 | coreadi | 必须为 frida(别名:iphone-frida、jb-frida) |
ANISETTE_SERVER_URL / ANISETTE_SERVER_URLS | 否 | http://127.0.0.1:6969 | AnisetteServer 监听的 URL |
ANISETTE_SERVER_PORT | 否 | 6969 | 未设置 URL 时使用的端口 |
ICLOUD_AUTH_MODE | 推荐 | iphone(通过配置) | 使用 iphone 以启用完整的 AuthKit iPhone SRP |
FRIDA_ANISETTE_HOST | 否 | 127.0.0.1:27042 | frida-server 主机:端口(USB 通常通过 iproxy 27042 27042) |
FRIDA_ANISETTE_PROCESS | 否 | akd | 要附加的进程 |
FRIDA_ANISETTE_FETCH_PY | 是* | 启发式路径 | fetch_anisette.py 的绝对路径 |
FRIDA_ANISETTE_PYTHON | 否 | python | Python 可执行文件 |
FRIDA_ANISETTE_LITE | 否 | 1 / true | 轻量附加模式 |
FRIDA_ANISETTE_TIMEOUT | 否 | 60 | 中止生成前的秒数 |
*若未设置 FRIDA_ANISETTE_FETCH_PY,应用仅会搜索少数几个旧版同级路径;请显式设置该环境变量。
可选的应用配置文件:%AppData%\iCloudKitExtractor\anisette.json(authMode、serverUrl)。环境变量会覆盖该文件。
$env:ANISETTE_SERVER_BACKEND = "frida"
$env:ANISETTE_SERVER_PORT = "6971"
$env:FRIDA_ANISETTE_HOST = "127.0.0.1:27042"
$env:FRIDA_ANISETTE_PROCESS = "akd"
$env:FRIDA_ANISETTE_FETCH_PY = "C:\path\to\fetch_anisette.py"
$env:FRIDA_ANISETTE_PYTHON = "python"
$env:FRIDA_ANISETTE_LITE = "1"
$env:FRIDA_ANISETTE_TIMEOUT = "60"
dotnet run --project src/AnisetteServer/AnisetteServer.csproj -c Release -- --backend frida --port 6971
CLI 的 --backend / --port 会覆盖环境变量。
冒烟测试:
curl http://127.0.0.1:6971/health
curl http://127.0.0.1:6971/
期望收到包含机器数据的 JSON(X-Apple-I-MD-M、包含 com.apple.akd 的 X-MMe-Client-Info)。
$env:ANISETTE_SERVER_URL = "http://127.0.0.1:6971/"
$env:ICLOUD_AUTH_MODE = "iphone"
dotnet run --project src/iCloudKitExtractor/iCloudKitExtractor.csproj -c Release
首先在设备上通过 Sileo 安装 Frida(frida-server)和 OpenSSH。
假设为无根越狱(/var/jb/...)。通过 SSH 以 root 身份:
ls -l /var/jb/usr/sbin/frida-server
重新创建 LaunchDaemon plist(LF 换行符,rootless)——无需编辑器:
cat > /var/jb/Library/LaunchDaemons/re.frida.server.plist <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>re.frida.server</string>
<key>ProgramArguments</key>
<array>
<string>/var/jb/usr/sbin/frida-server</string>
<string>-l</string>
<string>0.0.0.0:27042</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>ThrottleInterval</key>
<integer>3</integer>
</dict>
</plist>
EOF
规范化行尾,将 plist 转换为二进制格式,然后(重新)加载守护进程:
tr -d '\r' < /var/jb/Library/LaunchDaemons/re.frida.server.plist > /tmp/frida.plist
mv /tmp/frida.plist /var/jb/Library/LaunchDaemons/re.frida.server.plist
plutil -convert binary1 /var/jb/Library/LaunchDaemons/re.frida.server.plist
killall frida-server 2>/dev/null
launchctl bootout system /var/jb/Library/LaunchDaemons/re.frida.server.plist 2>/dev/null
launchctl bootstrap system /var/jb/Library/LaunchDaemons/re.frida.server.plist
launchctl enable system/re.frida.server
launchctl kickstart -k system/re.frida.server
ps aux | grep '[f]rida-server'
这会将 frida-server 绑定到 0.0.0.0:27042(所有接口),在启动时运行,并保持其存活。在 PC 上,USB 端口转发(iproxy 27042 27042)后设置例如 FRIDA_ANISETTE_HOST=127.0.0.1:27042,或使用设备的局域网 IP。
| 后端 | 使用场景 | 文档 |
|---|---|---|
frida | 真实 iPhone/akd OTP(可用时推荐) | 本 README |
akd-emulated | 软件 ADI worker(目前为 Android 库;目标为 iOS) | docs/EMULATED_AKD.md |
coreadi | Windows CoreADI / AuthKitWin 混合方案 | docs/MAC_ANISETTE.md |
| Mac Docker + bridge | CGNAT / 远程 Mac anisette | docs/ANISETTE_BRIDGE.md |
模拟 akd 示例:
.\scripts\setup-emulated-akd.ps1
另请参阅 docs/IPHONE_INTERNAL_FLOW.md 和 docs/APPLE_MIDSERVICE_PROVISIONING.md。
以 MIT 许可证发布(见 LICENSE)。所有权与署名权归 Forensis-Lab(Giordano Sconti)所有。下游使用或修改必须保留对 Forensis-Lab 的明确署名。
本软件以非官方方式与 Apple 服务通信。Apple 可能随时更改端点。作者不对数据丢失、账户封禁或其他损害承担责任。