克服OS X和越狱的iOS私有Apple权限

11

这个可能是无法解决的问题,但我只是好奇想问一下...

我们有一个客户希望为OS X创建一个替代的消息应用程序。他们基本上想使用相同的账户、聊天记录以及其他内容,但是针对内置Messages应用程序提供完全不同的用户界面(适用于某些残疾人士)。由于主要服务iMessage在Messages.app中没有文档说明,因此使用第三方代码支持该服务几乎是不可能的,所以创建自己的消息应用程序也不可行。

在初步研究后,很明显充分记录的AppleScript方法可以提供可行但粗糙的解决方案,丢失了原始应用程序的许多功能(例如输入指示等),更何况它需要保持原始Messages应用程序运行,这会对用户造成干扰。

在那时,我们开始深入挖掘,发现 IMCore.frameworkIMCore 基本上是 Messages.app 用来与各种服务通信的方式,其引擎是 imagent,它似乎管理数据,并实际与各种即时消息服务器通信。 IMCore 是一个私有框架,显然使用它有一定风险(并且自动排除其应用程序进入App Store),但我们的假设是,在OS X上,我们仍然可以实现这一点,并且分发应用程序也不会太困难。

我们开始尝试使用 IMCore (在反向工程 Messages.app 以查看它的使用方式时),并取得了一些进展。我们能够成功连接到 imagent 进程并执行几个配置操作,但然后发现数据模型基本为空——即使我们在用户的安全上下文中运行,也无法查看任何用户数据或与任何即时消息服务通信。

然后我们发现Messages.app有一些非常奇怪的未记录权限,比如com.apple.private.imcore.imdpersistence.database-accesscom.apple.imagent。目前我们假设这些权限是我们需要成功与imagent通信所缺少的。我们尝试将这些权限添加到我们自己的应用中,并且能够成功构建和签名,但是当程序启动时它会崩溃并显示系统消息EXC_CRASH (Code Signature Invalid)(Xcode显示Terminated due to code signing error)。

我们恐惧地认为,苹果锁定了他们的私有权限,以便系统不接受使用它们的二进制文件,除非直接由苹果签名,但这显然只是一种理论。另一个问题是,imagent如何知道我们的二进制文件是否具有这些权限?难道我们不能以某种方式欺骗这些权限吗?

就像我说的,感觉像是无助的情况,但谁知道呢。我猜在iOS上进行过极限越狱工作的人可能会有一两个想法,有人吗?


1
对于这个问题,你最好查看Hackintosh信息而不是iOS越狱信息。你尝试过使用根信任的代码签名证书吗?这里有一些关于创建证书的信息 - Alexander O'Mara
好观点,Alexander。已添加Hackintosh标签。我还没有尝试过根受信任的证书,或许值得一试。 - ldoogy
1
猜测,但值得考虑:很可能苹果有意限制消息访问权限,以防止恶意应用程序读取或发送消息。请记住:如果您的应用可以这样做,任何应用都可以这样做。 - user149341
1
更正:使用根受信任的证书并不能让我们运行私有权限。我们发现 imagent 报告说它没有授予监听器端口的权限,因为我们的进程没有权限。令人尴尬的是,我们手动对根受信任的证书进行代码签名时未能包含 entitlements 文件... 无论如何,一旦我们添加了它,我们就会得到以下繁琐的消息:taskgated[78]:由于其使用 com.apple.imagent.av 权限不被允许(错误代码-67050),已杀死 com.foo.bar [pid 31373]。听起来好像这是路的尽头了? - ldoogy
你应该明确客户是否需要为所有iOS设备构建此应用程序,或者是否愿意接受越狱设备的要求。这很重要。 - Nate
显示剩余2条评论
1个回答

10
我将回答自己的问题,以提供更多信息,如果有人关心的话。在一天结束时,我们能够通过注入到 imagent 进程并捕获授权验证函数来跨越这个障碍,添加功能,以便 imagent 将允许我们客户端的XPC连接。
这为完整的、无限制的与 IMCore.framework 中的 imagent 通信打开了大门,我可以确认已实现完整的iMessage功能。我们能够看到用户的iTunes帐户,发送和接收消息,从用户数据库加载消息(以显示每个聊天的历史记录)和几乎所有其他东西。该实现包括一个小型系统守护程序,每当重新启动(或系统启动)时注入 imagent ,因此使用标准OS X安装程序很容易安装给终端用户。 IMCore.framework 非常易于使用,并包含有关iMessage的每个微小元数据,包括用户在另一端正在输入的通知、附件的发送和接收API等等!它似乎在OS X版本之间有一些变化,但我们能够使其跨越OS X版本(我们测试了10.8到10.10)。
挑战出现在El Capitan出现时。 El Capitan中的新根保护功能(系统完整性保护)防止我们将我们的小技巧注入到 imagent 中,这结束了这个解决方案。:-( 失败发生在我们调用 task_for_pid 时,我们称之为 imagent 进程。那失败了,基本上阻止了我们将代码注入该过程。
总体而言,没有一个快乐的结局,但至少我们尝到了应许之地。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Alexander O'Mara
@AlexanderO'Mara,在这种情况下要求用户禁用SIP并不是很实际(更不用说它也有些妥协了他们)。可能可以通过一个kext来规避这个问题,但苹果不会授权给我们。我们已经询问过他们,他们说这整个事情都不受支持(即使它是一个合法的、明智的用例)。 - ldoogy
你能详细说明一下这是如何实现的吗?我正在尝试构建一个iMessage代理(以实现跨平台iMessage),并且也想摆脱AppleScript。我们只需要添加授权,将自己分叉为0,然后开始吗? - Allison
发封电子邮件给我的用户名@gmail.com,我会尽力帮助。 - ldoogy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接