avatar

Catalog
Android文件格式:库文件

前言

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的格式及部分内容:

  1. 首先需要配置一个可以执行bash指令的虚拟机,为了方便,可使用Bash on Ubuntu,这部分可参考zlmm741的文章进行配置。

  2. 然后找到android.jar文件,定位到SDK目录,进入platforms目录后,任选一个版本的文件夹进入,就可以看到android.jar文件,参考下图

  3. 将其复制到桌面,通过如下指令查看其格式及内容

    bash
    1
    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库:

  1. 新建一个APK空壳工程,将其命名为”MyAar”。

  2. 由于Android Studio不允许直接创建aar文件,所以需要通过模块的形式在已经存在的APK工程中添加aar文件,这里选择在右侧空白处右键选择”New” -> “Module”,然后选择”Android Library”。输入名称”MyLib”,完成创建。

  3. 完成后左侧栏显示如下。

  4. 此时工程中包含app和mylib两个模块了。不对其进行修改,在Android Studio终端上编译其Release版本。使用如下命令:

    Code
    1
    gradlew :mylib:aR
  5. 编译成功后可以在”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目录等。

参考资料

  1. 《Android软件安全权威指南》—— 丰生强
  2. https://blog.csdn.net/zlmm741/article/details/104640245 (CSDN-zlmm741学习笔记)
  3. https://blog.csdn.net/zlmm741/article/details/104577290 (Bash on Ubuntu on Windows配置)
  4. https://blog.csdn.net/zizidemenghanxiao/article/details/50041185?utm_source=blogxgwz7 (Android SDK目录结构)
  5. https://zhidao.baidu.com/question/1577372121056020580.html (Linux/mnt目录主要用于什么)
  6. http://java-decompiler.github.io/ (jd-gui下载网址)
Author: cataLoc
Link: http://cataloc.gitee.io/blog/2020/08/09/%E5%B8%B8%E8%A7%81Android%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F1/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶