Android安全问题 抢先拦截短信
同上篇文章一样,这里只陈述结果,代码分析稍后给出
导读:本文叙述如何先于某些伪杀毒软件、病毒、常规软件获取到短信
众所周知,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()顺序一致
ordered广播
假设有如下优先级的5个接收器
1.动态A(优先级=1)
2.动态B(优先级=2)
3.动态C(优先级=2)
4.静态D(优先级=1)
5.静态E(优先级=2)
并且B先于C注册
那么实际接收顺序应为
B C E A D
也就是说,如果静态接收器的优先级高于动态接收器的优先级,那么还是静态接收器先接收到广播(比如接收短信)
非ordered广播
动态接收器高优先级 > 动态接收器低优先级 > 静态接收器高优先级 > 静态接收器低优先级
结束之前说点题外话
有些广播,我们无法用静态接收器接收
比如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安全问题 抢先拦截短信 ...
- android131 360 05 手势触摸滑动,sim卡,开机启动的广播,手机联系人,SharedPreferences,拦截短信
安卓手势触摸滑动: package com.itheima52.mobilesafe.activity; import android.app.Activity; import android.con ...
- Android安全问题 抢先接收广播 - 内因篇之广播发送流程
导读:本文说明系统发送广播的部分流程,如何利用Intent查找到对应接收器.我们依然只关注接收器的排序问题 这篇文章主要是针对我前两篇文章 android安全问题(四) 抢先开机启动 - 结果篇 an ...
- Android之——拦截短信
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46994097 这里.向大家简介通过BroadcastReceiver来拦截短信的方 ...
- Android 拦截短信
public class SMSMess extends BroadcastReceiver { @Override public void onReceive(Context arg0, Inten ...
- Android安全问题 抢先开机启动
导读:我们以如何抢先开机启动为例,来说明接收无序广播的静态广播接收器的接收顺序 (注意,文本只是陈述结果,所以叫结果篇,之后的文章再给出源码分析) 首先先说一下android中的广播和广播接收器 广播 ...
- 转载使用 ContentObsever 拦截短信,获取短信内容
在一些应用上,比如手机银行,QQ,微信等,很多时候我们都需要通过发送验证码到手机上,然后把验证码填上去,然后才能成功地继续去做下面一步事情. 而如果每次我们都要离开当前界面,然后去查收短信,记住验证码 ...
- Android抢先截获短信(附源码)
之前在写通讯录应用时,将整体的代码写完后,自测时发现非常非常多的问题,其中一个非常重要严重的就是可以发出短信,但收不到任何的短信息,这搞的我好捉鸡啊!后来调试发现是由于没有收到短信的消息导致的,然后将 ...
- android安全问题(八)伪造短信(利用原生android4.0漏洞)
导读:本文利用android4.0的一个原生漏洞来伪造短信.无须声明任何权限即可伪造发送方为任何号码的短信给用户. android4.0发布已经是很久很久很久很久以前的事情了,这个漏洞早就报了出来,之 ...
随机推荐
- C/C++中浮点数格式学习——以IEEE75432位单精度为例
这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式: 位单精度 个比特存储. 位长 至23偏正值(实际的指数大小+127) 至0位编号(从右边开始为0) S为符号位,Exp为指数字, ...
- C#中调用unmanaged DLL
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- CICS日志---内存问题
Level 9 COCITOOL_XA: Connected! [2014-01-09 19:46:24.296834][22347888] Level 0 TestPerormence: GDAO ...
- 模板:cin.getline用法
Ref: http://baike.baidu.com/view/2383876.htm 此函数会一次读取多个字符(包括空白字符).它以指定的地址为存放第一个读取的字符的位置,依次向后存放读取的字 ...
- spring heibernate 调用存储过程
一:参考网址 http://sunbin123.iteye.com/blog/1007556 二:示例 @Autowired @Qualifier("jdbcTemplate") ...
- 粗谈Android中的对齐
在谈这个之前先啰嗦几个概念. 基线:书写英语单词时为了规范书写会设有四条线,从上至下第三条就是基线.基线对齐主要是为了两个控件中显示的英文单词的基线对齐,如下所示: Start:在看API的时候经常会 ...
- Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解
Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...
- c 递归函数浅析
所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构的查询和访问. 递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很 ...
- ffmpeg yuv转h264
ffmpeg -s 176x144 -i container_qcif_176_144.yuv -b:v 7776k -r 25 -vcodec libx264 ds.h264
- Elasticsearch从0.90到1.2的不兼容变化-系统和设置
本文为官方文档的翻译加个人理解.作者翻译时,elasticsearch(下面简称es)的版本为1.2.1. 1.系统级别及设置方面 1.1 es启动时,默认是作为一个前台程序启动.如果你想让e ...