基于Android系统的手机防火墙的设计与实现
2011-11-03河南王生阳
河南 王生阳
基于Android系统的手机防火墙的设计与实现
河南 王生阳
欺诈短信和骚扰电话时常在我们身边发生,尤其对于防范意识薄弱的老人和小孩来说更需要一款特定的软件来监控和保护他们的通讯安全,本文基于Android系统,提出手机必须有一款针对短信和电话的防火墙软件,它可以过滤恶意电话和诈骗短信。
广播监听;黑名单;白名单;关键字;过滤
引言
随着使用Android系统手机的用户数量的增多,许多安全问题就随之而来。大多数杀毒软件公司都较注重网络安全,但忽略了通讯和信息安全方面,尤其对欺诈防范意识薄弱的群体更需要这方面的软件来保护他们的通讯和信息的安全。
基于Android系统的手机防火墙主要是针对短信和电话进行过滤,它能够实现对短信实行关键字和号码进行过滤,能够过滤那些垃圾广告短信,系统自带了一些常用的垃圾短信数据库,它也可以自定义,用户可以自行添加修改删除关键字,能够根据自己的需要和最新的常见垃圾短信内容进行过滤拦截它。它也可以对电话进行黑名单过滤,如果在黑名单之内的电话会自动挂断。
1 And roid系统介绍
Android的系统架构和其操作系统一样,采用了分层的架构。android分为四层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块。
2功能性需求
当手机接收到短信时会先存入手机中的短信数据库中,再广播出含有短信的intent。所有有权限接收到这类广播的程序都会收到。所以有两种方式可以处理收到的短信。一种是自己定义一个接收者(receiver)方式来接收含有短信的intent。另一种是手机短信数据库监听方式,当收到短信时短信数据库一定有变化,以此来激活程序运行。这里我用第一种方法来接收短信intent,为了第一时间得到广播可以设置接收者的优先级最高,这样可以先得到短信信息并设置过滤规则,如果输入拦截信息就终止此广播,让系统自带的广播接收者无法接收到此广播,也就不提醒用户有信息。
电话防火墙采用自定义广播接收者(receiver)方式来接收电话信息,然后设置过滤规则,当来电属于黑名单时采用自动挂断的方式。短信拦截的用例图如图2-1所示。
基本事件流:1.系统接收到短信;2.分析读取短信的发送地址和具体内容;3.通过黑名单和关键字分别过滤短信是不是黑名单中的号码或者内容是否含有关键字;4.如果是属于黑名单或者短信内容则终止短息。
图2 -1短信拦截
图2 -2电话过滤与监听
防火墙电话过滤与监听
如果遇到经常骚扰自己的电话,或者一些陌生电话打一下就挂断的,可以加入黑名单,只要是黑名单里的电话来电时会自动挂断电话。当被监护人的来电不是黑名单和静音名单时,电话进来时启动录音功能将通话信息录制下来,存储在被监护人手机上,此时通知监护人有电话进来并及时查看通话录音,如果通话内容具有诈骗性质的或者其它恶意的可以及时提醒被监护人。用例图和用例描述如图2-2所示。
基本事件流:(1)读取电话信息;(2)电号码进行黑名单和白名单过滤;(3)若来电是属于黑名单自动挂断电话。
3设计与实现
Android系统,提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。
为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db,intoldVersion,int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getW ritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase()方法就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。下边表3-1、表3-2、表3-3分别是黑名单表、白名单表、关键字表的结构。
表3 -1黑名单表
表3 -1白名单表
表3 -1关键字特征库表
短信过滤部分
短信过滤定义了一个Listener继承BroadcastReceiver,并在功能清单里定义这个自定义广播接收者,再定义其优先级priority值为1000,这样当信息广播传到系统时,第一时间得到广播。在Listener获取广播意图的值,然后和短信意图相对比,短信广播意图值为“android.provider.Telephony.SMS_RECEIVED“,如果是短信广播意图,则通过Bundle来获取广播信息,然后通过解析把短信内容和地址号码分开。将号码分别进行白名单和黑名单进行过滤,如果号码属于白名单怎广播不中止,如果号码属于黑名单则短信广播中止,如果号码既不属于白名单又不属于黑名单,则进行关键字过滤,如果含有关键则中止广播。中止广播用函数abortBroadcast()。
电话过滤部分
在自定义广播接收者Listener类中获取广播意图的值,然后和电话意图值比较,电话意图值为"android.intent.action.PHONE_STATE",然后通过意图获取来电号码,方法为intent.getStringExtra("incoming_number")。对于挂断电话的实现,1.1版本后.Google已经把该API隐藏掉。可以可以通过AIDL(Android远程方法)及反射来实现,这里我用反射来调用hide API。在项目中新建包com.android.internal.telep-hony,因为要使用AIDL,在该包下新建文件ITelephony.aidl该包与ITelephony.aidl一致,该包下新建文件ITelephony.aidl,将ITelephony.aidl内容拷贝到文件中,通过反射获取TelephonyManager,这样可以调用iTelephony的endCall()隐藏方法来挂断电话。
TelephonyManager够监控来电三种状态TelephonyManager.CALL_STATE_RINGING来电响铃;TelephonyManager.CALL_STATE_OFFH OOK来电接通去电拨TelephonyManag-er.CALL_STATE_IDLE来去电电话挂断;在来电响铃状态时,进行黑白名单过滤,如果是属于黑名单就调用end-Call()函数进行挂断。
电话录音
开机启动一个服务,服务service里通过TelephonyManager来监听电话状。通过一个继承PhoneStateListener类的内部类实施电话状态中的动作,当来电处于通话状态时调用MediaRecorder开始录音,当电话处于挂断时停止录音,并将录音文件存在手机内存sdcard上。
总结
基于Android系统防火墙能很好的能够对来往短信和电话的实时监控,在一定程度上保护了社会上那些防范意识薄弱的群体不受陌生电话的侵犯和垃圾短信的骚扰,监护人能够及时得到被监护人的通话和短信信息,可以放心的工作了。
[1]杨丰盛.Android应用开发揭秘[M].北京:机械工业出版社,2010.1:518.
[2]张山风,刘雪艳.Windows XP系统文件保护功能探讨[J].办公自动化,2006,6:31-32.
[3]汪永峰.Android平台开发之旅[M].北京:机械工业出版社,2010.8:515.
(作者单位:河南省南阳农业学校)
(编辑 王旸)