AndroidAPP的安全模型

Android APP的安全基础

APP的生成

操作系统是管理移动端硬件与软件资源的程序,包括进程管理、存储管理、文件管理、设备管理等。比较知名的Linux、IOS、Android、Windows等。

Android APP主要使用Java语言进行编写,AndroidAPP的编译和Java程序的编译是不同的,但是开始的方法都是一样的,就是用javac编写成一个.class的字节码文件。

例如:

1 编写一段代码,Test

public class Test{

public int add(int a,int b){

   return a+b;

 }



  public void main(String[] args){

       Test test=new Test();

       System.out.println(test.add(1,2));


      }

}

2 执行如下两个命令可以看到上面Java代码所对应的字节码

但是,Android的虚拟机并不用JVM,而是用自身的Dalvik,两个虚拟机的指令集不同,因此通过javac编译出的字节码文件无法在Dalvik上运行,还需要通过Android系统下的dx命令,(\sdk\build_tools\),将所有的.class文件和jar包换成符合Dalvik字节码格式的classes.dex文件,

命令:dx --dex --output=classes.dex Test.class

执行过程中出现的问题

1  -Djava.ext.dirs=D:\android\sdk\build-tools\32.0.0\lib is not supported.  Use -classpath instead.

Error: Could not create the Java Virtual Machine.

Error: A fatal exception has occurred. Program will exit.

解决方法:JDK版本过高,与SDK不能匹配

class.dex是AndroidAPP的可执行文件,代码在整个文件里,apk则是一个安装包,包括除了代码以外的视频图片等资源文件。

在通过Googleplay或者三方应用商店发布APP安装文件时,需要开发者对APP进行数字签名,原因如下:1.方便对APP进行溯源,2 便于操作系统在对APP进行安装时利用数字签名校验安装文件的完整性和准确性.。对APP进行签名的过程是,使用开发者私钥对apk安装文件包中的所有文件进行校验,并将生成的校验信息作为另一个附加签名内置于apk文件包中。

Jarsigner是Java开发工具包中常用的签名工具,为jar文件进行签名,也可以对apk进行签名,Android的系统中压缩文件的字节是对齐的,可以在不解压的情况下读取他的内容,所以签名后要使用zipalign进行处理,保证他的字节边界时对齐的。

APP的运行

Android4.4后,原有的在Dalvik虚拟机上运行的APP的基础上,新增了ART模式,不再是每次运行都是将dex文件转换为机器码去运行,而是安装的时候进行预编译,安装和首次启动变得慢了,但是以后的每次运行变得快起来了。

Zygote进程是用来孵化和启动其他APP的,也是Android运行的第一个Dalvik虚拟机进程,zygote通过调用系统的fork函数来创建自身副本进程,复制要比从主系统文件中加载新的进程快很多,启动程序后,加载程序代码,ART模式下,classe.dex就可以通过dex2oat将文件中的字节码转换为native原生代码,即.oat文件,包含了classes.dex的文件内容和由文件转换的机器指令,因此APP每次运行的时候,可以使用oat文件中已经转换好的机器指令去进行转换,就会比较快。

Android系统的安全模型

1 Android用户管理

Linux系统中,用户未经授权不得访问另一个用户的文件,Linux系统中设置了用户ID和用户组ID,在一个Linux中可以注册多个物理用户,Android继承了用户隔离性,但是Android手机是私人用品,不需要多人操作,因此将Linux多物理用户的特性用到了APP的隔离管理中,将给不同用户分配不同的UID分配给了运行在Android系统中的APP。

AndroidAPP的UID一般是10000-99999,android4.2以后采用用户管理系统服务对除了手机外的其他设备进行多用户管理,Android源码的UserHandle.java里查看MU_ENABLED属性可以看到是否支持多用户管理。

多用户时用户安装相同的APP时,除了系统里相同的UID,会为APP生成一个新的UID,UserHandler.java源码中获取UID的方法:

public static final int getUid(int userId,int appId){

    if (MU_ENABLED){
        return userId*PER_USER_RANGE+(appId%PER_USER_RANGE)
    }else {
        return appId;
    }
}

2 Android系统沙箱

Android系统根据不同的UID将不同的APP分配到不同的沙箱中,APP需要运行的时候,系统会为其创建一个标识该APPUID的进程,进程实例化一个dalvik虚拟机来执行APP字节码,不同的APP在各自的虚拟机上运行,增强了系统沙箱机制的隔离性和安全性。

APP安装后,会在data/data或者多用户的data/user/userID目录下,以自身的包名为文件名创建文件夹,用来存放APP运行时需要的文件和资源,系统将为APP设置不同的UID,非该UID的APP进程无法访问该UID标识的文件和资源。这就是沙箱机制。

APP通过AndroidManifest.xml文件的sharedUserId属性来完成用户ID的共享设置,可以使不同的APP进行资源共享。APP使用用户ID进行共享需要满足:

1 进行用户ID共享不同的APP,数字签名需要一致,参与共享的APP需要使用相同的代码签名私钥对APP进行签名。

2 APP安装后,不可以再进行用户ID共享,否则会导致APPUID变化,破坏系统安全模型,因此要求APP在安装时就确定是否共享用户ID。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值