美文网首页
SMSNinja源码研究---短信监听

SMSNinja源码研究---短信监听

作者: XX开发从开始到放弃 | 来源:发表于2017-08-25 18:26 被阅读0次

    /var/mobile/Library/SMS 中sms.db存放了短信数据 未加密 可解读

    通讯录存放位置不正确

    为/var/mobile/Library/CallHistoryDB

    8.4中  无Safari/Histroy.plist


    http://www.cnblogs.com/OtionSky/archive/2011/11/10/iPhone_TelephoneCenter.html这篇博客详细讲述了IOS5、6上怎么样短信电话拦截

    先感谢snankky的开源精神 分享了SMSNinja这个著名开源插件的源码 SMSNinja-master.zip

    这个源码对于后续的关于短信来电的研发提供非常宝贵的材料

    主要实现了 短信的监听 iMessage的监听 下面主要介绍实现过程以及踩过的坑

    实现代码如下:

    %group SNIncomingMessageHook_5_6_7_8

    %hook IMDServiceSession

    - (void)didReceiveMessage:(id)message forChat:(NSString *)arg2 style:(unsigned char)arg3 // incoming iMessage_5/message_6_7_8

    {

    %orig;

    NSLog(@"message coming:");

    message = (IMMessageItem *)message;

    NSString *text = [[message body] string];

    NSLog(@"%@",text);

    }

    %end

    %end

    %hook IMDaemon

    - (void)_loadServices

    {

    %orig;

    NSLog(@"zenmeyang:ffff");

    %init(SNIncomingMessageHook_5_6_7_8);

    }

    %end

    %ctor

    {

    %init

    }

    这里面关于logos的语法问题就不介绍了 总之也很头痛

    对于IOS5,IOS6来说 添加CTTelephonyCenterAddObserver 的监控 是有效监听短信来电的有效方法 上面的那个博客说的很详细了

    但是在IOS7,IOS8之后 苹果改变了这种机制

    这两种系统中 IOS后台维护了一个后台进程 这个后台进程是:com.apple.imagent

    这个不用白费心机的打印出来

    打印结果如图

    根本没有这个进程

    原来苹果在编译阶段 并未加载这个进程 这个进程是在苹果实际运行的时候加载进去的 这样打印当然看不到

    就是这个进程 主宰着IOS中SMS和iMessage的短信收发,这个进程从系统启动到结束 一直存在后台运行并始终有权限

    所以很简单,无论你怎么对可疑函数进行hook,根本就没有用 因为这个函数是在 这个后台进程 称之为imagent进程 中加载的 你无法获取到这个imagent 就无法hook这个进程

    在IOS7中 这个进程启动函数是:IMDamenCore这个私有框架里 IMDService类的- (void)loadServiceBundle 函数 即 只有在这个函数里加载可疑函数才有用 目标函数是:_processReceivedMessage

    在IOS8中 这个进程的启动函数是:IMDaemon 这个我根本查不到它是哪个框架哪个类里的_loadServices是进程加载函数 目标函数是:- (void)didReceiveMessage:(id)message forChat:(NSString *)arg2 style:(unsigned char)arg3 只有在这个函数里面加载才有用

    接下来的才是大坑,因为imagent这个进程仅仅在系统启动的时候才启动一次 所以每次更新完tweak后 必须要重新启动一次imagent这个进程 否则tweak根本不会生效 可以通过reboot来重启imagent进程

    这里声明一下 重启reboot和重启spring board是两个事件 重启reboot则重启所有的service,而重启spring board则仅仅重启自己

    相信也一定有办法重启imagent进程 而不用每次都重启reboot

    结果如图

    大功告成

    theos中有个很大的bug 即是只要tweak中 不存在logos的基本的语法错误 不存在未知类的链接错误 就不会报错 就是说 假设我在tweak里面hook一个根本没有的类 根本没有的函数 theos也不会报错

    诸如上述 在IOS9.3中 IMDaemonCore框架虽然有 但是属于私有框架 如果不对其进行添加,那么 didReceiveMessage 这个函数根本就不会被hook,因为这个函数这个类 根本就不能被识别

    现在在IOS9.3中 添加PRIVATE_FRAMEWORKS 发现 IOS9.3的framework文件路径有误

    经查阅发现 这个没有办法theos目前的私有框架引用 就是不支持IOS9.3

    所以要把xcode降级到9.2

    theos无法debug开发 是它最大的弊端,只好在里面不停的输出log了

    比如

    这里的abcd类里的 woke函数根本不存在

    编译器也不报错

    也许 这就是短信hook为什么不通的原因

    但是 我可以很明确的缺点 在添加了 IMDaemonCore之后 确实存在着IMDServiceSession这个类 也确实存在这个函数 为什么SMSNijina能拿到log,能到这个函数 我却不能····

    后来发现不少这个原因····

    此为上述监听短信行为demo的编译文件

    可以看到降级到9.2之后 可以成功添加私有框架

    最后贴出监听发短信和打电话的行为代码

    %hook UIApplication

    -(BOOL)openURL:(id)arg1

    {

    %log;

    BOOL returnValue = %orig;

    NSString*actionName = @"";

    NSString *actualString = [arg1 absoluteString];

    if ([actualString hasPrefix:@"sms"]) actionName = @"发短信";

    else if ([actualString hasPrefix:@"tel"]) actionName = @"打电话";

    else actionName = @"木知";

    NSProcessInfo *info = [NSProcessInfo processInfo];

    NSLog(@"I konw what you are doing:\n行为:%@\n参数:%@\n进程名:%@\n进程编号:%d\napp bundle id:%@\n当前线程:%@\n当前时间:%@",actionName,arg1,info.processName,info.processIdentifier,[[NSBundle mainBundle]bundleIdentifier],[NSThread currentThread],[NSDate date]);

    return returnValue;

    }

    %end

    相关文章

      网友评论

          本文标题:SMSNinja源码研究---短信监听

          本文链接:https://www.haomeiwen.com/subject/cnhpdxtx.html