我一直在花很多时间看一些成功“复制”的第三方应用程序(尽管我认为不一定完全了解算法,而只是从原始二进制文件中提取逻辑的核心并将其复制到他们自己的程序)模拟具有完整AirPlay镜像支持的Apple TV服务器的主要逻辑,仅举几例:


AirServer(OSX / Windows)
Reflector(OSX / Windows)
AirReceiver(Android)
X-Mirage(OSX / Windows)
AirPin PRO(Android)
EZCast Screen(Android)
小米米莲(Android / runs在小米盒子上)

通过查看他们的反编译代码和网络上的其他参考,大多数协议方面都是已知的/相对容易弄清,而我已经做到了,因此不费吹灰之力,我很难理解这些家伙如何实现这一目标的关键部分与FairPlay解密部分有关(即:并回应了fp-setup的挑战并解密了挑战最后一步中发送的AES密钥。)

他们似乎都从Apple最初的airtunesd中提取了白盒/模糊功能/ fairplayd守护程序代码并将其嵌入到其源代码中,从而委派了对其进行种子/加密/解密的调用。

我注意到在某些iOS设备中该守护程序也存在(最有可能在镜像时用于加密供稿通过AirPlay将屏幕显示到兼容的服务器上),但想知道这与Apple TV随附的显示器有何不同,以及我的假设是否正确(难道这些家伙中的大多数都是从中获取此代码的吗?)。

希望有人对此主题有较早的经验或更多的知识可以阐明一些观点/指针,以便我可以找到一种方法,至少可以做到这些人能够完成的相同工作(这并不是真正的混淆代码,而只是提取代码

PS:为清楚起见,除了确认之外,我还在寻找一些指针,这些指针是关于我能够尝试如何从所述二进制文件中提取可编译代码的通过IDA Pro进行反汇编和反编译方面的工作并没有为我提供很多可以重用的新代码,这些新代码可以重现这一难题。

评论

您是否考虑过与所列软件的任何作者联系以询问此问题?如果您有任何有用的信息,请不要忘记发布结果! :)

我做了(对于某些人),已经期望什么都不会共享:)什么也没收回。

在我的项目开发过程中的某个时间点,我遇到了[开源实现](github.com/espes/Slave-in-the-Magic-Mirror),该问题通过运行原始的Apple iOS二进制代码( (来自airtunesd)在Python的ARM仿真器中进行映射,并将函数映射为Python绑定。至少他们不必从二进制文件中提取原始函数,并重新编译/链接到其二进制文件中(只要是全Python)。

我最终采用了类似的方法,但是使用了从VMLite的rplay分析实现中获得的见解,其中Apple DRM在远程服务器上运行,并在镜像连接的质询阶段被调用。

@RobertoAndrade,出售那些商业应用程序是否违法?为什么苹果没有阻止他们?

#1 楼

我花了一些时间研究Apple的airplay镜像支持,该支持已通过fairplay协议加密。在研究了服务器现有的商业应用程序之后,我终于设法找到一种解密受公平竞争保护的流的方法。
我扩展了shairplay代码以演示这种能力。请查看https://github.com/foxsen/shairplay,部分README.md:

foxsen更新,2015/4/20:对公平播放协议和播放的实验性支持:


支持公平播放加密音频(et == 3)
支持AAC-ELD音频(尚未试用)
添加了airplay服务框架,镜像连接开始流式传输。但是要完成UI和回调。
通过与服务器的交互来实现对公平播放的支持

,因为我没有足够的时间和兴趣来进行所有其他必要的编码来完全开放支持镜像的源代码解决方案,希望人们能帮助继续该项目或将我的代码移植到其他项目(例如kodi)中。我愿意协助解决相关问题。

肮脏的作品隐藏在我的服务器应用程序中。在进行Fairplay会话期间,我们需要与服务器交互三遍才能完成工作。您可以阅读上面的代码以了解操作方法。当我有更多时间时,我准备写一些关于这部分工作的东西。基本上,它涉及一些逆向工程和许多技巧,可以从二进制文件的一部分重建可重定位的对象。

该应用程序的公共访问是开放的,并且现在可供个人访问。如果有人想在商业环境中使用它,可以与我联系。

祝您黑客愉快。

评论


这基本上是我最终要做的事情。 VMLite的rPlay也可以做到这一点。我很好奇地分享了有关如何构建服务器组件的说明,并很乐意分享我的信息(尽管也不是开源的)。让我知道。

–罗伯托·安德拉德(Roberto Andrade)
15年4月20日在17:02



实际上,设置服务器的一种简单方法是利用反射器等应用程序中现有的.so。 chroot环境可以在linux中运行android .so :)然后可以使用dlopen并调用其功能。我比这更进一步练习我的技能。我反转了部分代码以了解更多信息。当剩下的仅是乏味的重复时,我停了下来,然后编写了一系列脚本来绘制二进制文件的一部分,重新​​添加符号表和重定位条目,并进行了一些修复后,它变成了可重定位的.o,可以链接到我的服务器应用程式。大致如此。

– foxsen
2015年4月21日0:00



我不太在意播放器本身。但是关于如何将二进制逻辑的一部分移植到新二进制中的问题引起了我的兴趣。现在,我证明可以做到这一点。我正在考虑就此主题写一些文章,因为它很有趣,涉及各种二进制操作。也许我可以为此编写一些通用工具。

– foxsen
2015年4月21日,0:11

是的,这正是我在寻找答案的目的。因此,尽管您能够做到(就像我列出的其他十几个应用一样)并不意味着您已经回答了问题:)让我知道一旦您能够分享更多有关移植功能的方法(是的) android上的.so正是我所做的),因为我最初想要做的是提取函数并将它们链接到我的程序中。

–罗伯托·安德拉德(Roberto Andrade)
2015年4月21日在0:14

由于您的方法也恰巧适用于重现FairPlay解密功能,因此我认为在此处共享详细信息可能是最好的选择,但是如果您还希望在我要发表的另一篇文章中共享更通用的答案(在AirPlay / FairPlay不在问题范围内),我也将不胜感激:reverseengineering.stackexchange.com/questions/6759/…

–罗伯托·安德拉德(Roberto Andrade)
2015年4月21日在11:09

#2 楼

通常的过程是让官方DRM解密您想要的内容并将其获取。 Clutch在iOS上执行此操作。反编译是一个单独的主题,其大小不超过DRM颠覆。

评论


好吧,这是问题的核心,所有这些解决方案都能够将官方DRM解密逻辑“带”入其二进制文件中(我最初的猜测是将其反编译(尽管混淆了),然后将其重新编译成二进制文件作为黑盒,而实际上并没有了解)。问题是他们如何实现这一目标?我在它们的二进制文件上看到了所有相同的逻辑,但无法弄清楚(通过反编译除外)如何以相同的黑盒样式将逻辑移植到我自己的程序中。

–罗伯托·安德拉德(Roberto Andrade)
2014年11月24日18:10

#3 楼

我也一直在研究这个问题,并得出与您完全相同的结论。我认为可行的唯一方法是对现有内容进行反编译并嵌入到新流程中。也许我们可以进一步讨论。

评论


鉴于功能的复杂性以及反编译器在组合可重新组装/重新编译的代码方面所面临的挑战,我们一直在尝试这种方法,但并未取得很大的成功。如果这是大家共同关心的话题,我们希望在此方面进行进一步的合作。有什么特别适合您的方法吗?

–罗伯托·安德拉德(Roberto Andrade)
2014年11月29日15:55

#4 楼

从我的工作(我不会透露的申请)中,我将得出一个简短的结论。设备不使用较旧的AirPlay方法。例如不仅有可以在任何设备上解密的密钥。您必须拥有一台服务器,我们称其为“ AirPlay服务器”,该设备要求该特定会话的解密密钥。其余工作在设备上完成(解密)。因此设备要求服务器,服务器用密钥响应,设备将密钥用于解密。大多数实际工作都是在设备上完成的。