Android安全机制简介
Android系统中,可以用以下几种安全机制保护系统的安全。
代码安全机制
代码安全机制就是使用代码混淆proguard来保护系统安全。
APK存在被反编译的风险,proguard可以混淆关键代码,替换命名让破坏者阅读代码困难,同时可以压缩代码,优化编译后的Java字节码。
应用权限控制
应用权限控制是在Manifest文件中声明权限,对权限进行检查。
任何应用程序在使用系统受限资源时,都需要向系统声明所需要的权限,通过了权限检查,才能调用系统对应的服务。
应用签名机制
应用签名机制是利用数字证书来控制APK的来源是否安全。
Android中所有的APP都有一个数字证书,即APP的签名,用于保护APP的作者对已APP的信任关系。只有相同数字签名的APP,才会在升级时被认为是同一个APP,并且系统不会安装没有签名的APP。
Linux内核层安全机制
Android是基于Linux内核开发,所以Android继承了Linux的安全特性,比如文件访问权限控制。通常只有System和Root用户才有权限访问系统文件。
虚拟机沙箱机制
Android的APP运行在虚拟机中,因此有了沙箱机制,可以让APP之间相互隔离。通常情况下,不同APP之间不能相互访问,每个APP运行在单独的虚拟机中,与其它APP完全隔离,即使一个APP崩溃,也不会对导致其它APP异常。
APK反编译
APK文件本质上是一个压缩文件,但是APK一般都做过加密处理,普通的解压方式不能得到正确的文件,下面介绍一些常用的工具,它们可以分别反编译APK的不同部分。
apktool
apktool可以用来反编译APK中的XML资源文件。
通过以下命令反编译一个APK文件:
1 | apktool.jar d test.apk |
参数d是decode的意思,apk文件可以加上目录。执行反编译命令后,当前文件夹会出现对应APK名字的文件夹,打开文件夹就可以看到APK的资源文件。
这个工具在汉化时比较有用,在提前资源文件进行汉化后,可以用以下命令重新打包:
1 | apktool.jar b test |
smali
使用apktool工具反编译APK文件后,可以得到一个smali文件夹。要查看APK的源码,首先需要将使用smali工具将smali代码转换为dex文件。
通过以下命令将smali文件转换为dex文件:
1 | smali.jar test/smali -o test.dex |
使用以上命令后,后在当前文件夹会出现test.dex文件。
dex2jar
使用smali工具获取dex文件后,还需要将dex文件转换为jar文件。
通过以下命令将dex文件转换为jar文件:
1 | dex2jar.bat test.dex |
使用以上命令后,可以得到命名为test.dex.dex2jar.jar的文件。
jd-gui
通过dex2jar工具获得了APK源码对应的jar文件后,就可以使用jd-gui工具查看APK的源码了。
直接打开jd-gui.exe程序,打开对应的jar文件查看即可。
APK加密
Java字节码很容易被反编译,可以使用ProGuard对代码进行混淆,增加APK的安全性。
ProGuard的原理是使用无意义的字母来重命名类、字段和方法。不过,除了进行混淆代码,ProGuard还可以删除无用的类、字段和方法,以及无用的注释,最大限度地优化Class文件。
在Gradle中使用ProGuard的代码如下所示:
1 | buildTypes { |
其中minifyEnabled表示是否打开代码混淆,proguardFiles表示混淆规则的文件。前一个是系统默认的混淆文件,大部分情况使用这个默认文件就行了;后一个是自定义的混淆文件,在这个文件中可以定义一些第三方依赖包的混淆规则。