记录安卓安全的学习笔记,比较杂,比较乱
APK
APK 是 Android PacKage的缩写,即 Android 安装包。
其本质上是一个zip压缩包,可以用7z打开
APK的组成
| 文件或目录 | 作用 |
|---|---|
| assets/ | 存放需要打包到APK的静态文件 |
| META-INF/ | 也就是一个 manifest ,从 java jar 文件引入的描述包信息的目录,存放应用程序签名和证书,用来保证apk包的完整性和系统的安全性 |
| res/ | 资源文件目录,存放应用程序的资源 |
| libs/ | 存放的是 ndk 编出来的 so 库,程序依赖的native库,包含针对特定处理器软件层的编译代码 |
| AndroidManifest.xml | 程序全局配置文件,应用程序的配置文件,该文件包含了应用程序的名字,版本号,所需权限,注册服务、链接的其他应用程序,声明四大组件,以及调用信息等 |
| classes.dex | dalvik 字节码,可执行文件,包含应用程序的全部操作指令以及运行时数据,class.dex是由Java字节码转换的Dalvik字节码 |
| resources.ars | 编译后的二进制资源文件,资源配置文件,APP资源能根据配置的变化,索引到相应的资源都要依赖它 |
assests目录
一般存放的是不会被编译处理的文件,一般是资源性质的文件或者配置文件; 存放需要打包到APK的静态文件,该目录与res目录不同之处在于,assets目录支持任意深度的子目录,我们的开发者可以根据自己的需求来任意部署文件夹的架构,而且res目录下的文件会在.R文件中生成与其对应的资源ID,,assets不会自动生成对应的id,访问的时候需要AssetManager类
META-INF目录
META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。
META-INF目录中包含的文件有CERT.RSA,CERT.DSA,CERT.SF和MANIFEST.MF。其中CERT.RSA是开发者利用私钥对APK进行签名的签名文件,CERT.SF和MANIFEST.MF记录了文件中文件的SHA-1哈希值。
软件修改后需要将里面的证书文件删除(.RSA、.SF、*.MF三个文件),否则软件无法安装。
res目录
res目录存放资源文件。包括图片,字符串等等。
res是resource的缩写,这个目录存放的东西是资源文件,存放这个文件夹下的所有文件都会映射到Android工程中的.R文件中,生成对应的资源ID,访问的时候直接使用资源ID,即R.ID.FILENAME,res文件夹下可以包含多个文件夹;
anim是存放动画文件的;
drawable目录存放图形资源;
layout目录存放布局文件;
values目录存放一些特征值;
colors.xml存放color的颜色值等等
lib目录
lib目录下的子目录armeabi存放的是一些so文件。
该目录用来存放应用程序所依赖的native库文件,native库一般是用C/C++进行编写的,这里的lib库可能包含4种不同类型,根据CPU型号的不同,我们大体可以分为ARM,ARM-v7a,MIPS,X86,分别对应着ARM架构,ARM-V7架构,MIPS架构和X86架构,这些so库在apk包中构成如图:
其中,不同的CPU架构对应着不同的目录,每个目录中可以存放非常多的对应版本的so库,而且这个目录的结构固定,用户只能按照这个目录来存放自己的so库。目前市场上使用的移动终端大多是基于ARM或者ARM-v7a架构的。从厂家上来分是有三种,arm,x86,MIPS,arm 系列是绝大多数手机上使用的,x86 主要是运用在平板和模拟器上。
AndroidManifest.xml
这是Android应用程序的配置文件,是一个用来描述Android应用“整体咨询”的设定文件,简单的说,这相对于Android应用向Android系统的“自我介绍”配置文件,Android系统可以根据Androidmanifest.xml文件来完整的了解这个APK应用程序的咨询。不难想到,每个Android应用程序都必须包含一个Androidmanifest.xml文件,并且它的名字是固定的,是禁止修改的。
该文件是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息[ , ],如要把apk上传到Google Market上,也要对这个xml做一些配置。在apk中的AndroidManifest.xml是经过压缩的,可以通过AXMLPrinter2工具解开,
具体命令为:java -jar AXMLPrinter2.jar AndroidManifest.xml
classes.dex文件
在Android系统中,dex文件是可以直接在Dalvik虚拟机中加载运行的文件。通过ADT,经过复杂的编译,可以把java源代码转换为dex文件。 那么这个文件的格式是什么样的呢?为什么Android不直接使用class文件,而采用这个不一样文件呢?其实它是针对嵌入式系统优化的结果,Dalvik虚拟机的指令码并不是标准的Java虚拟机指令码,而是使用了自己独有的一套指令集。如果有自己的编译系统,可以不生成class文件, 直接生成dex文件。dex文件中共用了很多类名称、常量字符串,使它的体积比较小,运行效率也比较高。但归根到底,Dalvik还是基于寄存器的虚拟机的一个实现。
DEX是Android系统的可执行文件,包括应用程序的全部操作指令,以及运行时数据。在程序编译过程中,java源文件先被编译成class文件,然后通过dx工具将多个class文件整合为一个dex文件,这样的文件结构使得各个类能够共享数据。
resources.arsc
编译后的二进制资源文件<br />用来记录资源文件和资源ID之间的映射关系,用来根据资源ID寻找资源。Android的开发是分模块的,res目录专门用来存放资源文件,当在代码中需要调用资源文件时,只需要调用方法“findviewbyid()”就可以得到资源文件,每当在res文件夹下放一个文件,aapt就会自动生成对应的ID保存在.R文件,我们调用这个ID就可以,但是只有这个ID还不够,.R文件只是保证编译程序不报错,实际上在程序运行时,系统要根据ID去寻找对应的资源路径,而resources.arsc文件就是用来记录这些ID和资源文件位置对应关系的文件。
