安全笔记:Android|APK文件结构分析

APK是指Android安装包,其通过android sdk编译的工具打包成apk的安装程序文件格式,其实际文件类型为zip,只要将后缀名修改为apk,即可使用。


APK主目录结构

目录或文件 功能

res/

资源文件目录,包括图片、字符串等等。

lib/

so文件目录。

META-INF/

签名信息目录,用来保证apk包的完整性和系统的安全性。

assets/

可以存放一些配置文件,这些文件的内容在程序运行过程中可以通过相关的API获得。

AndroidManifest.xml

程序全局配置文件,每个应用都必须定义和包含的,描述了应用的名字、版本、权限、引用的库文件等等信息。

classes.dex

Dalvik字节码

resources.arsc

编译后的二进制资源文件的索引(apk文件的资源表索引)


res目录结构

目录 功能
res/anim/ 定义的是预置的动画对象。一般是逐帧动画 (Frame animations) 或补间动画( Tween animations )。而实际使用上,都是一些淡入淡出、缩放和移动等的补间动画居多。
res/color 定义一些 android view 状态变化时,使用的颜色值。这通常是绑定到一个界面元素上的,比如一个 button 被按下,弹起或 disable 时的颜色。

res/drawable/

res/drawable-hdpi

res/drawable-land-hdpi

res/drawable/mdpi

res/drawable/ldpi

res/drawable/port

定义要被用到的位图资源文件。这些位图资源可以是 bitmap ,也可以是用 xml 描述的 bitmap 。

注意:文件后缀为 9.png 是一种特殊的位图,一般是通过 draw9patch 生成的,是一种可自动伸缩的位图资源。

Drawable 的其他目录形势,land 是横屏的,port 是竖屏的;hdpi 是高分辨率的,ldpi 是低分辨率的,hdpi 是高分辨率的。这里可以放置为特定情况下的界面优化资源。

res/layout/

定义的 UI layout ,被 aapt parser 后,可由 android 直接 render 成 view 界面。

这里也有横竖屏和 dpi 之分。

res/values/

可以被编译成很多种类型的资源的 XML 文件。

注意 : 不像其他的 res/ 文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。 XML 元素类型控制这些资源应该放在 R 类的什么地方。

尽管这个文件夹里的文件可以任意命名,不过下面使一些比较典型的文件(文件命名的惯例是将元素类型包含在该名称之中):

     array.xml 定义数组

     colors.xml 定义color drawable和颜色的字符串值(color string values)。使用 Resource.getDrawable() 和 Resources.getColor() 分别获得这些资源。

     dimens.xml 定义尺寸值(dimension value)。使用 Resources.getDimension() 获得这些资源。

     strings.xml 定义字符串(string)值。使用 Resources.getString() 或者 Resources.getText() 获取这些资源。 getText() 会保留在 UI 字符串上应用的丰富的文本样式。

     styles.xml 定义样式(style)对象。

多国语言,由 values-xxx 的后缀组成。比如简体中文 :res/values-zh-rCN

res/xml/ 任意的 XML 文件,在运行时可以通过调用Resource.getXML()读取。
res/raw/ 直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用Resource.openRawResource(),参数是资源的 ID ,即 R.raw.somefilename 。

逆向主要文件分析

class文件

class文件的作用

class文件的作用是记录一个类文件的所有信息。

class文件的结构

  • 8位字节的二进制流文件
  • 各个数据紧密排列,无间隙,减少了文件体积,加快加载速度
  • 每个类或者接口单独占据一个class文件,每个类单独管理,没有交叉

dex文件

参考资料:

dex文件格式:https://www.jianshu.com/p/f7f0a712ddfe

dex文件的作用

记录整个工程(通常是一个Android工程)的所有类文件的信息。其能够被DVM或者Art虚拟机执行并且加载。

dex文件的结构

  • 8位字节的二进制流文件
  • 各个数据紧密排列,无间隙,减少了文件体积,加快加载速度
  • 整个工程的类信息都存放在一个dex文件中(不考虑dex分包的情况下)

安全笔记:Android|APK文件结构分析

文件头:总长度是固定的0x70

链接数据区:主要指so库