APK文件结构
APK文件结构
APK是Android Package的缩写,即Android安装包,所有的Android程序都是以APK文件的形式发布的。可以在模拟器或手机上运行APK文件来安装程序。APK文件的后缀为.apk,但是其格式是压缩文件zip的格式。可以通过WinZip、WinRAR等将其解压。直接将该文件扩展名改为.zip就可以解压该文件来了解APK文件的结构。
解压
可以将apk文件重命名为.zip格式的文件,然后用解压软件打开。也可以设置解压软件关联apk文件。
比如WinRAR软件,找到“选项”——“设置”——“集成”,在“用户自定义压缩文件扩展名”处填上apk,点“确定”保存即可。之后就可以直接双击以WinRAR打开apk安装包文件。
通常APK文件包括以下文件夹或文件:
简述版
- META-INF文件夹:签名文件目录
- res文件夹:资源库目录 一般存放xml布局文件和图标
- AndroidMainifest.xml :配置清单(二进制格式)
- classes.dex:安卓系统上的可执行文件,也是我们逆向的主要的文件,源码都被编译在里面,如有多个是因为每个dex里最多存放65535个方法,而项目的方法数超出了这个数量,所以被分成多个保存
- resources.arsc:资源索引文件,包含语言包,汉化的话一般是反编译这个文件
- assets :资源目录,一般存放图片
- lib:是动态库目录 一般存放so文件
详细版
META-INF文件夹
META-INF文件夹只存在于签名后的apk文件中,其中包含MANIFEST.MF、CERT.SF和CERT.RSA文件。MANIFEST.MF文件包含了apk文件中所有文件的名称和此文件的SHA1摘要值。而CERT.SF和CERT.RSA文件是使用jarsigner工具生成的签名文件和签名块文件,在CERT.SF文件中默认会包含整个MANIFEST.MF文件的SHA1 摘要值;CERT.RSA文件存放对CERT.SF文件的签名,同时还包含从keystore文件中生成的证书或者证书链。在应用程序管理器安装apk文件的过程中会检查证书,对比每个文件的摘要值是否匹配,防止应用程序被篡改。
META-INF文件夹下存放了APK文件的基本信息和签名信息,用来保证APK文件的完整性和系统的安全。类似于jar文件,META-INF文件夹下的MANIFEST.MF文件,说明Manifest文件的版本和创建者,以及相关文件的校验信息。Android系统在安装某个APK文件时会对APK中压缩的各个文件进行校验检查,如果校验结果与META-INF下的内容不一致,系统就不会安装这个APK文件,这就保证了程序安装包的安全性。例如解压一个APK文件,替换里面的一幅图片、一段代码,或一段版权信息,然后重新压缩打包,即使这个APK文件符合格式要求,但是也无法通过校验进行安装。所以这样就给病毒感染和恶意修改增加了难度,可以有效地保护系统安全。
res文件夹
res文件夹存放资源文件。由此也可以看到APK文件对资源文件的保护性较差,任何人都可以通过解压缩的方式从APK文件中提取相关的资源文件,如图片、音频等。
AndroidManifest.xml
AndroidManifest.xml是每个应用程序都必须定义和包含的全局配置文件,它描述了应用程序的名称、版本、权限、引用的库文件等信息。但是不同于系统开发时在项目文件夹中所看到的AndroidManifest.xml文件,在APK文件中,AndroidManifest.xml是经过压缩的,如果直接打开将看到乱码。可以通过相关工具将其解压。
classes.dex
Dalvik虚拟机运行dex文件,而不是传统的class文件,DX工具将编译后的class文件转换成一个dex文件。在程序运行时,Dalvik虚拟机从dex中装载读取指令和数据。
classes.dex是Java源代码编译后生成的Dalvik虚拟机字节码文件,类似于Java虚拟机使用的.class类文件。由于Android使用的Dalvik虚拟机与标准的Java虚拟机是不兼容的,因此dex文件与class文件相比,不论是文件结构还是操作码都不一样。如果编写的源程序有多个Java类,都会将其编译到同一个classes.dex文件中,也就是说不论程序是简单还是复杂,每个APK文件只有一个classes.dex文件,而传统的Java应用程序,往往包含多个class文件,这样就不可避免地增加了冗余信息。将class文件整合到一起,可以减小类文件的尺寸、IO操作,提高类的查找速度。Android模拟器中提供了一个dex文件的反编译工具— dexdump,可以对其进行反编译。
resources.arsc
resources.arsc是编译后的二进制资源文件,内容包含了开发程序时项目文件夹中res子文件夹下main.xml、strings.xml等文件的信息。
lib、assets
除了以上文件夹和文件,在有些APK文件中,还有可能出现lib文件夹和assets文件夹。这两个文件夹中分别存放应用软件需要调用的库文件和其他资源配置文件。
签名
Android的软件也需要签名,却简单方便,首先是不需要自己去申请证书,下载个签名工具就可以签名了。另外,我们从电子市场、软件官网下载来的软件都是已经签好名的,可以直接安装,这里讲到的签名,是针对软件安装包被修改过的情况(如汉化需要修改安装包内的文件,原来的签名文件就不能用了,所以要重新签名软件才能正常安装。),正常情况下不需要签名。
现在Android可用的签名工具很多,可以用汉化浪子出品的AndroidResEdit,这个软件自带签名包。
签名方法很简单,删除原证书文件后(META-INF 文件夹内的.RSA、.SF、***.MF三个文件),打开AndroidResEdit——签名——签名apk文件,选择需要签名的apk安装包后点击“立即签名”即可。