1、iMessage介绍
iMessage 是 Apple Inc. 开发的一项即时通讯服务,于 2011 年推出。iMessage 只在 Apple 平台上运行,包括 macOS、iOS、iPadOS 和 watchOS。iMessage 的核心功能可在所有支持的平台上使用,包括发送短信、图像、视频和文档;获取递送和已读状态(已读收据);端到端加密,只有发送者和接收者才能读取消息,其他人,包括苹果本身,都无法读取它们。
消息展现形式:
绿色文本气泡 表示基于短信的通信;在所有 iOS 设备上,蓝色文本气泡表示 iMessage 通信。
2、通信方案
- Mac 中转方案:可用,适合个人用户 或者 10-20位用户群体共用一台Mac
- 越狱iPhone中转方案:需要指定机型,只能一对一
- iMessage Cloud 方案: 已废弃
2.1、Beeper iMessage Cloud 方案 (已废弃)
-
2023 年 12 月 5 日, Beeper Mini 在 Android 上发布,该应用程序使用了 iMessage 协议的逆向工程。 Beeper Mini for Android sends and receives iMessages, no Mac server required
- 拥有 Android 手机的用户可以在没有 Apple ID 的情况下使用 Beeper Mini,并且仍然可以发送和接收加密的 iMessage
- 逆向方案(已废弃): github.com/JJTech0130/...
-
2023年 12 月 9 日 被苹果关闭。
-
Beeper Mini 放弃了绕过苹果关闭该服务的尝试,停止对 iMessage 的逆向工程。
iMessage 通信流程

该Cloud方案需要Hack的部分
连接 APNs 服务
APN可用于发送推送通知以及接收推送通知。为了连接到 APNs,您需要一个由 Albert 激活服务器颁发的客户端证书。
Apple正常机制在 Apple 注册并激活设备时,会生成 PUSH 证书。在第一次连接到 Apple 服务器期间,会向 albert.apple.com 发送证书请求。 此服务器运行一个名为 Apple Iphone Device CA 的证书颁发机构,负责对每个请求进行签名。
负责设备所有 PUSH 通信的证书。此证书不直接涉及 iMessage,但由于 iMessage 是通过 PUSH 进行的,因此它无论如何都可以发挥作用。
当涉及到iMessage时,所有PUSH通信都是在TLS中与服务器端口5223进行,主机名取自 0...255-courier.push.apple.com
对于 iMessage,当设备连接到 APNs 时 ,使用 com.apple.madrid 来筛选消息。
注册IDS服务
Apple 身份识别服务 (IDS)
- 当设备注册到服务时,Apple 会计算推送令牌。Push-Token 它是对 iDevice 的唯一标识符。
- 当客户端发送一条消息时,它实际上发送的消息数量与收件人具有推送令牌的消息数量一样多,因此消息可以传递到每个 iDevice。如前所述,这些消息通过端口 5223 上的网关发送到 Apple 推送网络服务 (APNS)。
- 当用户想要发送 iMessage 时,他首先提供一个或多个目标 URI。由于通信是端到端加密的,需要到ESS服务器检索所需的密钥。
发出 IDS 注册请求时,需要一个"validation data"的二进制数据。这本质上是 Apple 的验证机制,以确保非 Apple 设备无法使用 iMessage。
- 为了生成"validation data",将使用有关设备的信息片段,例如其序列号、型号和磁盘 UUID。如果验证失败就会收到"客户代码"错误提示。
- 生成此"validation data"的二进制文件是高度混淆的。pypush(已失效的逆向方案) 通过使用自定义 Mach-O 加载器和 Unicorn 引擎来模拟混淆的二进制文件来回避此问题。
通信协议相关研究参考
发送消息
写一条消息,然后按发送按钮。客户端会先从 Apple 的 ESS 服务器请求发送消息所需的信息。ESS 服务器返回:
- Push-Token,推送令牌即 iDevice 的唯一标识符。
- 密钥,用来端到端加密通信。
ECDSA public key (256-bit)
RSA public key (1280-bit)
给定一个目标地址(例如,URi,它可以是电话号码或电子邮件),Apple有办法将其与与该URI相关的所有设备(iPhone,iPad或OS X系统)链接起来。一旦Apple知道所有涉及的设备,Apple就会将消息带到适当的设备。

Beeper mini基于该Cloud的流程图
详情见: blog.beeper.com/2023/12/05/...

2.2、现阶段可行的方案
由于越狱iPhone使用只能一对一,目前最合适在 Apple 生态系统之外运行 iMessage 的实际解决方案需要 Mac 服务器,并依靠 AppleScript 脚本来自动执行 Messages.app UI 操作。这样就无需在客户端上重新实现消息发送协议。但是,只要您想使用iMessage,Mac就必须运行。
自主搭建方案 : mautrix-imessage - mautrix-bridges
基于beeper提供的方案: 详情见下面
运行机制
"客户端"使用三个进程:iChat、imagent 和 applepushserviced。iChat(现在是 Messages)显示 UI,但不处理任何特定于协议的内容,这就是 imagent 所做的(如果 iChat 未运行,用户将保持登录状态)。但是,对于 iMessage,imagent 本身不会建立连接,而是使用 applepushserviced。这是一个系统级守护程序,它保持与 courier.push.apple.com 的持续连接,可能适用于所有推送通知。
发送消息: Messages.app -> imagent -> identityservicesd -> apsd
apsd:Apple PUSH 服务器守护进程,负责将消息从 Apple 传输到设备。
imagent:iMessage任务的后台进程,例如在应用程序关闭时保持连接等。

自主搭建方案中发送消息的代码,基于Apple Script操作
go
// 部分截取示例
const sendMessage = `
on run {targetChatID, messageText}
tell application "Messages"
send messageText to chat id targetChatID
end tell
end run
`
const sendMessageWithService = `
on run {targetChatID, messageText}
tell application "Messages"
try
set theService to 1st service whose service type = %s
on error number -2753
set theService to 1st service
end try
send messageText to chat id targetChatID of theService
end tell
end run
`
Beeper 基于Mac中转通信方案
具体操作:
-
在 Mac 上安装 Beeper Desktop -- 使用您的 iMessage 注册码设置 Beeper Mini。或者运行 mac-registration-provider 也可以获取注册码;此方法无法进行电话号码注册。
-
没有 Mac -- 让在 Mac 上安装 Beeper 的朋友分享他们的 iMessage 注册码,您可以将其输入到最新的 Beeper 桌面应用程序中。在我们的测试中,10-20 个 Beeper 用户可以安全地使用相同的注册数据。数据来源: [iMessage and Phone Registration Are Back -- Kinda](https://link.juejin.cn?target=https%3A%2F%2Fblog.beeper.com%2F2023%2F12%2F21%2Fimessage-and-phone-registration-are-back-kinda%2F "https://blog.beeper.com/2023/12/21/imessage-and-phone-registration-are-back-kinda/")
共享代码的次数过多,开始出现连接等问题,需要在 Beeper 桌面→设置中→ iMessage 注册码→再生
3、RCS进展
- 如果Apple RCS推出,那么短信和彩信的局限性将不再困扰iPhone和Android用户之间的消息传递对话。
- iMessage不会消失。它将继续成为用于iPhone用户之间所有通信的消息传递平台。RCS 将简单地取代 SMS 和 MMS,并与 iMessage 分开存在。苹果表示,短信和彩信也将在需要时继续作为后备。