首页
社区
课程
招聘
[原创]分享一些关于苹果iTunes授权流程的东西
发表于: 2018-7-5 11:40 11995

[原创]分享一些关于苹果iTunes授权流程的东西

2018-7-5 11:40
11995

众所周知,itunes与手机通信协议内容是一串plist结构(实际是XML)的包,使用TCP协议(send函数)发送给苹果的PC端驱动,再由驱动转成USB

信号传输给手机。plist结构通常是这个样子的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"

"f3fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3q4H3M7r3I4W2i4K6u0W2j5$3!0E0i4K6u0r3c8q4c8p5M7#2)9J5c8W2m8J5L8%4m8W2M7Y4c8&6e0r3W2K6N6q4)9J5k6o6q4Q4x3X3f1H3i4K6u0W2k6s2c8V1">
<plist version="1.0">
<dict>
    
<key>request name</key>
<data>request data</data>
</dict>

一般这个data节点也可能是string、int之类的,以主要传输的内容定,有的为便于传输会经过base64加密,有的出于安全考虑会经过SSL加密(如

开启/关闭通信服务)。


key=GetValue string=FairPlayCertificate

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEplistPUBLIC"-//Apple//DTDPLIST1.0//EN""fd7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3q4H3M7r3I4W2i4K6u0W2j5$3!0E0i4K6u0r3c8q4c8p5M7#2)9J5c8W2m8J5L8%4m8W2M7Y4c8&6e0r3W2K6N6q4)9J5k6o6q4Q4x3X3f1H3i4K6u0W2k6s2c8V1">
<plistversion="1.0">
<dict>
<key>Command</key>
<string>RequestingSync</string>
<key>Params</key>
<dict>
<key>DataclassAnchors</key>
<dict>
<key>Keybag</key>
<string>0</string>
</dict>
<key>Dataclasses</key>
<array>
<string>Keybag</string>
</array>
<key>HostInfo</key>
<dict>
<key>Grappa</key>  // 这一段是关键,GrappaData数据
<data>
AQEEkLjCjFKHLVG0AwLStvibAUBNHUBCyRldlZD7w0VyIC2hhsve
7hwgjWe0vPX0NNUFhMPoDGf5kqtCx1Otu/+7nzEiUcGHKwjGpwgO
FFy2808J
</data>
<key>LibraryID</key>
<string>5ac547ba5322b210</string>
<key>SyncHostName</key>
<string>LP0000</string> 
<key>SyncedDataclasses</key>
<array>
<string>Keybag</string>
</array>
<key>Version</key>
<string>12.4.3.1</string> // itunes版本
</dict>
</dict>
<key>Session</key>
<integer>1</integer>
</dict>
</plist>

将此文件的内容和上面的Data1、grappaID作为关键输入数据来生成一段数据rsBuffer

四、以rsBuffer和grappaID作为主要输入参数调用内部函数ITunesFun2生成一段数据sigBuffer, 将 sigBuffer 数据作为内容生成一个afsync.rs.sig文件,将此文件传给手机即完成授权全部过程。 既完成整个授权流程。

一、上述几段流程都会调用到itunes的内部函数,这些内部函数在底层是相互有关联的,所有如果grappaID或Data1、rsBuffer等数据若不正确会导
致相应的流程走不通。

三、关于处理苹果的代码加密,如果工期催得比较紧的话,可以考虑先处理代码乱序(记得好像是通过一个全局随机种子去生成跳转地址的,在跳转之前是有一

先简单聊一下苹果通信协议:

大体上说一下授权相关流程:

主要分为四步
一、向手机请求一段证书数据,设为Data1:
主要协议包内容:
二、本地生成一个grappaID和对应的grappaData,将grappaData传给手机。(之前这一块困惑了挺长一段时间,之前老的流程是调用一个itunes的导出函数ATHostConnectionSendPowerAssertion,其内部同时做了生成grappaID、grappaData及向手机发送请求两步操作,因为需求要求将这两步操作分离,所以前者使用内部函数ITunesFun0来做,但是发现明明生成了grappaData和grappaID,下面一步的流程却怎么也走不通,可能有不少人卡在这里过,具体如何做的因为可能会涉及客户利益(人家有竞争对手的)不便透露,这里只粗略地讲一下流程)。
主要相关协议包如下:

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEplistPUBLIC"-//Apple//DTDPLIST1.0//EN""abeK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3q4H3M7r3I4W2i4K6u0W2j5$3!0E0i4K6u0r3c8q4c8p5M7#2)9J5c8W2m8J5L8%4m8W2M7Y4c8&6e0r3W2K6N6q4)9J5k6o6q4Q4x3X3f1H3i4K6u0W2k6s2c8V1">
<plistversion="1.0">
<dict>
<key>Command</key>
<string>RequestingSync</string>
<key>Params</key>
<dict>
<key>DataclassAnchors</key>
<dict>
<key>Keybag</key>
<string>0</string>
</dict>
<key>Dataclasses</key>
<array>
<string>Keybag</string>
</array>
<key>HostInfo</key>
<dict>
<key>Grappa</key>  // 这一段是关键,GrappaData数据
<data>
AQEEkLjCjFKHLVG0AwLStvibAUBNHUBCyRldlZD7w0VyIC2hhsve
7hwgjWe0vPX0NNUFhMPoDGf5kqtCx1Otu/+7nzEiUcGHKwjGpwgO
FFy2808J
</data>
<key>LibraryID</key>
<string>5ac547ba5322b210</string>
<key>SyncHostName</key>
<string>LP0000</string> 
<key>SyncedDataclasses</key>
<array>
<string>Keybag</string>
</array>
<key>Version</key>
<string>12.4.3.1</string> // itunes版本
</dict>
</dict>
<key>Session</key>
<integer>1</integer>
</dict>
</plist>


三、这一步会用到一个PC端的本地授权文件afsync.rq,和一些SCInfo文件。前者经上述流程后会由手机输给PC,itunes的dll会将它保存在固定目录下,后者通过itunes的UI界面操作向苹果官方请求为当前PC授权而获得。

[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

最后于 2018-7-5 12:58 被鸡蛋面编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (12)
雪    币: 18
活跃值: (1214)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
暗示:Github自己找。
最后于 2018-7-5 16:45 被猪会被杀掉编辑 ,原因:
2018-7-5 16:44
1
雪    币: 624
活跃值: (5258)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
可以通过模拟pc端文件,,绕过验证么?
2018-7-5 22:56
0
雪    币: 5
活跃值: (546)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
不大明白你说的意思
2018-7-6 09:53
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2018-7-9 23:24
0
雪    币: 18
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
能加我扣扣详谈吗
270298647
2019-4-11 23:30
0
雪    币: 11
活跃值: (202)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hcw
8
确实会卡住,直接call 函数,EAX = FFFF59C6,Grappa key could not be established。
调接口倒是可以跑的通。不知道问题出在哪。
2019-11-23 15:24
0
雪    币: 11
活跃值: (202)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hcw
9
hcw 确实会卡住,直接call 函数,EAX = FFFF59C6,Grappa key could not be established。 调接口倒是可以跑的通。不知道问题出在哪。
已解决,第一次的那个CALL只能调一次。
2019-12-3 16:40
0
雪    币: 9
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
你好,请问像 iPhone XR 这种没有 40 位 UDID 的设备需要如何适配?试过在生成 afsync.rs 的时候会失败,具体是内部函数生成的 PrivateKey 不可用。
2020-9-24 09:03
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
86cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6A6e0#2y4Q4x3X3c8m8N6i4c8Z5i4K6u0r3K9f1!0e0b7i4g2@1K9q4u0#2L8Y4c8A6L8h3f1`.
这里有开源服务端版本,包括新UDID编码,Grappa获取,RS生成,帐号ID授权。
2023-6-1 10:49
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
这个开源库所用到的iTunes版本12.4.3.1,安装目录并没有发现iTunes.dll文件(32位和64位都安装过了),只有iTunesCore.dll这个文件,iTunes.dll这个文件哪里来的?
2025-12-5 15:17
0
游客
登录 | 注册 方可回帖
返回