Android是一个基于Linux的操作系统,系统结构图如图2-1所示(摘自Google官方网站)。
从下往上看,Android主要分为5个层级,依次是Linux内核层、HAL硬件抽象层、系统运行库层、应用框架层、应用层。其中,HAL硬件抽象层与本书内容无太大关系,不再介绍,读者有兴趣的话,可自行从网络上搜索相关资料。我们接下来介绍一下除HAL硬件抽象层之外的各个层级。
(1)Linux内核层
Linux和Android的底层本质上是一样的,因为Android使用的是Linux内核。换而言之,Android从某种程度上说就是一个Linux系统,因此大部分在Linux中存在的内核漏洞在Android中可能也存在,只是漏洞利用的方式不同而已;另外,理论上在计算机上能够运行的Linux命令在手机上也是可以执行的,只是因为缺少部分软件包或者其他部件的支持而导致一些命令无法在手机上执行。在Android中可以使用名为termux的软件来解封并执行所有的Linux命令。
(2)系统运行库层
系统运行库层分为平行的两个组成部分。
第一部分是与标准Linux中一样的使用C/C++编写的原生库文件,包括提供媒体库支持的libopengl.so、提供数据库存储功能的libsqlite3.so等。
图2-1 Android系统架构
第二部分是Android特有的使用C/C++编写的运行库,类似于Java中的JVM,被称为Android Runtime。在系统运行过程中,每一个App进程都有一个自己的Android Runtime实例,用于支持所有Java相关代码的加载与执行。在Android 5.0之前,Dalvik虚拟机是Android Runtime,对应的库文件名是libdvm.so;从Android 5.0开始,Google官方彻底放弃了Dalvik,转而支持了更快的Art运行库,对应的库文件名为libart.so。需要注意的是,在Android 4.4上,虽然是Dalvik和Art共存,但是默认选择Dalvik作为运行库。
(3)应用框架层
应用框架层相当于Linux层级的so文件,用于给Android的Java层提供API的支持。不管是加壳的App还是未加壳的App,其框架层的代码在应用层代码加载之前就存在。
(4)应用层
应用层是App所在的层级,包括系统自带的应用(称为系统应用)以及后续用户自己所安装的应用(称为普通应用)。这一层是本书最为关注的层级,对其余层级的了解都是为了更好地分析应用层。
要完成Android逆向过程的工作,若不知道如何进行Android开发是难以想象的呢?Android基础中的基础就是Android的四大组件,即活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)以及内容提供者(Content Provider)。
Activity可以理解为界面,一个Activity就是一个界面;Service相当于Windows上的一个后台进程;Broadcast Receiver用于响应来自其他应用程序或者系统的广播消息;Content Provider用于进程间的交互,通常通过请求从一个应用程序向其他应用程序提供数据。
关于Android的四大开发组件,此处只做简要介绍,更详细的相关知识,请读者参考Android开发的专业书籍。笔者还是建议读者深入学习一下Android开发的知识,毕竟个人开发水平的高低决定了Android逆向开发和分析人员能力的强弱。注:逆向人员是逆向漏洞-安全人员的简称,一般都要求逆向人员具有开发的能力。