同上篇文章一样,这里只陈述结果,代码分析稍后给出
导读:本文叙述如何先于某些伪杀毒软件、病毒、常规软件获取到短信
众所周知,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); …… }
所以我们必须动态接收
请大家不要用root的手机随意下载软件,更不要以任何借口制造任何病毒!
转贴请保留以下链接
本人blog地址
相关推荐
在Android 4.4(KitKat)及更高版本中,为了增强用户体验和安全性,系统提供了更高级别的API来处理短信,包括拦截和删除短信。本文将深入探讨Android 4.4+短信拦截删除的相关知识点。 首先,我们要了解的是`...
在Android平台上,开发一款能够拦截电话和短信的应用是一项具有挑战性的任务,这涉及到对系统级权限的使用以及Android系统的深层理解。在这个毕业设计项目中,我们将会探讨如何实现这一功能,以及涉及的关键知识点。...
1. **Shadow Objects**:这是Robolectric的核心特性,它们是Android组件的模拟实现,用于在测试环境中拦截和处理方法调用。例如,ShadowActivity可以模拟真实的Activity生命周期,让测试可以精确控制活动的状态。 2...
在Android平台上,短信和电话拦截是一项重要的功能,它允许开发者创建应用程序来管理用户接收到的通信。本项目涉及的是一个已经编写完成的Android应用,它能够实现短信和电话的拦截功能,用户导入到Eclipse IDE中...
在Android系统中,短信拦截是一种常见的功能,它允许开发者或者用户对接收到的短信进行过滤、处理或阻止。本文将深入探讨Android短信拦截的核心概念、实现机制以及如何通过源码来理解和开发这样的功能。 首先,...
进行过研究,也拦截成功了。 但是针对不同的手机厂家的android系统...如果手机厂商做了较大的改动,拦截可能会有问题。 例如:联想的乐Phone,魅族M9,等拦截不好。会出现短信进入收件箱,才删除,或者根本拦截不成功。
在Android系统中,短信和电话拦截是一项重要的功能,它允许用户筛选不想要的来电和短信,提高生活和工作的效率,避免骚扰。Menutable Service则是一个与Android系统菜单相关的服务,可能涉及用户界面和系统级别的...
本文将深入探讨Android平台上的短信功能,特别是如何在Android应用中实现短信拦截,以及有序广播的概念。 一、Android SMS服务基础 Android系统提供了SmsManager类,它是处理短信操作的主要接口。通过这个类,...
Android 恶意代码逆向分析研究--以短信拦截木马为例.pdf
在Android系统中,短信拦截器是一种机制,允许开发者在短信到达设备时进行处理,比如过滤、存储或响应特定类型的短信。这个"Android 短信拦截器"可能是一个示例项目,展示了如何在Android 4.0.3(Ice Cream Sandwich)...
标题中的"SendSMS.rar"显然是一款针对Android平台的短信管理应用,主要功能是拦截和转发短信,而且特别强调了能够“过360”和“过拦截”,这意味着该应用具有绕过常见安全软件如360手机卫士的拦截的能力。在Android...
在Android平台上,实现短信和电话拦截是一项常见的功能,主要用于安全应用、防骚扰软件以及系统级的权限管理。本文将深入探讨如何在Android中利用广播接收器(BroadcastReceiver)、服务(Service)以及菜单(Menu)...
在Android系统中,短信拦截是一项重要的功能,它允许开发者创建应用程序来过滤或处理特定的短信。这个主题主要涉及Android的权限管理、广播接收器、Intent过滤以及短信相关的API使用。以下是对这些知识点的详细说明...
最后,短信拦截涉及到更深层次的操作,因为Android系统默认不允许第三方应用拦截短信。从Android 4.3(API级别18)开始,系统引入了权限`READ_SMS`和`WRITE_SMS`,但仅对系统应用开放。对于普通应用,可以监听短信,...
本压缩包文件“安卓日志分析崩溃拦截相关-android错误收集工具.rar”包含了若干可能用于错误收集和分析的工具,尽管无法确保每个工具都适用于所有情况,但它们提供了有价值的参考和学习资源。 1. **日志分析**:...
在Android开发中,网络编程是不可或缺的一部分,而OkHttp作为一款高效的HTTP客户端库,被广泛应用于Android应用中。...通过研究和实践,你将能够更好地理解和利用OkHttp的拦截器特性,提升你的Android应用的网络功能。
在Android开发中,"Android拦截接收短信"涉及到的是BroadcastReceiver(广播接收器)的使用,以及对系统短信服务的监听。BroadcastReceiver是Android四大组件之一,用于接收系统或应用广播事件,比如接收到短信、...
在Android应用开发中,用户权限管理和登录拦截是一个重要的部分,特别是在多模块化、组件化的大型项目中。Arouter是一款优秀的Android路由框架,它提供了一种高效、灵活的方式来管理应用程序内部的跳转。在这个主题...