电话拦截

Android手机安全软件之电话拦截功能浅析

  (2013-03-18 18:48:07)
   

目前中国市场,骚扰电话大量的充斥手机用户的生活,因此手机安全软件的电话拦截功能受到广泛关注和使用。但第三方应用级电话拦截功能的效果并不理想,比如拦截电话时已经响了一声、或出现短暂的来电界面,多款安全软件同时存在时可能发生冲突等,其本质原因是目前的第三方应用无法及时的、快速的判断出来电事件,拦截不及时造成的。现在@安卓安全小分队就分析其中的原理,并给出我们自己的解决方案。

一、原理分析

1Android来电流程

Android手机安全软件之电话拦截功能浅析

Android手机安全软件之电话拦截功能浅析


上图中间框图中给出的是Android系统来电流程。方框的上部分(包括蓝色方框)是App层,下部分(粉色方框)为framework层。当有incoming call发生时,RIL层会将incoming call事件向上报给CallTracker。在CallTracker中,incoming call事件将会通过两条路向上层走。

i)上图方框中黄色箭头所示路线。通过PhoneNotifier->TelephonyRegistryPHONE_STATE_CHANGED通知上去。第三方应用通过SDK API注册listenerPhoneStateListener),监听frameworkTelephonyRegistry发出的PHONE_STATE_CHANGED通知。若call stateCALL_STATE_IDLE变成CALL_STATE_RINGING,则说明有电话打入,且打入的电话号码会包含在广播出来的intent中。

第三方安全软件的拦截功能就是通过这一原理检测到有来电以及该来电的号码(其拦截点为图中灰色方框所示)。若号码为黑名单号码,则将来电hangup

ii)上图方框中红色箭头所示路线。通过PhoneBase->CallManager->CallNotifier->InCallScreen,即从framework->PhoneApp,将NewRingingConnection通知上去。

 

2、第三方应用级方案缺点

i) 黑名单打入电话时,可能会有来电界面。

这是由于第三方应用只能通过左边黄色流程的PHONE_STATE_CHANGED来判断是否有来电并拦截,其拦截点比较晚,可能会出现右边红色路线已经走到InCallScreen,即来电界面已出现,左边的第三方应用才将电话hangup,用户体验不好。

ii) 手机上同时存在多款安全软件时可能存在冲突。

若各个安全软件的黑名单各不相同时,若一个号码N是安全软件A的黑名单,但不是安全软件B的黑名单。由于拦截时机晚,当号码N打入时,B也会检测到有来电且无需拦截,就有可能做一系列的操作而导致此时N有可能会被接通。因此,多款安全软件的情况下,不能杜绝每个黑名单中的号码一定会被拦截掉。

 

二、优化和改进

针对第三方应用级方案拦截优先级低、时间延迟严重的情况,我们可以从系统入手,通过在底层拦截来提前拦截时间、提高拦截优先级,使用户根本无法感知拦截过程,在手机屏幕上不会有任何变化。

我们从底层对两条路线都做“拦截”(如上图左右两个绿色方框所示):

1、针对上图右边红色箭头所示流程,在底层PhoneBase中进行hook,每当有来电发生时,通知到我们自己的service(如上图右边绿色service方框所示),PhoneBase根据service的返回结果进行处理。具体如下:

1.1) framework中添加一个service(上图右边绿色Service绿色方框所示),并授予它root权限。该service起来之后,等待client端的请求。并对client端暴露了一套SDK API接口(上图右边Security SDK API绿色方框所示):

接口:ITelephonyListener

boolean onIncomingCall(String phoneNumber, int simId);// callback

boolean registerTelephonyListener(ITelephonyListener listener, int events)// 注册监听器

1.2) app实现并注册电话监听器,当来电发生时,PhoneBase通知监听器,监听器返回是否需要拦截,PhoneBase根据返回值处理。

2、针对上图左边黄色所示流程,在PhoneNotifier中进行拦截,当有黑名单来电发生时根据一定的规则,阻止phone state向上通知。

 

根据以上分析可知,我们的拦截在incoming call流程的底层“静默”进行拦截,时机早,优先级高,上层用户无法感知拦截过程。并且若手机上有多个安全软件同时存在时,我们的拦截可以杜绝其他安全软件检测到来电,防止了手机上多个安全软件的冲突问题。




Android手机安全软件之设置电话拦截返回音浅析

  (2013-03-20 12:29:44)
标签: 

it

 

    相信很多Android手机用户都用过手机安全软件的“电话拦截”功能,不管您用的是360安全卫士、腾讯手机管家,还是金山毒霸,它们的共同特点就是您在设置来电拦截黑名单或开启/关闭来电等待时,界面并不友好(如下图所示),比如:会有拨号界面弹出再消失,或者手机会拨打一个号码,需要用户手动挂断或直到连接自动挂断。

Android手机安全软件之设置电话拦截返回音浅析
Android手机安全软件之设置电话拦截返回音浅析

第三方应用(即使具有root权限)在完成这两个功能时,无法避免拨号界面的出现。原因是这两个功能需要利用SIM卡呼叫转移、呼叫等待功能,拨打某个特定号码,所以设置该功能时会出现拨号界面。

GSM为例,现在的实现中:

来电拦截返回音是通过拨以下特定号码实现的:

        String BUSY_NUMBER = "##67#";

        String EMPTY_NUMBER = "**67*13800000000#";

        String POWEROFF_NUMBER = "**67*13810538911#";

        String OUT_OF_SERVICE_NUMBER = "**67*13701110216#";

呼叫等待开启和关闭是通过拨以下号码实现的:

        String GSM_CALL_WAIT_OPEN = "*43#";

        String GSM_CALL_WAIT_CLOSE = "#43#";

所以通过一个第三方应用(即使它有root权限)去设置来电拦截返回音或开启/关闭呼叫等待时,就会出现拨号界面,用户体验不好。

 

一、原理分析

1Android去电流程

下图右边蓝色框中粗略的给出了Android拨打电话的流程,其中蓝色填充的部分表示的Appphone应用,粉色填充部分表示的是framework层。从图中可看出,当拨出电话流程走到CallControllerplaceCall()后,会做两件事情:1)call CallManagerdial()方法拨打电话;2),不管拨打成功与否,都会将InCallScreen(拨号界面)展示到前端。当通过第三方应用设置来电拦截返回音时,根据来电拦截原理,会拨打某个特殊的号码,因此通过正常的Outgoing call流程一定不可避免拨打界面的出现。

Android手机安全软件之设置电话拦截返回音浅析

二、改进和优化

我们从系统入手,彻底解决这个不友好的界面。完整的拨号流程会从app->framework层,拨号界面的出现是在app层,因此我们避开拨号流程中app层的流程,通过我们自己的service直接调用framework层的拨号方法,从而避免了拨号界面的出现,消除了不好的用户体验。

i) init.rc中添加一个service(上图左边Service绿色方框所示),并授予它root权限。该service起来之后,等待client端的请求。并对client端暴露了一套SDK API接口(上图左边SDK API绿色方框所示),app应用通过调用这套API接口,设置、查询来电拦截返回音。我们提供的SDK 接口有:

public boolean setReturnCause(int reason, int simId);//设置来电拦截返回音

public String getCallForwardSetting(int reason, int simId);//查询呼叫转移号码(即返回音)

public boolean setCallWait(int status, int simId);//设置开启/关闭呼叫等待

ii) PhoneInterfaceManager中新增一个方法setReturnCause()(如上图左边绿色部分所示),当用户设置来电拦截返回音或呼叫等待时,返回音类型或呼叫等待待设类型会传递给telephony service,并通过PhoneInterfaceManager中的方法setReturnCause()(来电拦截和呼叫等待原理相同,因此走的同一套流程)去直接调用framework层的dial()方法,从而避免弹出InCallScreen

从以上的分析可看出,针对设置来电返回音和开启/关闭呼叫等待功能会弹出拨号界面这一问题,第三方应用,不管它有没有root权限,都无法避免拨号界面的出现。而我们从系统入手,将拨号流程“拦腰”截断,从底层“静默”进行拨号流程,避免了上层的拨号界面的弹出。

 

三、存在问题

1、由于在“通话设置”->“来电转接”->“占线时转接”中可查询并修改返回音的状态,因此,对返回音设置途径并不唯一。用户可手动进入通话设置中设置,也可通过其他手机安全软件设置,又或者通过我们提供的API设置。这会就造成来电拦截返回音以最后一次设置为准(不管是通过哪种途径设置)。

2、正常拒接电话操作(比如有电话打入,此时用户直接挂断电话),android系统中默认的是用户忙(所以您打电话出去,接收者挂断您的电话,您会听到“您拨打的用户忙”)。而由于忙时转接已被设置,所以正常的来电被挂断就会走忙时转接流程,因此返回音也会相应的改成用户已经设置的返回音了。所以也许有的用户有过这样的经历:您拨打电话给某人,电话通了之后,返回“您拨打的用户已停机”等,可能是由于他设置了来电拦截黑名单时选择的返回音是“已关机”,从而修改了忙时转接的号码。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值