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

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

2018-7-5 11:40
11179

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEplistPUBLIC"-//Apple//DTDPLIST1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<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和对应的grappaData,将grappaData传给手机。(之前这一块困惑了挺长一段时间,之前老的流程是调用一个itunes的导出函数ATHostConnectionSendPowerAssertion,其内部同时做了生成grappaID、grappaData及向手机发送请求两步操作,因为需求要求将这两步操作分离,所以前者使用内部函数ITunesFun0来做,但是发现明明生成了grappaData和grappaID,下面一步的流程却怎么也走不通,可能有不少人卡在这里过,具体如何做的因为可能会涉及客户利益(人家有竞争对手的)不便透露,这里只粗略地讲一下流程)。
主要相关协议包如下:

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEplistPUBLIC"-//Apple//DTDPLIST1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<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授权而获得。
此段加密一共涉及五个iTunes内部函数,相关计算参数说明如下:
 int CalcRSBuffer(char *deviceID,
                               int *itunesAttr,
                               unsigned char *fairPlayCer,// 第一步返回的证书数据
                               int fairPlayCerLen, //证书数据长度
                               long long *appidlist, // 要授权的appleid列表
                               int appidcount, // appleid列表长度
                               void *rq_buffer, //输入的rq文件
                               int rq_len, // rq文件长度
                               char *path, // SCInfo文件路径
                               unsigned char **prsBuffer,// 输出的rsbuffer
                               int *rsBufferlen) // 输出的rsbuffer长度
{

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-7-5 12:58 被鸡蛋面编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (11)
雪    币: 18
活跃值: (1059)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
暗示:Github自己找。
最后于 2018-7-5 16:45 被猪会被杀掉编辑 ,原因:
2018-7-5 16:44
1
雪    币: 268
活跃值: (3238)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
可以通过模拟pc端文件,,绕过验证么?
2018-7-5 22:56
0
雪    币: 5
活跃值: (526)
能力值: ( 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
雪    币: 16
活跃值: (112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hcw
8
确实会卡住,直接call 函数,EAX = FFFF59C6,Grappa key could not be established。
调接口倒是可以跑的通。不知道问题出在哪。
2019-11-23 15:24
0
雪    币: 16
活跃值: (112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hcw
9
hcw 确实会卡住,直接call 函数,EAX = FFFF59C6,Grappa key could not be established。 调接口倒是可以跑的通。不知道问题出在哪。
已解决,第一次的那个CALL只能调一次。
2019-12-3 16:40
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
你好,请问像 iPhone XR 这种没有 40 位 UDID 的设备需要如何适配?试过在生成 afsync.rs 的时候会失败,具体是内部函数生成的 PrivateKey 不可用。
2020-9-24 09:03
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
https://github.com/iOS-Auth/iOSAuthRuntime
这里有开源服务端版本,包括新UDID编码,Grappa获取,RS生成,帐号ID授权。
2023-6-1 10:49
0
雪    币: 0
活跃值: (375)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12

之前研究过itunes注册和itunes登录。有kbsync算法和x_apple_ActionSignature算法。

最后于 2024-1-27 22:05 被慈悲佛祖编辑 ,原因:
2024-1-27 22:05
0
游客
登录 | 注册 方可回帖
返回
//