9

这可能是一个失败的原因,但我会问,因为我真的只是好奇......

我们有一个客户想要为 OS X 创建一个替代的消息应用程序。他们基本上想要使用相同的帐户、聊天历史记录和所有内容,但为内置消息提供完全不同的 UI(对于某些残障人士) 。应用程序。鉴于 Messages.app 中的主要服务 iMessage 完全没有文档记录,因此创建自己的消息传递应用程序不会成功,因此使用 3rd 方代码支持它几乎是不可能的。

经过初步研究,很明显,有据可查的 AppleScript 方法将提供一个可行但粗略的解决方案,缺少原始应用程序的许多功能(例如打字时的指示等),更不用说它需要保留原始应用程序正在运行的消息应用程序会分散用户的注意力。

那时我们开始深入挖掘并找到了IMCore.framework. IMCore基本上是 Messages.app 用来与各种服务进行通信的工具,它的引擎是imagent,它看起来像是管理数据,实际上是与各种 IM 服务器进行通信。IMCore是一个私有框架,使用起来显然有些风险(并且会自动将他们的应用程序从 App Store 中排除),但我们的假设是,使用 OS X,我们仍然应该能够实现这一点并将应用程序分发到 App Store 之外,而无需困难重重。

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

然后我们注意到 Messages.app 有一些非常奇怪的未记录权利,例如com.apple.private.imcore.imdpersistence.database-accesscom.apple.imagent。在这一点上,我们假设这些权利是我们为了与imagent. 我们已经尝试将这些权利添加到我们自己的应用程序中,并且能够成功地构建和共同设计它,但是当程序启动时,它在启动时崩溃并显示系统消息EXC_CRASH (Code Signature Invalid)(Xcode 说Terminated due to code signing error)。

我们可怕的假设是,Apple 锁定了他们的私人权利,因此系统不会接受使用它们的二进制文件,除非它是由 Apple 直接签名的,但这显然是一个理论。另一个问题是,如何imagent知道我们的二进制文件是否具有这些权利?我们不能以某种方式欺骗这些权利吗?

正如我所说,感觉像是一个失败的事业,但谁知道呢。我猜那些在 iOS 上做过硬核越狱工作的人可能会有一两个想法——有人吗?

4

1 回答 1

8

我将回答我自己的问题以提供更多信息,以防有人关心这一点。在一天结束的时候,我们能够通过注入imagent流程并捕获权利验证功能来跨越这个障碍,添加功能以便imagent我们的客户端可以连接 XPC。

这为通过 imagent 进行全面、无限制的通信打开了大门IMCore.framework,我可以确认已经实现了完整的 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。失败并基本上阻止我们将代码注入该进程。

所以总的来说不是一个美好的结局,但至少我们尝到了应许之地。

于 2016-02-08T22:23:58.817 回答