ios - 在 ios6 上阻止短信

标签 ios ios6 jailbreak

我正在为越狱设备构建,我想阻止传入的消息。
我正在尝试 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 _processReceivedDictionaryrelayDictionaryToPeers实际阻止传入的消息。只需从它们返回而不调用原始实现。您可以在 _convertCTMessageToDictionary 中设置一些全局变量并用其他方法检查和重置。这样做是完全安全的 - 这些方法被一个又一个同步调用。该 C 回调函数是唯一调用这些方法的地方。

关于ios - 在 ios6 上阻止短信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16219799/

相关文章:

iphone - iOS5上收到 "kCTMessageReceivedNotification"通知时如何获取消息

ios - 通过触摸按钮显示广告横幅

iphone - AppDelegate 中的值未更新

ios - TableViewController 不更新单元格

ios - 点击 UITextField iPad 后 UIPopover 中的 datePicker

iOS日历访问权限对话框,强制显示?

ios - self.tableView 为零,与调用 numberOfSections TableView 的 uitableview 不同

iphone - 如何在越狱的iPhone上安装任意.app iPhone应用程序?

ios - 从 TableView 中删除行

ios - 在 iOS 7 中模拟系统范围内的触摸