Перехват SMS в джейлбрейке iOS 7

Я следил за этим ответом Блокировка входящих смс в ios 7< /а>. Проблема в том, что он блокирует каждое сообщение и его уведомление. Во-вторых, он постоянно вызывает метод _processReceivedMessage_hooked, когда я отправляю сообщение, отличное от этого номера +923139303006.

Я использую OpenDev с Xcode 5, iOS 7.x.

#include <logos/logos.h>
#import <substrate.h>
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <libkern/OSAtomic.h>
#import "CoreTelephony.h"


id(*_processReceivedMessage_orig)(id, SEL, CTMessage*) = NULL;
id _processReceivedMessage_hooked(id self, SEL _cmd, CTMessage* msg);



@class IMDService; 
static void (*_logos_orig$_ungrouped$IMDService$loadServiceBundle)(IMDService*, SEL); static void _logos_method$_ungrouped$IMDService$loadServiceBundle(IMDService*, SEL); 



static void _logos_method$_ungrouped$IMDService$loadServiceBundle(IMDService* self, SEL _cmd) {

    _logos_orig$_ungrouped$IMDService$loadServiceBundle(self, _cmd);

    NSBundle *bundle =[NSBundle mainBundle];

     NSLog(@"bundle identifier %@ ***** ",[bundle bundleIdentifier]);

//    if ([[bundle bundleIdentifier] isEqualToString:@"com.apple.imservice.sms"] && [bundle isLoaded])
//    {  
        NSLog(@"Hoooking  ***** ");
        MSHookMessageEx(objc_getClass("SMSServiceSession"),
                        @selector(_processReceivedMessage:),
                        (IMP)_processReceivedMessage_hooked,
                        (IMP*)&_processReceivedMessage_orig);
//    }

}


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

CTMessagePart *itmes = [[msg items] objectAtIndex:0];

NSString* msgtxt = [[NSString alloc] initWithData:itmes.data encoding:NSASCIIStringEncoding];


NSLog(@"message %@ ****",msgtxt);

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

}

static __attribute__((constructor)) void _logosLocalInit() {
{
    Class _logos_class$_ungrouped$IMDService = objc_getClass("IMDService");
    MSHookMessageEx(_logos_class$_ungrouped$IMDService, @selector(loadServiceBundle), (IMP)&_logos_method$_ungrouped$IMDService$loadServiceBundle, (IMP*)&_logos_orig$_ungrouped$IMDService$loadServiceBundle);
}
}

вот плист файл

<?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>

person Ahad Khan    schedule 02.07.2014    source источник
comment
Попробуйте раскомментировать if ([[bundle bundleIdentifier] isEqualToString:@"com.apple.imservice.sms"] && [bundle isLoaded]) check. Причина в том, что loadServiceBundle вызывается несколько раз - есть несколько плагинов для изображений. Каждый раз, когда он вызывается, вы снова и снова перехватываете processReceivedMessage, переписывая свои предыдущие хуки. Поскольку все это происходит внутри одного процесса обработки изображений, исходная реализация processReceivedMessage будет потеряна. В результате вы рекурсивно вызываете свою перехваченную функцию.   -  person creker    schedule 02.07.2014
comment
Если я закомментирую эту строку, то processReceivedMessage никогда не зацепится. Он всегда дает этому идентификатору пакета журнала com.apple.imagen   -  person Ahad Khan    schedule 02.07.2014
comment
Это потому, что вы используете неправильный экземпляр NSBundle. [NSBundle mainBundle] возвращает вам пакет самого себя, то есть демона com.apple.imagen. Вам нужен NSBundle загружаемого плагина. Я рассказал об этом в своем ответе - вам нужно использовать IMDService -(NSBundle*)bundle. В вашем случае это будет [self bundle]   -  person creker    schedule 02.07.2014
comment
@creker большое спасибо. Он отлично работает   -  person Ahad Khan    schedule 02.07.2014
comment
@creker, что, если я хочу зарегистрировать диспетчер местоположения для обновлений местоположения или что-то в этом роде, когда полученное сообщение имеет определенный текст.   -  person Ahad Khan    schedule 09.07.2014


Ответы (1)


Попробуйте раскомментировать if ([[bundle bundleIdentifier] isEqualToString:@"com.apple.imservice.sms"] && [bundle isLoaded]) check.

Причина в том, что loadServiceBundle вызывается несколько раз - есть несколько плагинов для изображений. Каждый раз, когда он вызывается, вы снова и снова перехватываете _processReceivedMessage:, переписывая свои предыдущие хуки. Поскольку все это происходит внутри одного процесса обработки изображений, исходная реализация _processReceivedMessage: будет потеряна. В результате вы рекурсивно вызываете свою перехваченную функцию.

Также вы используете неправильный экземпляр NSBundle. [NSBundle mainBundle] возвращает вам пакет самого себя, то есть com.apple.imagent daemon. Вам нужен NSBundle загружаемого плагина. Я рассказал об этом в своем ответе - вам нужно использовать IMDService -(NSBundle*)bundle. В вашем случае это будет [self bundle].

person creker    schedule 02.07.2014