前言:

想要扩展攻击面必然需要了解APK如何组成,以及源码如何打包导出到APK的??从基本的信息获取到安全隐患利用都将可以帮助我们学习更多.

一、APK组成

APK文件也就是Android打包流程的产物,而它内部包含哪些内容以及如何从源码打包得到的方法需要一起关于下面了.

众所周知,APK文件本质是一个zip的压缩包,想知道内部包含哪些内容时可以直接修改后追zip或其他压缩包后缀类型,即可获取内部数据.


1、AndroidManifest.xml
2、assets
3、classes.dex
4、lib
5、META-INF
6、res
7、resources.arsc

以上文件及文件夹是Android应用基本具备的资源,其他文件及文件夹则是一些第三库,或其他代码生成的.

1.1、AndroidManifest.xml

Android应用全局配置文件,它包含了这个应用的很多配置信息,例如包名、版本号、所需权限、注册的服务等.可以根据这个文件在相当程度上了解这个应用的一些信息.该文件目前状态是被编译为二进制的XML文件,可以通过一些工具(如 apktool)反编译后进行查看.

可使用工具实现,其他工具也可以不多介绍:

1.2、assets

assets 文件夹用于保存需要保持原始文件的资源文件夹,开发过程中拖了什么到里面,打包完之后里面还是什么.一般用于存放音频,网页(帮助页面之类的),字体等文件.主要需要知道的点是,它与 res 文件夹的区分以及如何在应用中访问该文件夹的资源,如它可以有多级目录而 res 则只有两级.

1.3、classes.dex

classes.dex 文件是Android系统运行于Dalvik Virtual Machine上的可执行文件,也是Android应用程序的核心所在.

Java 源码通过javac生成class文件,再通过dx工具转换为classes.dex,注意有些APK会有多个classes2.dex和classes3.dex;这是方法数超过一个dex的上限,分dex 的结果.分dex在Android 5.0之前需要开发者自行完成,5.0 后 dx 自带支持.dex文件的数据结构不算复杂.

1.4、lib

该目录存放着应用需要的native库文件;比如一些底层实现的图片处理、音视频处理、数据加密的库以 so 库的形式在该文件夹中.而该文件夹下有时会多一个层级,这是根据不同CPU 型号而划分的,如 ARM,ARM-v7a,x86等.

1.5、META-INF

该目录的主要作用是用于保证 APK 的完整性以及安全性.

MANIFEST.MF,这个文件保存了整个 apk 文件中所有文件的文件名 + SHA-1后的 编码值.这也就意味着,MANIFEST.MF 象征着 apk 包的完整性.

CERT.RSA,这个文件保存了公钥和加密方式的信息.

CERT.SF,这个文件与 MANIFEST.MF 的结构一样,只是其编码会被被私钥加密;这样一来每次安装时,通过该文件夹中的文件,就可以完成验证的过程.如果 apk 包被改变了,而篡改者没有私钥生成 CERT.SF,则无法完成校验.

1.6、res

这个文件可以说是所有文件中结构最复杂的.

它记录了资源文件,资源文件位置(各个维度的路径)和资源 id 的映射关系。并且将所有的 string 都存放在了 string pool 中,节省了在查找资源时,字符串处理的开销.

资源混淆的原理,就是修改这里各个维度的值,并修改对应 res 里面的文件夹以及文件名实现的.

二、Android打包流程

2.1、资源

Android 打包流程的第一步,是处理资源文件.

上面提到的AndroidManifest.xml、res文件夹&resource.arsc文件的生成都与其有关,简单来说,aapt解析项目代码中的 AndroidManifest.xml,收集项目中res文件夹的资源文件及 xml 文件,对其做压缩以及编译的处理.在此过程中,分配了资源id并生成了 R.java文件以及arsc文件.

2.2、代码

上一步得到了R.java 文件后,将其与项目代码一起编译得到 .class文件,然后打包为 jar 包。这个过程中,还会有混淆代码这一步骤;再通过 dx 工具,将生成的 jar 包与第三方库的 jar 包一起编译为 dex 文件.这个过程中,如果是 5.0 以前的系统且超过了 65535方法数的限制,需要人为的分 dex,5.0 以后则由 dx 工具完成此项任务.

到这一步,实际上 apk 所需要的主要内容已经大致齐全了;只需要把上面生成的 AndroidManifest.xml、classes.dex、res文件夹、resource.arsc 打包进 apk,并且将项目工程中的 assets 以及 lib 目录一并放入,就有了一个未经签名的 Android 安装包了.



2.3、签名

这一步在之前对 META-INF 的介绍中,实际已有提及。只需要按步骤生成 MANIFEST.MF, CERT.RSA,CERT.SF 并放入META-INF 文件夹即可

以上便是 Android 打包的基本流程.

三、参考

https://blog.csdn.net/beibei_programme/article/details/94743197

http://www.sohu.com/a/149758866_675634/

© Copyright 2019  

Powered by  si1ent  

皖ICP备19004273