我正在为越狱设备构建,我想阻止传入的消息。
我正在尝试 Hook _ingestIncomingCTMessage,但它没有结果(它似乎不适用于 ios6)。我还能如何在 ios6 中阻止短信?
最佳答案
找到了更好更简单的方法。和我想的一样com.apple.imagent
守护进程非常重要,而且是他在处理 kCTMessageReceivedNotification
.这就是为什么我们在处理 kCTMessageReceivedNotification
时得到空消息对象的原因你自己 - com.apple.imagent
正在从 CTMessageCenter
中删除它.
我们只需要 Hook 两个方法,但是找到并 Hook 它们非常棘手。这两种方法都在 com.apple.imagent
中 Hook 守护进程。
一、SMSServiceSession -(void)_processReceivedMessage:(CTMessage*)msg
.这是最初处理传入消息、保存到 SMS 数据库并传递给所有其他 iOS 组件的地方。问题是在任何地方都没有关于这个 API 的信息。 com.apple.imagent
如果你拆卸它,它似乎不会使用它。这是因为它是在运行时手动加载的。
当com.apple.imagent
开始他正在加载几个插件。我们需要的位于/System/Library/Messages/PlugIns/SMS.imservice/
- 这就是SMSServiceSession
被执行。你不会在那里找到二进制文件,因为就像它被编译成的所有框架一样 /System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv7
. IDA 识别此文件,让您选择要反汇编其中的哪个二进制文件。
要删除收到的消息并阻止有关它的任何通知,您需要调用 [[CTMessageCenter sharedMessageCenter] acknowledgeIncomingMessageWithId:[msg messageId]]
并从 _processReceivedMessage:
返回无需调用原始实现。调用 CTMessageCenter
方法很重要,因为它将传入的消息排队。
现在我们需要找到一种方法来知道何时 SMS.imservice
插件正在实际加载。最初 imagent 只创建 NSBundle
对象而无需加载任何代码。所以你不能 Hook 任何方法,因为类还没有从插件加载。为了解决这个问题,我们可以 Hook IMDService -(void)loadServiceBundle
来自私有(private)的方法 IMDaemonCore.framework
.调用原始实现,您可以在插件中 Hook 方法。要确定正在加载哪个插件,您可以在 IMDService -(NSBundle*)bundle
中检查包标识符.
此方法仅适用于 SMS 和 MMS 消息。 iMessage 的处理方式类似,但插件不同 - /System/Library/Messages/PlugIns/iMessage.imservice
. Hook MessageServiceSession -(void)_handler:(id) incomingMessage:(id) encryptionType:(id) messageID:(id) fromIdentifier:(id) fromToken:(id) timeStamp:(id) storageContext:(id) allowRetry:(char) completionBlock:(id)
应该做的伎俩。
更新
适用于 iOS 7
更新 2
在 iOS 8 上,一切都以相同的方式工作,只是您需要 Hook 不同的 SMSServiceSession
方法 - -(void)_processReceivedDictionary:(NSDictionary*)msg
.字典将包含所有短信内容。
如果您不想为 iOS 8 重写所有内容,您可以重用旧代码。传入的 SMS 通知由隐藏的非导出 C 回调函数处理 - 您无法 Hook 它。首先,它调用 SMSServiceSession -(id)_convertCTMessageToDictionary:(CTMessage*)msg requiresUpload:(BOOL*)upload
将 SMS 消息对象转换为字典。然后它调用 SMSServiceSession -(void)_processReceivedDictionary:(NSDictionary*)msg
来处理消息。最后,它调用 SMSServiceSession -(BOOL)relayDictionaryToPeers:(NSDictionary*)msg requiresUpload:(BOOL)upload
通知所有其他 iOS 组件有关传入消息的信息。
要屏蔽短信,您需要 Hook _convertCTMessageToDictionary
您可以在其中使用与以前的 iOS 版本相同的代码。您还需要同时 Hook _processReceivedDictionary
和 relayDictionaryToPeers
实际阻止传入的消息。只需从它们返回而不调用原始实现。您可以在 _convertCTMessageToDictionary
中设置一些全局变量并用其他方法检查和重置。这样做是完全安全的 - 这些方法被一个又一个同步调用。该 C 回调函数是唯一调用这些方法的地方。
关于ios - 在 ios6 上阻止短信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16219799/