1. 引言
Android本义是指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,它由操作系统、中间件、用户界面和应用软件组成。2012年7月美国科技博客网站Business Insider评选出二十一世纪十款最重要电子产品,Android操作系统和iPhone等榜上有名。2012年11月数据显示,Android占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台[1] 。
特别,Android操作系统是免费、开源的,Google通过与运营商、开发商以及设备制造商等机构形成的战略联盟,希望通过共同制定标准使其成为一个开放式的生态系统。因而Android所有的应用程序都是可替换和扩展的,而程序之间可以无障碍沟通,开发人员能自主决定应用程序的权限。加上基于WebView内核的组件方便在应用程序中嵌入HTML、JavaScript,以及主流开发环境Eclipse + ADT + Android SDK的使用。使得Android系统受到越来越多的手机厂商、软件厂商、运营商以及个人开发者的追捧,进而Android系统的安全性考虑就摆上桌面。现有的文献资料主要关注Android系统整体架构的安全[2] [3] ,手机的病毒及预防[4] [5] ,和应用程序自身的安全性[6] 。但更需要我们关注Android下自启动应用程序带来的利与弊。
2. Android的系统架构与启动流程
Android的系统架构和其它操作系统一样,采取了分层的架构[7] 。从Google提供的系统架构图看,Android从高层到低层排列分为以下四层:
应用程序层:由运行在Dalvik虚拟机上的应用程序组成,Dalvik是为Android专门设计的基于寄存器的虚拟机,运行一种dex文件,且被认为比Java类文件更加简洁和节省内存的文件。常见的应用如联系人管理、日历等
应用程序框架层:主要由View、Notification Manager、Activity Manager等组成,它们是开发人员可以直接调用的组件,都是由Java语言编写,更是开发者进行Android开发的基础。
系统运行库层:这是对应用程序框架层的支持层,主要包括C语言标准库、多媒体库、SQLite、OpenGL ES、Dalvik虚拟机等。
Linux内核层:主要由硬件驱动、内存管理、进程管理等组件组成。
因而,从某个方面来讲,Android可以看成是Linux之上的一种XWindow。而Android系统的启动过程主要分为四步:1) Init启动;2) Zygote启动;3) Systemserver和应用服务启动;4) 应用程序启动[8] [9] (图1)。
其中:
1) Init是由内核启动的第一个程序。在init执行过程中,将会解析并执行脚本文件,执行命令,创建新服务。直至Android系统的底层框架搭建完成;
2) Zygote 是Init要创建的一个服务。由于Init创建服务的方式是采用创建子进程,多进程可同时进行。因而在Zygote执行过程中,与Zygote同层的服务也在启动和执行。当Zygote完成启动Dalvik虚拟机的工作后,Android系统基本完成系统运行库层的搭建;
3) 虚拟机启动完成后,Zygote将试图启动Systemserver,在Systemserver中将逐个启动系统上层服务,这些服务就是Android系统应用程序框架层的内容。
4) 至此,系统拥有了启动应用程序的能力,系统通过活动管理器Activity Manager激活第一个应用程序,进入用户待机画面,完成启动。
3. 开机自启动程序的模拟
结合Android系统的启动流程,我们知道当System Service加载完所有的系统服务后,系统就会向所有的系统服务发送一个广播,通知系统己经准备完毕。当Activity Manager Service接收到系统己经准备完毕的广播后,会向Zygote进程发送创建Dalvik虚拟机实例的请求[10] 。包括初始化一个Dalvik虚拟机实例,装载Socket请求所需的类和监听,创建虚拟机实例来管理应用程序的进程。然后Activity Manager Service在系统中查找并启动具有
属性的Activity。因此,Activity Manager Service同样也会启动其它开机自启动的应用程序。而Intent对象不仅可以启动应用程序内部的或者其它应用程序的Activity,而且可以发送广播动作Broadcast Action。
Figure 1. Start-up procedure of the file system in Android system
图1. Android系统中文件系统的启动过程图
Broadcast Action和Activity Action一样,既可以由系统负责广播,也可以由自己的应用程序负责广播,以实现某些既定功能。实际上,在手机中发生类似的事件时,Android都会向整个系统发送相应的Broadcast Action。如果应用程序接收到这些Broadcast Action,就可以来完成相应的功能。于是,实现开机自启动的功能就可以通过接收如下的系统广播:
android.intent.action.BOOT_COMPLETED
并编写接收该系统广播的类来实现。
从具体编程的角度来讲[11] [12] ,设计自启动程序的大致步骤如下:
第一步:编写一个android.content.BroadcastReceiver的继承类StartupReceiv,并实现BroadcastReceiver类中的onReceiver方法。以便应用程序接收到系统发送的广播时,去调用这个onReceiver方法。代码如下:
package net.blogjava.mobile.startup;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class StartupReceiver extends BroadcastReceiver
{
@Override public void onReceive(Context context, Intent Intent)
{
Intent mainIntent = new Intent(context, Main.class);
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainIntent);
}
}
第二步:在onReceive方法中启动开发者希望的应用程序中的Main,类似代码如下
package net.blogjava.mobile.startup;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class Main extends Activity
{
@Override public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
以表示自启动应用程序已经启动。在应用程序中可以植入体现开发者的思想。
第三步:在AndroidManifest.xml文件中配置StartupRecevier类,使用
标签来描写可以接收哪一个Broadcast Action。AndroidManifest.xml文件是每个Android程序中必不可少的,它包含了组成应用程序的每一个组件的节点,并使用Intent过滤器和权限来确定这些组件之间以及这些组件和其他应用程序是如何交互的。Android 定义一系列 manifest 权限,以保护系统或其他应用程序的各个方面。请求权限可以在 manifest 文件中声明一个
属性:
< uses-permission android:name=""string"" />
其中 android:name 指定权限的名称。类似代码如下:
< receiver android:name=""StartupReceiver"">
< intent-filter>
< !—指定接收的Broadcast Action -->
< action android:name=""android.intent.action.BOOT_COMPLETED"" />
< !—指定Action的种类,即Android系统启动后第一个运行的应用程序 -->
< category android:name=""android.intent.category.HOME"" />
< /intent-filter>
< uses-permission android:name=""android.permission.RECEIVE_BOOT_COMPLETED"" />
< /receiver>
在程序安装在手机或者模拟器后,只要Android系统向外广播这个Broadcast Action,并且应用程序没有被卸载的话,系统就会自动调用应用程序的onReceiver方法来处理它,从而实现程序的自启动。即重启模拟器或者手机重新开机启动后,就会发现模拟器或者手机启动后总是会先运行上述应用程序。
4. Android自启动程序的控制
4.1. 从应用程序开发者的角度
开发Android应用程序时,必须处理很多与安全性相关的方面。虽然Android本身已提供应用沙盒、权限、应用签名等安全机制,但是这种以开发者为中心、依托用户完成的粗粒度授权机制存在诸多问题和漏洞,导致平台安全性大大降低,特别是容易造成应用层权限提升攻击,通过利用Linux内核的优势,Android得到了大量操作系统服务,包括进程和内存管理、网络堆栈、驱动程序、硬件抽象层以及与安全性相关的服务[6] 。
Android系统通过应用程序自行在系统中登记注册事件(即Intent)来响应系统产生的各类消息。正如自启动应用程序模拟中考虑的那样,配置表示应用程序会响应系统产生的android.intent.action. BOOT_COMPLETED (系统启动完成)信号,以此来实现应用程序自启动的控制。具体控制自启动应用程序的方法有
1) 静态分析
静态分析技术是将可执行程序反汇编,通过分析反汇编代码来理解其代码功能,即在不执行应用程序的情况下对其行为进行分析的技术[4] 。
基于上述原理,我们可以通过对系统中已安装的程序去除其Android Manifest的上述配置片段来控制应用程序的对系统的响应。在没有源码可修改编译的情况下只能实现屏蔽其对有些信号的响应,完成屏蔽该程序不再开机自启动。手工方法就是利用有关工具直接在解压其APK包后,删除其Android Manifest的上述配置行后再打包成APK,最后安装到系统中就实现了屏蔽其自启动功能。
有两种主流方式可以实现对Android恶意程序的静态逆向分析,一种是将APK程序利用Apktool等工具进行反编译,生成程序的源代码、图片、XML配置和语言资源等文件,然后对相关文件进行查看,查找具有恶意意图的代码,并对其进行验证;另外一种是先使用Dex2jar工具将程序反编译成jar格式,然后再用JD-GUI直接查看源代码进行分析。
2) 编程处理
静态分析需要借助Apktool或Dex2jar等工具,步骤比较繁琐,我们可以通过自己开发程序来实现该功能。主要利用的是
a) Package Manager,本类API是对所有基于加载信息的数据结构的封装,其中具有增加,删除permission功能
b) Activity Manager,本类API是对运行时管理功能和运行时数据结构的封装,其中具有注册/取消注册动态接受intent功能。
具体API可参考SDK文档。通过调用相应现成的API实现就可以实现自启动程序的控制。
目前,已有的控制开机自启动的成熟应用程序主要有autostarts,它不只是控制开机启动信号,也可以控制程序对大部分信号的响应行为。
3) 系统自带工具
Android自带的activity管理工具/system/bin/am 和程序包管理工具/system/bin/pm,都可以用于自启动程序的控制。
a) am全称activity manager,可以使用am去模拟各种系统的行为,例如去启动一个activity,强制停止进程,发送广播进程,修改设备屏幕属性等等。
在Android系统adb shell命令下执行am命令:
am
也可以在adb shell前执行am命令:
adb shell am start -a android.intent.action.VIEW:启动一个activity
而 force-stop
是强制停止指定的package包应用。
b) pm全称package manager,可以使用pm命令去模拟android行为或者查询设备上的应用等,也有上述二种执行方式,其中
enable
:使package或component可用。
disable
:使package或component不可用。
4.2. 从使用者的角度
作为手机使用者,自身积极的防范是最重要的。建议用户在购买手机时尽量选择从正规渠道购买;在选择应用下载网站时,尽量选择大型可信站点,如Google Play商店等;尽量不要下载安装功能不清的软件;安装应用软件时,注意观察软件权限;慎重查看那些来历不明的短信和彩信;及时安装有效的手机防护软件并定期升级,在用户端构建安全墙;及时备份手机数据并定期检测手机系统是否正常等。
5. 结语
自启动应用程序确实给用户带来方便;同时根据Android开机自启动过程的分析,一般用户只须写一个广播接收器,收到这个广播后启动自己喜欢的应用(甚至包括监视等功能),从而留下漏洞。但我们可以从应用程序开发者和使用者的角度,对自启动应用程序来加以控制。
随着手机朝着智能化方向的发展,Android系统必然为人们关注,并会在应用中不可避免地出现大量针对Android的攻击行为和恶意软件。这些程序的制造者更多的是受到经济利益的驱使,制造并传播手机病毒,发动基于应用软件的恶意攻击,并利用应用软件发布缺乏验证机制的安全漏洞,发布含有恶意代码的程序供用户下载,从中获取不当收益。但Android开源的途径会促使安全性不断地改进和提升。
基金项目
2014武汉商学院科研项目2014A009,2013年武汉市教育局教学研究项目2013030,2013年武汉商学院优秀教学团队项目。