[原创]分享一些关于苹果iTunes授权流程的东西
发表于:
2018-7-5 11:40
11179
[原创]分享一些关于苹果iTunes授权流程的东西
<?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
被鸡蛋面编辑
,原因: