Блокировка входящих смс в ios 7

Я хочу написать твик для взломанных устройств, который блокирует сообщения с номера телефона (в iOS 7). Сначала я использовал второй ответ 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 ответ

Решение
  1. Мое решение работает на iOS 7
  2. Ваш идентификатор пакета неверен, он должен быть com.apple.imservice.sms, Я опубликовал путь к каталогу службы SMS (/System/Library/Messages/PlugIns/SMS.imservice/). Там вы можете найти Info.plist который содержит идентификатор пакета плагина - com.apple.imservice.sms,
  3. Вы подключаете неправильный метод. Это IMDService -(void)loadServiceBundleбез аргументов. Тогда вы можете использовать [[self bundle] bundleIdentifier] чтобы получить идентификатор пакета. Также не забудьте назвать оригинальную реализацию loadServiceBundle прежде чем вы зацепите _processReceivedMessage: или даже проверить идентификатор пакета. Исходная реализация фактически загружает плагин, поэтому первым делом нужно вызвать его.
Другие вопросы по тегам