在iOS 7中阻止传入的短信

时间:2014-04-10 13:49:12

标签: ios objective-c sms jailbreak tweak

我想为越狱设备编写一个调整来阻止来自电话号码的消息(在iOS 7中)。首先,我在this link中使用了creker的第二个答案来编写调整。这是我的代码:

#import <substrate.h>
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <libkern/OSAtomic.h>
#import "CTMessage.h"
#import "CTMessageCenter.h"

id(*_processReceivedMessage_orig)(id, SEL, CTMessage*) = NULL;
id _processReceivedMessage_hooked(id self, SEL _cmd, CTMessage* msg);
%hook IMDService
-(void)loadServiceBundle:(NSBundle*)bundle
{    
    if ([[bundle bundleIdentifier] isEqualToString:@"com.apple.SMSPlugin"] && [bundle isLoaded]) // not sure if the bundle identifier is correct!
    {  
        MSHookMessageEx(objc_getClass("SMSServiceSession"),
                        @selector(_processReceivedMessage:),
                        (IMP)_processReceivedMessage_hooked,
                        (IMP*)&_processReceivedMessage_orig);
    }
}
%end

id _processReceivedMessage_hooked(id self, SEL _cmd, CTMessage* msg)
{
    NSObject<CTMessageAddress>* phonenumber = [msg sender];
    NSString *senderNumber = (NSString*) [phonenumber canonicalFormat]; // sender number

    if ([senderNumber isEqualToString:@"+012345678910"])
        [[CTMessageCenter sharedMessageCenter] acknowledgeIncomingMessageWithId:[msg messageId]];
    else
         return _processReceivedMessage_orig(self, _cmd, msg);
}

和我的plist文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Filter</key>
    <dict>
        <key>Bundles</key>
        <array>
            <string>com.apple.imagent</string>
        </array>
    </dict>
</dict>
</plist>

主要问题是loadServiceBundle永远不会被钩住,我的函数永远不会被调用!如果我在iPhone上安装调整,当移动设备有传入的短信和消息警报时,没有任何反应。我自己认为问题是我正在为iOS 7编写,但问题是适用于iOS 6.如果问题是这样,你能告诉我该怎么办?

我的另一个问题是loadServiceBundle方法。正如您在书面代码中看到的那样,我不知道应该过滤哪个包标识符。如果我选择了正确的捆绑标识符,请告诉我。

如果我的代码中有任何其他问题,我很乐意告诉我。

1 个答案:

答案 0 :(得分:0)

  1. 我的解决方案适用于iOS 7
  2. 您的包ID错误,应为com.apple.imservice.sms。我发布了短信服务目录路径(/System/Library/Messages/PlugIns/SMS.imservice/)。在那里,您可以找到包含插件的包ID的Info.plist - com.apple.imservice.sms
  3. 你正在勾选错误的方法。它是IMDService -(void)loadServiceBundle,没有参数。然后,您可以使用[[self bundle] bundleIdentifier]来获取捆绑ID。另外,在挂钩loadServiceBundle之前不要忘记调用_processReceivedMessage:的原始实现,甚至检查bundle id。原始实现实际上加载了插件,所以调用它应该是你做的第一件事。