短信拦截,如何抢先于QQ通讯录,360

news/2024/12/21 16:42:22/

最近写一个应用(A),需要拦截短信分析。一般是这样实现的:注册一个接受短信Intent-Filter,获取短信广播,分析短信内容然后相应处理。对特定短信终止广播继续(abort方法),阻止其进入收件箱。大致就是这么一个过程。


但上述方式,在QQ通讯录/360/飞信存在的情况下,拦截短信失败~也就是说它们抢先拿到了收短信的广播,并将其中断了。那么如何解决这个问题呢~


本来以为腾讯是拦截ril层的消息,然后阻止广播继续,但是这种方式要修改framework才能实现。


后来发现存在广播接收器(Receiver)的Intent-Filter的优先级(priority),SDK里说Prioruty的范围是-1000~1000,若设为一千以上好像跟1000的效果一样。然后我在A应用中的Manifest里将Receiver的Intent-Filter优先级设为1000,但测试结果还是被QQ通讯录抢先。


进一步Google后,得到下面的结论:

反编译QQ通讯录/360手机卫士,发现些许奥秘。貌似这个涉及到Broadcast的分发机制,参考底层代码应该比较好解释~

广播分为2中,无序和有序。可以理解为散列和队列。


首先无序广播,不能中断,所有注册相应Intent-Filter的Reciver都可以接收到~


其次是有序广播,可以中断。它的消息是按优先级传送的,任何一个Receiver在接收后,可以使用abort将其停止,这样就导致了后续的Receiver不能收到广播。


下面是一个猜想,做了些测试,也基本符合~


假设广播接收器的优先级都设为最大整型2147483647,首先动态注册优先级最高,其次是静态注册。在动态注册中,最早注册的优先级最高。在静态注册中,最早安装的程序,优先级最高(注:安装apk会解析af.xml,把其加入队列)


在反编译360后,发现其静态注册的广播接收器里设置的优先级数值为2147483647,然后再广播中启动一个service,在service中注册一个优先级为2147483647的同样地广播接收器。也就是说,假设现在进程全杀,那么短信来了,360和QQ通讯录,谁先安装,谁的静态注册广播接收器就会先启动,然后把广播中断,而且它还启动了一个service又动态注册一个Receiver。这样,它的优先级就排在了所有静态接收器之前了。


所以,我们做个试验,以同样的方式:

首先写一个应用,注册一个开机完成的Receiver

<receiver android:name=".MyBrocast" android:permission="android.permission.BROADCAST_SMS"><intent-filter android:priority="2147483647"><action android:name="android.provider.Telephony.SMS_RECEIVED" /></intent-filter><intent-filter android:priority="2147483647"><action android:name="android.intent.action.BOOT_COMPLETED" /></intent-filter></receiver>


然后再这个Receiver接收到开机广播后,立即启动一个service

public void onReceive(Context context, Intent intent) {Log.v("MyBrocast.onReceive", "testtttttttttttt");if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){Intent service=new Intent(context, MyService.class);context.startService(service);}}


然后在service中重新动态注册一个Receiver,优先级为2147483647

IntentFilter localIntentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");localIntentFilter.setPriority(2147483647);MyBrocast localMessageReceiver =new MyBrocast();Log.v("MyBrocast.onReceive", "onCreate");Intent localIntent = registerReceiver(localMessageReceiver, localIntentFilter);


 

重启手机就OK了,抢先360、QQ拦截短信~因为360/QQ并没有在接受开机广播后,动态注册短信广播的接收器。这样重启后A应用就可以在它们之前拦截到短信了~


但上述抢先方式,付出的代价是,A应用需要一直有这么一个service后台运行。一旦被杀,优先权又回被360/QQ抢占,只有等到下次重启。除非A应用在QQ/360之前安装到手机上~


总结一下:

具体的顺~ 代码动态注册的Intent-Filter高于manifest静态注册的Intent-Filter。动态注册中的Intent-Filter在相同优先级下(如整型的最大值),接受顺序是按照动态注册的时间顺序。静态注册中Intent-Filter在相同优先级下,接受顺序是apk的安装顺序。

/**
* @author 张兴业
* 邮箱:xy-zhang#163.com
* android开发进阶群:278401545
*
*/
参考帖子:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=148381


http://www.ppmy.cn/news/701141.html

相关文章

C语言写电话通讯录

首先&#xff0c;书写一个东西要清楚框架和需求 1.通讯录中能够存储1000个人的信息 每个人的信息包括&#xff1a; 名字 性别 年龄 电话 地址 2.增加人的信息 3.删除人的信息 4.修改人的信息 5.查找指定人的信息 在这里&#xff0c;创建 头文件contact.h 源文件con…

C++电话通讯录_黑马

任务 添加联系人&#xff1a;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;联系电话&#xff0c;家庭住址&#xff08;上限1K&#xff09; 显示 删除&#xff08;按照姓名 查找&#xff08;按照姓名 修改&#xff08;按照姓名 清空全部 退出sys 效果&#xff1a; Code&am…

通讯录_通讯录拦截防爆

为了通讯录所谓的面子强撑 很多朋友因为其他原因借了714高炮或者其他网贷口子&#xff0c;一直在循环使用&#xff0c;每月给的利息就是工资的一半或更多&#xff0c;导致快到强制的边缘 每个人的家庭环境又不一样&#xff0c;想强制又因为怕催收骚扰到家人一直在苦苦强撑&…

插入排序——希尔排序

希尔排序其实就是一种插入排序&#xff0c;实际上就是通过直接插入排序一步步改进优化而实现的。所以在了解希尔排序之前要明白插入排序的实现原理。 插入排序 其实我觉得插入排序也可以叫做摸牌排序&#xff0c;就是从第二张牌开始处理&#xff0c;将摸到的牌按照合适的顺序插…

浅谈智能照明系统发展及在工程中的应用

安科瑞 华楠 &#xff3b;摘 要&#xff3d;长久以来&#xff0c;智能照明系统在国内未被得到重视&#xff0c;多数建筑物仍用传统方式来控制的灯光照明&#xff0c;一些智能建筑使用楼宇自动化&#xff08;ba&#xff09;系统监控照明&#xff0c;但只能实现简单的区域照明和…

抓取高德地图位置信息及预览图片,生成excel文件小白教程

本人也是小白初学者&#xff0c;所以教程很小白&#xff0c;有不对的地方请指正&#xff0c;谢谢。 抓取步骤 1.申请高德地图API 2.新建excel文件 3.获取网页源代码 4.分析代码&#xff0c;找到需要抓取的内容位置特点&#xff0c;抓取内容 5.将抓取到的内容插入到文件中&…

批量提取PDF和图片发票信息 2.2

人工录入发票信息真的好烦&#xff0c;有什么软件可以快速解决这个问题吗&#xff1f;​ 那天看到这个问题后&#xff0c;自己写了一个批量提取发票信息的小软件&#xff0c;打开软件之后&#xff0c;选择大量发票文件所在的文件夹就可以了&#xff0c;会自动把发票识别的结果…

免费物流跟踪轨迹订阅接口技术文档-快递鸟

物流跟踪由轨迹订阅接口和轨迹推送接口组成&#xff0c;对接时需要对接以下二个接口 1.轨迹订阅接口 1.1 功能说明 快递鸟物流轨迹订阅接口用于向快递鸟订阅物流轨迹信息。将订单内容通过订阅接口订阅到快递鸟&#xff0c;客户可自动获取运单的轨迹节点信息。 免费试用接口&…