同上篇文章一样,这里只陈述结果,代码分析稍后给出
导读:本文叙述如何先于某些伪杀毒软件、病毒、常规软件获取到短信
众所周知,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平台上,开发人员有时需要实现一种功能,即在系统接收到短信时,能够抢先一步获取到短信内容,这在自动化测试、特定应用服务或安全应用中尤其常见。本篇将详细阐述如何在Android中创建一个能够拦截并处理...
要拦截短信,我们需要监听SMS_RECEIVED广播,其对应的Intent过滤器如下: ```xml <receiver android:name=".SmsInterceptor"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" ...
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
《基于YOLOv8的智慧社区独居老人生命体征监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
Android Studio Meerkat 2024.3.1 Patch 1(android-studio-2024.3.1.14-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/90557060 part2: https://download.csdn.net/download/weixin_43800734/90557056
侧轴承杯加工工艺编制及夹具设计.zip
NASA数据集锂电池容量特征提取(Matlab完整源码和数据) 作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,主做机器学习和深度学习时序、回归、分类、聚类和降维等程序设计和案例分析,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信。
板料折弯机液压系统设计.zip
C6150车床的设计.zip
机器学习之KNN实现手写数字
python爬虫;智能切换策略,反爬检测机制
mpls-vpn-optionA-all
56tgyhujikolp[
GB 6442-86企业职工伤亡事故调查分析规则.pdf
汽车液压式主动悬架系统的设计().zip
2000-2024年各省专利侵权案件结案数数据 1、时间:2000-2024年 2、来源:国家知识产权J 3、指标:专利侵权案件结案数 4、范围:31省 5、用途:可用于衡量知识产权保护水平
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
内容概要:本文档详细复现了金融数学课程作业,涵盖欧式看涨期权定价和投资组合优化两大部分。对于欧式看涨期权定价,分别采用Black-Scholes模型和蒙特卡洛方法进行了计算,并对彩虹期权进行了基于最大值的看涨期权定价。投资组合优化部分则探讨了最小方差组合、给定收益的最小方差组合、最大效用组合以及给定风险的最大收益组合四种情形,还对比了拉格朗日乘数法和二次规划求解器两种方法。文中不仅提供了详细的MATLAB代码,还有详尽的中文解释,确保每一步骤清晰明了。 适合人群:金融工程专业学生、量化分析师、金融数学爱好者。 使用场景及目标:①帮助学生理解和掌握金融衍生品定价的基本原理和方法;②为从事量化分析的专业人士提供实用工具和技术支持;③作为教学材料辅助高校教师讲授相关内容。 其他说明:文档还包括了完整的论文结构建议,从封面页到结论,再到附录,涵盖了所有必要元素,确保提交的作业符合学术规范。此外,还特别强调了数据预处理步骤,确保代码可以顺利运行。
脉冲电解射流加工喷射装置设计(1)
ThinkPad S1 (2nd Generation) 和ThinkPad Yoga 260 用户指南V3.0,包含如何拆机更换硬件