前言
Android系统中最常见的文件应属APK安装包。在开发与逆向分析APK程序时,会涉及APK安装包内部其它文件的结构,了解了这些结构后,在逆向分析的过程中能更好的作出判断。本篇从Android库文件开始,通过学习《Android软件安全权威指南》上的内容,将会陆续更新常见的Android文件格式,以了解它们在系统中加载与处理方面的细节。
库文件
基本含义:库文件是一系列代码功能接口与资源数据的有机结合。
实际意义:Android SDK是大量库文件的结合。
种类:第三方提供的地理位置SDK,数据统计SDK,广告SDK等都是库文件。
jar包
历史因素
在Android Studio之前的时代,Android软件主要由ADT(工具包) + Eclipse(IDE)开发,所以库文件使用Java语言中标准的jar包(Java Archive)。jar包其实是一个zip格式的压缩包文件,存放着Java代码编译后的class文件的集合。因此,常称jar文件为jar包。
android.jar
android.jar是相对重要的一个库文件,在开发兼容不同版本系统的APK时,要引用Android SDK中不同版本的android.jar文件,它也是开发中使用最多的库。接下来查看android.jar的格式及部分内容:
首先需要配置一个可以执行bash指令的虚拟机,为了方便,可使用Bash on Ubuntu,这部分可参考zlmm741的文章进行配置。
然后找到android.jar文件,定位到SDK目录,进入platforms目录后,任选一个版本的文件夹进入,就可以看到android.jar文件,参考下图
将其复制到桌面,通过如下指令查看其格式及内容
bash1
2$ file android.jar
$ unzip -l android.jar | less可以看到jar是一个zip包,它有一个META-INF目录,一些对安全性要求较高的jar包,会对其包含的class文件进行签名,并将签名信息保存在这个目录下。
分析手法
分析jar包,有静态分析和动态分析两种方法,这里作简要概括。
静态分析:可使用jd-gui这类jar查看工具,其内部会调用反编译接口,将jar包中的class文件编译成Java文件,对于分析人员来说可以大幅提高代码可读性。根据不同平台从这里下载对应的发行版。使用效果如下:
动态分析:在Android平台上进行动态分析时,可以参考PC上的方案,如AspectJ的面向切片编程技术(AOP)。AspectJ提供了对jar包中方法的侵入式Hook技术,可通过编写AspectJ脚本来Hook jar包中的方法。Android平台上有AspectJ的移植版本,只需编写Hook实例,并结合相应的分析技术,即可对jar包的行为进行分析。
aar包
新的库文件格式
jar包有一个明显的不足,它通常只包含其所使用的代码,不包含代码所使用的资源数据;如果第三方SDK使用了大量的图片、声音、布局等资源,除了需要将jar包引用到工程中,还需要将SDK中的资源手动复制到工程中;这必然会导致资源数据过多,难以分辨,影响开发效率。
随着Android Studio的问世,将aar文件作为全新的库文件格式。它除了可以包含代码,还可以包含任何在开发中使用的资源数据。
编写aar库
接下来通过Android Studio编写一个arr库:
由于Android Studio不允许直接创建aar文件,所以需要通过模块的形式在已经存在的APK工程中添加aar文件,这里选择在右侧空白处右键选择”New” -> “Module”,然后选择”Android Library”。输入名称”MyLib”,完成创建。
此时工程中包含app和mylib两个模块了。不对其进行修改,在Android Studio终端上编译其Release版本。使用如下命令:
Code1
gradlew :mylib:aR
编译成功后可以在”MyAar\mylib\build\outputs\aar”处找到mylib-release.aar文件。
aar文件结构
下面来看一下aar的文件结构,切换到Ubuntu终端(我的Android Studio位于Windows系统中,遂需要切换进行演示)
可以看到aar文件也是zip包,它的目录结构与APK文件类似:
- classes.jar包含arr库文件中所有代码生成后的class文件。
- res目录中存放了所有的资源。
- AndroidManifest.xml文件,用于定义aar包的名称、编译器的版本等。
- 还有一些本文件并不存在,但也相当重要的目录,例如存放AIDL接口文件的aidl目录;存放Asset资源的assets目录;存放了编译好的不同版本的so库的jni目录;存放aar包引用的第三方jar包的libs目录等。
参考资料
- 《Android软件安全权威指南》—— 丰生强
- https://blog.csdn.net/zlmm741/article/details/104640245 (CSDN-zlmm741学习笔记)
- https://blog.csdn.net/zlmm741/article/details/104577290 (Bash on Ubuntu on Windows配置)
- https://blog.csdn.net/zizidemenghanxiao/article/details/50041185?utm_source=blogxgwz7 (Android SDK目录结构)
- https://zhidao.baidu.com/question/1577372121056020580.html (Linux/mnt目录主要用于什么)
- http://java-decompiler.github.io/ (jd-gui下载网址)