android安全问题(五) 抢先拦截短信 - 结果篇
来源:互联网 发布:淘宝第二件半价怎么弄 编辑:程序博客网 时间:2024/06/06 06:37
同上篇文章一样,这里只陈述结果,代码分析稍后给出
导读:本文叙述如何先于某些伪杀毒软件、病毒、常规软件获取到短信
众所周知,android系统在收到短信息的时候会发送广播,但是此广播是有序广播,也就是说:先接收到广播的人,如果心情不好,它就不会向后传递此广播,后面的人就不会知道有短信到来
这与无序广播不同,无序广播并不是真的没有顺序(只是似乎大家习惯这么叫而已),无序广播的接收者也是排队等待广播的,只不过是在传递过程中,大家必须遵守规则,一直把消息传递给最后一个人才可以
关于无序广播与静态接收器搭配的接收顺序,上一篇文章已经说的很清楚了
由于开机之后程序都没有开始运行,所以想自动运行必须要接收
现在我们看看程序启动之后的情况,我以大家关心的接收短消息为例
想要在程序中接收短信,就要接收如下广播
android.provider.Telephony.SMS_RECEIVED
系统把它作为有序广播进行发送,那么,谁第一个接收到短信将变得至关重要,无论你是杀毒软件、伪杀毒软件、病毒还是普通程序
之前说过静态接收器的接收顺序
那么动态接收器和静态接收器相比呢?
答案是静态接收器优先级低于动态接收器,也就是说,无论多么高级别的静态接收器和多么低级别的动态接收器都接收同一广播,永远都是动态接收器先接收到!
动态接收器是在代码中设置的,所以,我们需要先启动程序,才能接收广播,这也是我们无法用它接收开机广播的原因
同样的,动态接收器也可以设置优先级,高优先级的接收器会在低优先级的接收器之前接收到广播
那么,同样优先级的动态接收器,接收广播的顺序是怎样的呢?
幸好,他们的规则与静态接收器的规则不同
同样优先级的动态接收器,谁先注册到系统,谁就抢先接收到广播
上面虽然完全只是文字叙述,但我相信,大家也是看明白了的
下面总结一下,如何能保证自己的程序抢先于其他程序接收到短信
1.根据上一篇文章的做法,保证自己先于其他程序启动
2.启动第一个事情就要开启服务,动态注册广播,并把优先级设置为最高
代码实现也非常简单
一个接收器
- private DynamicReceiver dynamicReceiver = new DynamicReceiver();
- public class DynamicReceiver extends BroadcastReceiver {
- public void onReceive(Context context, Intent intent) {
- Log.e(SmsUtil.TAG, "dynamic receiver");
- String action = intent.getAction();
- if(SmsUtil.SMS_ACTION.equals(action)){
- context.startService(SmsUtil.getIntent(context, MainService.class, intent, "dynamic receiver"));
- }
- }
- }
动态注册
- public static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";
- IntentFilter intentFilter = new IntentFilter(SMS_ACTION);
- intentFilter.setPriority(Integer.MAX_VALUE);
- registerReceiver(dynamicReceiver, intentFilter);
最后总结一下,接收器接收广播的顺序
动态接收器高优先级 > 动态接收器低优先级 > 静态接收器高优先级 > 静态接收器低优先级
同等优先级的动态接收器,先注册的先接收
同等优先级的静态接收器,接收广播的顺序与String[] java.io.File.list()顺序一致
结束之前说点题外话
有些广播,我们无法用静态接收器接收
比如ACTION_SCREEN_ON,当屏幕被点亮的时候系统发送此广播
如果你尝试在manifest中注册receiver来接收,那么会失败,这是为什么呢
我们来看看系统是如何发送此广播的
void com.android.server.PowerManagerService.initInThread()
- void initInThread() {
- ……
- mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON);
- mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF);
- mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- ……
- }
他们在Intent中都设置了Intent.FLAG_RECEIVER_REGISTERED_ONLY,所以,如果要接收,必须动态注册广播接收器
ACTION_SCREEN_OFF也是如此
(这段说明应该放的之前的android安全问题(三) 钓鱼程序中,现在补上)
关于FLAG_RECEIVER_REGISTERED_ONLY的说明
public static final int FLAG_RECEIVER_REGISTERED_ONLY
If set, when sending a broadcast only registered receivers will be called -- no BroadcastReceiver components will be launched.
在来看一个广播,ACTION_BATTERY_CHANGED
电池电量发生变化的时候,系统发送此广播
void com.android.server.BatteryService.sendIntent()
- private final void sendIntent() {
- // Pack up the values and broadcast them to everyone
- Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
- | Intent.FLAG_RECEIVER_REPLACE_PENDING);
- ……
- }
所以我们必须动态接收
- android安全问题(五) 抢先拦截短信 - 结果篇
- android安全问题(五) 抢先拦截短信 - 结果篇
- android安全问题(五) 抢先拦截短信 - 结果篇
- android安全问题(五) 抢先拦截短信 - 结果篇
- android安全问题(五) 抢先拦截短信 - 结果篇
- android安全漏洞(五) 抢先拦截短信 - 结果篇
- android安全问题(四) 抢先开机启动 - 结果篇
- android安全问题(四) 抢先开机启动 - 结果篇
- android安全问题(四) 抢先开机启动 - 结果篇
- android安全问题(四) 抢先开机启动 - 结果篇
- android安全问题(四) 抢先开机启动 - 结果篇
- android安全漏洞(四) 抢先开机启动 - 结果篇
- Android抢先截获短信(源码分析)
- android安全问题,抢先开机启动
- android安全问题(六) 抢先接收广播 - 内因篇之广播接收器注册流程
- android安全问题(七) 抢先接收广播 - 内因篇之广播发送流程
- android安全问题(七) 抢先接收广播 - 内因篇之广播发送流程
- android安全问题(七) 抢先接收广播 - 内因篇之广播发送流程
- android安全问题(三) 钓鱼程序
- 主对话框如何调用子对话框的变量及事件
- android安全问题(四) 抢先开机启动 - 结果篇
- device_create ()详解
- Mysql----操作
- android安全问题(五) 抢先拦截短信 - 结果篇
- Shell-求时间差
- 2012“粤嵌杯”芯片应用电子设计比赛成功举办
- 字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()
- android手机root后的安全问题 (一)
- Windows下动态内存分配方式 .
- linux 处理两个文件的并集,交集,计数
- Qt mapToGlobal 以及 mapToParent 理解要点
- android手机root后的安全问题 (二)