fox's profile如果记忆醒来PhotosBlogLists Tools Help

Blog


    小小的开心一下

    睡觉之前看到http://zn.sj.91.com/content/2009-07-02/20090702221605357,4.shtml。

    希望这不是公司出钱弄的,看着这个排名每天上上下下其实也挺有乐趣的,亲手做的东西那么多人在用(传闻有20多万了?),让我小小的膨胀一下吧,哈哈

    这次加了很多其实用户不喜欢的东西,激活啦,订购啦,没办法,公司毕竟要靠这个挣钱的,不能作慈善家,但是只要不作恶,用户有得选择,就比什么都好?

    很多用户很可爱的啊,也很聪明,有过很多用户写信问一些问题,其实无非就是安装的居多,手机上的软件安装成功了,第一次运行正常,后续基本问题不多了,这次为了兼容ipod touch(几个用户写信说原来ipod touch可以用,后来就不行了,有点声讨的意思了,哈哈),我特意把一些模块动态加载,他们学聪明了,知道把sim卡抽走,让我检测不到......泪奔

    这个项目算是大部分都是业余时间在做,玩的性质大于工作,但更多的学到了很多东西,更重要的是走进了用户里面,用户说质量一直没有太多提升,其实cpu占用大规模下去了,原来70%多,现在才50%不到,应该还是有很多优化空间的,至于订购和激活带来的问题,主要这次是游客看的居然比激活后的用户节目更不受限制?的确有点荒唐啊,下个版本应该更鼓励用户激活,用户的行为分析比公司短期的利益更重要。

    iphone系列短信发送和截获

    在党和人民的关怀下,在ida强大的支持下,今天终于把3.0的短信截获搞定了.

    一路心酸的很啊,apple居然空了2个函数放那里啥也不干,却又定义了两个消息,3.0整个短信机制改变还是很大很大的.....

    测试结果

    早上睡了一觉起来,突然想起我的IPhone已经刷成3.0,是不是因为这样才不行阿,又降级刷回了2.21.

    id server = CTTelephonyCenterGetDefault(); id msg = CTSMSMessageCreate(nil,@"+861382323XXXX",@"fuck you ,pangzi"); NSString *address = CTSMSMessageCopyAddress(NULL, msg); NSString * text= CTSMSMessageCopyText(NULL, msg); id result=CTSMSMessageSend(server,msg);

    联机调试还是么有成功,又想是不是权限问题呢,直接copy到/Applcation下面,ldid一把,运行,我靠,成功了!

    去死吧,at命令!!

    IPhone短信相关部分研究

    短信发送和截获

    方式一:

    打开/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?!

    再顺带的提一下,难道IPhone不开放sms 的api是担心中国的sp同学们么?还是商业模式上卡死一个付费渠道?