InV*_*iZz 3 jailbreak ios ios6
我正在构建一个破牢的设备,我想阻止收到的消息.我正在尝试挂钩_ingestIncomingCTMessage,但它没有结果(它似乎不适用于ios6).我怎样才能阻止ios6中的短信?
找到了更好,更简单的方法.正如我认为com.apple.imagent守护进程非常重要,正是他正在处理kCTMessageReceivedNotification.这就是我们在处理kCTMessageReceivedNotification自己时获取空消息对象的原因- com.apple.imagent将其从中删除CTMessageCenter.
我们需要挂钩两个方法,但找到并挂钩它们非常棘手.两种方法都挂在com.apple.imagent守护进程中.
首先,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对象而不加载任何代码.因此,您无法挂钩任何方法,因为尚未从插件中加载类.为了解决这个问题,我们可以挂钩IMDService -(void)loadServiceBundle的私有方法IMDaemonCore.framework.调用原始实现,您可以在插件中挂钩方法.要确定正在加载哪个插件,您可以检查包标识符IMDService -(NSBundle*)bundle.
此方法仅适用于SMS和MMS消息.iMessages以类似的方式处理,但使用不同的插件 - /System/Library/Messages/PlugIns/iMessage.imservice.挂钩MessageServiceSession -(void)_handler:(id) incomingMessage:(id) encryptionType:(id) messageID:(id) fromIdentifier:(id) fromToken:(id) timeStamp:(id) storageContext:(id) allowRetry:(char) completionBlock:(id)应该可以解决问题.
UPDATE
适用于iOS 7
更新2
在iOS 8上,一切都以相同的方式工作,除了你需要挂钩不同的SMSServiceSession方法 - -(void)_processReceivedDictionary:(NSDictionary*)msg.字典将包含所有SMS消息内容.
如果您不想重写iOS 8的所有内容,则可以重用旧代码.传入的SMS通知由隐藏的非导出C回调函数处理 - 您无法挂钩它.首先,它调用SMSServiceSession -(id)_convertCTMessageToDictionary:(CTMessage*)msg requiresUpload:(BOOL*)upload将SMS消息对象转换为字典.然后它调用SMSServiceSession -(void)_processReceivedDictionary:(NSDictionary*)msg处理消息.最后,它调用SMSServiceSession -(BOOL)relayDictionaryToPeers:(NSDictionary*)msg requiresUpload:(BOOL)upload通知所有其他iOS组件有关传入消息.
要阻止SMS,您需要挂钩_convertCTMessageToDictionary可以使用您在以前的iOS版本上使用的相同代码.您还需要挂钩_processReceivedDictionary并relayDictionaryToPeers实际阻止传入消息.只需从它们返回而不调用原始实现.您可以设置一些全局变量,_convertCTMessageToDictionary并在其他方法中检查并重置它.这样做是完全安全的 - 这些方法是一个接一个地同步调用的.那个C回调函数是调用这些方法的唯一地方.
这非常棘手.Apple在这方面做出了重大改变.这在iOS 5上很容易,但在iOS 6上我找不到简单的方法.首先,您需要使用CTTelephonyCenter观察__kIMChatItemsDidChangeNotification通知.我是在SpringBoard注入的dylib中做的.不确定,但这可能很重要.
CTTelephonyCenterAddObserver(CTTelephonyCenterGetDefault(), NULL, Callback, NULL, NULL, CFNotificationSuspensionBehaviourHold);
void Callback(CFNotificationCenterRef, void*, NSString* notification, const void*, NSDictionary* userInfo)
{
if (![notification isEqualToString:@"__kIMChatItemsDidChangeNotification"])
{
return;
}
for (IMChatItem* chatItem in userInfo[@"__kIMChatItemsKey"])
{
IMMessage* msg = [chatItem message];//Incoming message object
NSString* text = [[msg text] string];//message text
NSString* sender = [[msg sender] ID];//message sender
[[IMDMessageStore sharedInstance] performBlock:^{
IMDChatRecordDeleteChatForGUID([NSString stringWithFormat:@"SMS;-;%@", sender]);
}];
}
}
Run Code Online (Sandbox Code Playgroud)
最后一点非常重要.你不能只删除邮件.您需要在特定的内部线程上执行此操作,否则您将收到错误.这就是我使用的原因IMDMessageStore.它的performBlock:方法在这个特殊的线程上执行块.
IMDChatRecordDeleteChatForGUID函数可以在IMDPersistence.framework中找到.它删除具有特定GUID的整个消息树(聊天/对话).我无法找到一种方法来检索此GUID,因此我使用SMS sqlite数据库中的GUID作为示例手动构建它.
要删除您只能使用的一条消息 IMDMessageRecordDeleteMessagesForGUIDs([NSArray arrayWithObject:[msg guid]]);
IMChatItem并且IMMessage可以在IMCore.framework.IMDMessageStore是IMDaemonCore.framework.
这很容易.现在,当您收到消息并以此方式阻止它时,您将看到它仍然显示在MobileSMS应用程序中,您仍然可能会收到bullein通知,您仍然会获得徽章,告诉您有未读消息.但是,如果您打开SMS sqlite数据库,您将看到该消息确实被删除.阻止这些并不容易.
BBServer方法publishBulletin:destinations:alwaysOnLockScreen:.第一个参数是BBBulletin对象.如果它是传入消息公告,它的section属性等于com.apple.MobileSMS.要阻止公告,只需从此方法返回,不要调用原始实现.MessagesBadgeController- _madridChatRegistered:和_madridUnreadCountChanged:.第一个参数是NSNotification与对象object包含属性IMChat对象.再次,只需从这些方法返回,以防止徽章更改.SMSApplication _receivedMessage:,CKTranscriptController
_messageReceived:,CKConversationList _handleRegistryDidRegisterChatNotification:, _handleRegistryDidLoadChatNotification:, hasActiveConversations, unreadCount.CKConversationController
_chatParticipantsChangedNotification:, updateConversationList,CKMessagesController showConversation:animate:forceToTranscript:关于ChatKit.serviceBundle.要挂钩它的类,你需要等待SpringBoard实际加载它.这是完成的SBPluginManager loadPluginBundle:.Bundle标识符应该等于com.apple.SMSPlugin.只有这样你才能挂钩方法.
而已.相当多的工作,但它工作得很好 - 没有传入消息的迹象,即使你在消息到达时在MobileSMS应用程序中.
我确信有更简单的方法可以做到这一点.com.apple.imagent守护程序向各种iOS组件发送通知.这在iOS 6消息传递系统中非常重要.开始的好地方.
| 归档时间: |
|
| 查看次数: |
3346 次 |
| 最近记录: |