基于Android智能手机防火墙分析主讲内容1引言2ANDROID的简介3防火墙的系统结构设计4ANDROID的安全关键技术5结束语1引言在当今社会,手机已经成为人们日常生活中不可或缺的一部分。随着科技的进步和人们生活质量的提高,普通手机已经无法满足人们的要求,手机不断更新换代,变得更加人性化和智能化,产生了智能手机。智能手机越来越被大众所接受,而用户根据以往使用电脑的经验,智能手机也伴生新的安全隐患。目前,智能手机的发展使得手机上的应用日渐丰富,甚至有超过电脑终端应用的趋势,传统互联网上存在着的各种信息安全问题逐渐延伸到移动互联网领域,甚至演化成为新的安全威胁。说到这,可以看一下现有智能手机安全软件情况,目前针对智能手机的安全软件大概分两种,一种是杀毒类的硬安全;另一种是隐私保护或恶意电话屏蔽等的软安全,如果说还能找出一种的话,就是前面两种的结合体。手机安全问题近期成为热点被社会各界普遍关注。在未来几年,随着智能手机用户的快速增长和手机支付等应用的普及,手机病毒制造的利益链将形成,手机安全面临的威胁将更加严峻。考虑到手机安全问题,选择一个稳健的手机操作系统成为了重中之重。Google在2007年11月5日公布了android手机系统平台之后,人们很快就把焦点转移到android上。因为它是一个真正意义上的开放性移动设备综合平台,拥有移动电话工作所需的全部软件。基于Android平台的可开发性和免费等特点,既能在Android平台上开发第三方软件,从而促进技术创新;又有助于降低开发成本,方便创造特色化产品。这无疑使之成为智能手机操作系统的首选。在智能手机众多功能当中,接听电话和接收短信则是人们使用最多的。因此,诈骗、骚扰的来电或短信等一系列问题,也成为人们日常通信中最大的安全隐患。本文正是针对上述问题,提出了一个防火墙的设计方案,主要功能是拦截骚扰来电和过滤垃圾短信。此设计方案不仅能有效拦截来电短信,而且在打击移动通信的不法分子和净化移动网络环境方面,起到了积极的作用。2ANDROID的简介Android早期由Google提出,后由开放手机联盟开发。它是基于Linux核心的软件平台和操作系统,由操作系统、中间件、用户界面和应用软件组成。它具有开放式的体系结构,拥有非常好的开发和调试环境,支持各种可扩展的用户体验,存在非常丰富的图形系统,因而有支持多媒体的功能和强大的浏览器。号称是首个为移动终端打造的真正开放和完整的移动软件。Android低层以Linux核心工作为基础,只提供基本功能,其它的应用以Java语言作为编程规范编写,但不能说它是基于Java的。2.2.1ApplicationAndroid会同一系列核心应用程序包一起发布,该应用程序包包括Email客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。2.2.2ApplicationFramework开发人员直接调用的API。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。2.2.3LibraryAndroid包含一些C/C++库,这些库是底层的,能被Android系统中ApplicationFramework的组件使用。2.2.4AndroidRuntime每个Android程序都在Dalvik虚拟机中运行,拥有独立的实例。Dalvik是基于寄存器的,可以高效运行的虚拟系统。而Dalvik可运行的文件是.dex文件,是通过AndroidTools,dx转化而来的,占据内存很小。2.2.5LinuxKernelAndroid的核心系统服务依赖于Linux2.6内核。需要linux提供的核心系统服务为安全,内存管理,进程管理,网络协议栈,驱动程序模型等,内核也作为硬件和其它软件层(不包括内核)的中间抽象层。3防火墙的系统结构设计如右图:3.2短信、来电拦截流程主要提供了5种拦截模式,分别是标准、全开、全拦、仅拦黑名单和仅过白名单,下面是各个模式的过滤流程:3.2.1标准模式3.2.2全栏与全开模式全栏是指所有来电或者短信,一律拦截;全开功能正好与全栏相反。3.2.3仅拦黑名单与仅过白名单模式所谓的黑名单,就是在这个名单中的联系人进行过滤不接听其电话或者不介绍其短线。而白名单正好相反,是除了白名单其它联系人不予理睬的过滤方式。这两种方式在智能手机防火墙中算是运用的最为广泛,可以手动输入、通过通话记录、短信记录或联系人列表当中导入添加黑白名单。如下图:右图所示:3.2.4关键词拦截接收来电或短信后,进行文字扫描,若发现存在已设置好不接收的关键字则拦截来电或短信并做下记录,若无则不拦截。3.2.5电话号码的前缀通配符拦截与3.2.3类似,截取来电或短信地址,在号码中检索,若存在事先设好前缀通配符则拦截并做下记录,若无则不拦截。3.2.6情景模式即在不同的时间接受不同人的电话或者短信。可按照用户不同的需求把号码列表分成不同的组群,当来电或短信接入时,先查询当前时间,再截取来电或短信号码,检测当前号码是否在当前时间拦截,若符合拦截条件,则拦截,反之则然。4ANDROID的安全关键技术在介绍如何实现“挂机”功能之前,首先需要介绍Android的AIDL。在Android中,每个应用程序都可以有自己的进程,在定UI应用的时候,经常要用到Service。在不同的进程中,怎样传递对象呢?显然,JAVA中不允许跨进程内在共享。因为传递对象,只能把对象拆分成操作系统能理解的简单形式,以达到跨界对象访问的目的。在J2EE中,采用RMI的方式,可以通过序列化传递对象。在Android中,则采用AIDL的方式。理论上AIDL可以传递Bundle,实际上做起来却比较麻烦。AIDL(Android接口描述语言)是一种接口描述语言;编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的。如果需要在一个Activity中,访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数(可能是多个参数),然后使用AIDL来传递这些参数,在消息的接收端,使用这些参数组装成自己需要的对象。AIDL的IPC的机制和COM或CORBA类似,是基于接口的,但它是轻量级的。它使用借类在客户端和实现层间传递值。如果要使用AIDL,需要完成两件事件:第一、引入AIDL的相关类;第二、调用AIDL产生的class。4.1.2通过AIDL实现“挂机”功能可能是出于安全方面的考虑,AndroidSDK在1.5版本之后,就把实现“挂机”的方法“屏避”掉了。之所以说“屏避”掉了,是因为通过查看操作系统源代码发现,发现依然可以通过TelephonyManager的getITelephony方法,获取ITelephony接口的实例(该接口的endCall()方法可以实现挂机)。在Android1.5以前,getITelephony是公开方法,然而在1.5版本之后,该方法己改为私有,因为被“屏避”掉了。因为要获得ITelephony实例对象,需要同时利用到Android的AIDL机制和JAVA的反射机制。首先,按照ITelephony所在的包名(com.android.internal.telephony)以及所拥有的方法,定义一个aidl文件(ITelephony.aidl)。并利用AIDL生成工具,生成同名java文件(在Eclipse中,会自动生成,并保存到gen文件的同名包名下)。接下来,通过JAVA的反射机制,获得ITelephony的实例对象,这里有一点小技巧,把本来私有的方法变为公开方法。4.1.3重新实现PhoneStateListener类在Android的SDK中,提供了PhoneStateListener类,可以监听来话机状态变化,计算机状态主要有三种状态,分别是CALL_STATE_RINGING(响铃状态)、CALL_STATE_OFFHOOK(挂机状态)、CALL_STATE_IDLE(平常状态)。因此需要重新续承PhoneStateListener,并重写onCallStateChanged方法。4.2过滤短信的实现原理4.2.1过滤短信的流程主要是通过监听系统信息数据库的变化,当有新的信息添加时,首先获取该信息的地址(号码),然后根据当前的拦截模式和用户自定义的黑白名单进行判断,如果符合过滤条件,则在数据库中删除短信。流程如图6:4.2.2ContentObserver类的使用ContentObserver在Android中是内容变化监听器的意思,主要用来监听数据库增删改查等变化。在使用前,需要先指明需要监听数据源的URI。由于需要监听系统的短信数据库,因此URI为(content://sms/)。其中Context提供了registerContentObserver(Uriuri,booleannotifyForDescendents,ContentObserverobserver)方法,注册指定数据源的ContentObserver。由于我们需要监听系统短信数据库的变化,同时需要作出过滤处理,因此需要重新实现ContentObserver,并重写onChange(booleanselfChange)。4.3挂断模式的实现原理一般的手机拦截软件,拦截时都是直接调用“挂断“的方法,但这样有一个坏处,就是会让对方感到是人为挂机,这多少有些不完美。挂断模式就是为了解决这个问题。挂断模式一般有以下几种,分别是直接挂机、停机、空号和关机。要实现各种挂断模式,其中关键技术是“呼叫转移”,常见的呼叫有如下四种:l无条件呼叫转移:激活方式*21*号码#,取消方式#21#,查询方式*#21#;2遇忙呼叫转移:激活方式*67*号码#,取消方式#67#,查询方式*#67#;3无应答呼叫转移:激活方式*61*号码#,取消方式#61#,查询方式*#61#;4不可及呼叫转移:激活方式*62*号码#,取消方式#62#,查询方式*#62#;我们需要的是“遇忙呼叫转移”。“遇忙呼叫转移”的发生条件是当话机“挂机”时,就会发生呼叫转移。因此,我们基于这个规律,当有来电打入时,先判断其是否符合拦截条件,如果符合条件,则主动“挂机”(通过代码),此时就会发生呼叫转移。为了实现多种挂机模式,我们需要维护一些手机号码:常停机、常空号、常关机。当有来电时,如果符合拦截条件,就主动挂机,这时就会发生呼叫转移,并根据先前设置的挂断模式,转接到对应的号码。5结束语本文详细介绍了基于Android平台的来电拦截和短信防火墙的技术细节和实现原理,可看出它能较好的实现多种模式来电拦截和短信过滤的功能,这是毋庸置疑的。但由于研究时间有限,此防火墙还不尽完善,来电拦截技术上还有待改进。如来电拦截,主要是在SDK层中实现,经过多次试验,其效果并没达到所期望的那么好,当有来电接入时,尽管已能成功关闭手机振动和铃声了,手机屏幕还是会闪一下,因此,还是存在骚扰的可能性。还有功能比较简单,尚未能满足日益需求。将会针对以上提及问题进行逐步完善。性能方面,研究通过RIL层来提高来电拦截效果。Android的无线接口层(RIL)提供了Android电话服务(android.telephony)与无线硬件之间的抽象层。若能在RIL层上实现来电拦截,必然有所改善。功能方面,如支持防火墙密码设置、拦截后短信回复对方等。解决这些问题是我们今后的首要工作。