[trans] IPhone短信相*分研究

[trans] IPhone短信相关部分研究

http://blog.csdn.net/mtc1256/article/details/5558497

短信发送和截获

方式一:

打 开/dev/tty.debug使用AT命令操作,这类代码最早的出现在一些开源项目中,改改基本能用,现有的版本用的就是这种方式。

缺 点:机器必须破解并必须安装到 /Application ,IPA安装方式无法使用,应该是权限的问题。

        不太稳定,速度有点慢,也可能是我代码写的有问题,这类代码code.google.com上可以找到,就不贴出来丢人了;

方式二:

直 接使用apple的私有库来(CoreTelephony)操作,其实有人已经弄出来了(别问我是谁啊,我不知道反你们的软件是不是非法啊),可是你别指 望在网上找到任何资料,我用ida看了2天还是没有弄出来,反而3.0的sdk拿到手立马搞定了3.0的短信发送。

缺点:唯一的缺点就是 你不知道什么时候apple又修改了api,私有的api不需要对你承诺兼容性,还有一个缺点就是appstore的签名可能会有麻烦;

1.x、 2.x、3.x的iphone应该都能支持的方式,随便定义个头文件,把下面的copy进去,同时主要加入CoreTelephony framework

extern NSString* const kCTSMSMessageReceivedNotification;
extern NSString* const kCTSMSMessageReplaceReceivedNotification;
extern NSString* const kCTSIMSupportSIMStatusNotInserted;
extern NSString* const kCTSIMSupportSIMStatusReady;

id CTTelephonyCenterGetDefault(void);
void CTTelephonyCenterAddObserver(id,id,CFNotificationCallback,NSString*,void*,int);
void CTTelephonyCenterRemoveObserver(id,id,NSString*,void*);
int CTSMSMessageGetUnreadCount(void);

int CTSMSMessageGetRecordIdentifier(void * msg);
NSString * CTSIMSupportGetSIMStatus();   //获取sim卡状态,kCTSIMSupportSIMStatusNotInserted表示没有sim卡
NSString * CTSIMSupportCopyMobileSubscriberIdentity();  //获取imsi号码,泪牛满面啊,我原来都是用AT+CCID来获取的iccid识别用户

id  CTSMSMessageCreate(void* unknow/*always 0*/,NSString* number,NSString* text);
void * CTSMSMessageCreateReply(void* unknow/*always 0*/,void * forwardTo,NSString* text);

void* CTSMSMessageSend(id server,id msg);

NSString *CTSMSMessageCopyAddress(void *, void *);
NSString *CTSMSMessageCopyText(void *, void *);

/*还有很多API,比如说挂机的啊,拨号的啊,获取 iccid,imsi,cell id,bootload/fireware版本的啊,暂时用不上,就没有一一弄出来哦*/

获取IMSI 号码:

NSString * imsi= CTSIMSupportCopyMobileSubscriberIdentity(/*nil*/);

获取SIM卡状态:

NSString * simStatus= CTSIMSupportGetSIMStatus();

截获短信(3.0暂时已经失效):

void SmsCallBack (
    CFNotificationCenterRef center,
     void *observer,
     CFStringRef name,
     const void *object,
     CFDictionaryRef userInfo
)
{

   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
if (!userInfo) return;
if ([[(NSDictionary *)userInfo allKeys] 
   containsObject:@"kCTSMSMessage"]) // SMS Message 
{
  void *message = (void *) 
  [(NSDictionary *)userInfo objectForKey:@"kCTSMSMessage"];
  NSString *address = CTSMSMessageCopyAddress(NULL, message);
  NSString *text = CTSMSMessageCopyText(NULL, message);

  NSLog(@"address = %@,text =%@",address,text );

   }
}
[pool release];
}

id server = CTTelephonyCenterGetDefault();
CTTelephonyCenterAddObserver(server, self, smsCallBack,kCTSMSMessageReceivedNotification,NULL,4);

发送的代 码应该是(难道我弄错了么?为什么发送不成功):

id server = CTTelephonyCenterGetDefault();

id msg = CTSMSMessageCreate(0,@"10086",@"fuck");
id result=CTSMSMessageSend(server,msg);

apple在iphone 3.0在短信方面做了很大程度的修改,同时也让我看到了他们开放sms方面sdk的打算,现在有了一个ChatKit,ClassDump下来貌似很复 杂,我还是ClassDump了一下他的CoreTelephony,惊喜的发现里面多了很多obj c的class,修改了一下大致是下面这个样子,也是随便找个头Copy进去就可以用:

@interface CTMessageCenter : NSObject
{
}

+ (id)sharedMessageCenter;
- (id)init;
- (id)sendSMS:(id)fp8;
- (id)sendMMSFromData:(id)fp8 messageId:(unsigned int)fp12;
- (id)sendMMS:(id)fp8;
- (id)send:(id)fp8;
- (id)incomingMessageWithId:(unsigned int)fp8 telephonyCenter:( id)fp12 isDeferred:(BOOL)fp16;
- (int)incomingMessageCount;
- (id)allIncomingMessages;
- (void)acknowledgeIncomingMessageWithId:(unsigned int)fp8;
- (void)acknowledgeOutgoingMessageWithId:(unsigned int)fp8;
- (id)incomingMessageWithId:(unsigned int)fp8;
- (id)deferredMessageWithId:(unsigned int)fp8;
- (id)statusOfOutgoingMessages;
- (id)encodeMessage:(id)fp8;
- (id)decodeMessage:(id)fp8;
- (BOOL)isMmsEnabled;
- (BOOL)isMmsConfigured;
- (BOOL)sendSMSWithText:(id)fp8 serviceCenter:(id)fp12 toAddress:(id)fp16;

@end

从接口上来看,发送, 截获应该都可以搞定,还能支持彩信

发送很简单:

[ [CTMessageCenter sharedMessageCenter] sendSMSWithText:@"1111" serviceCenter:nil toAddress:@"138XXXX0610"];

截获很诡异的,我不知道他是怎么通知的,看里面的代码应该最终还是用了 CTTelephonyCenterAddObserver,我在想从这个类派生一个能不能截获呢?有待测试。

顺带提一下,ida反出来 的arm代码还是很郁闷啊,关键是没办法跟踪调试,CTSMSMessageSend肯定是可以发送的,而且就是2参数,神啊,help me?!