freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

安卓基础:安卓安装包APK的组成以及生成步骤
2021-10-18 21:51:02

一、APK包的组成

Google提供了Android SDK供程序员来开发Android平台的软件。每个软件在最终发布时会打包成一个APK文件,将APK文件传送到Android设备中运行即可安装。APK是Android package的缩写,功能类似于Symbian系统的SIS文件,实际上APK文件就是一个zip压缩包,使用zip格式压缩软件对APK文件进行解压,会发现他由一些图片资源与其他文件组成,并且每个APK文件中包含一个classes.dex (oDex过的APK除外),这个classes.dex就是Android系统Dalvik 虚拟机的可执行文件,简称Dalvik可执行文件。
解压文件如图所示:
图片.png静态分析就是对APK解压后的几个重要文件进行分析、篡改、注入等。
(1) assets文件夹:资源目录、声音、字体、网页
(2)lib文件夹: so库存放位置,一般由NDK编译得到,常使用于游戏引擎INI native调用
(3)META-INF文件夹:存放工程的一些属性文件,如Manifest.MF
(4) res文件夹︰资源目录,即应用中使用到的资源目录,已编译的无法直接阅读。(5)AndroidManifest.xml文件夹:Android工程的基础配置属性文件
(6) classes.dex: Java代码编译得到的Dalvik VM能直接执行的文件。(7) resources.arsc: res目录下的资源的一个索引文件。

二、APK包的生成步骤

Android 工程打包有两种方式:一种是使用Eclipse (akelipes)集成开发环境直接导出生成APK;另一种是使用Ant工具在命令行方式下打包生成APK。不管采用哪一种方式,打包APK过程的实质是一样的。Android的在线开发文档
Develop→Tools一Building and Running 中提供了一张APK文件的构建流程图,整个编译打包过程由多个步骤组成
如图所示:
图片.png
从流程图可以看出,整个APK打包过程分为七个步骤:

1)第一步:打包资源文件,生成R.java 文件。打包资源的工具aapt位于Android-sdk \platform-tools目录下,该工具的源码在Android系统源码的
frameworks\base\tools\aapt目录下,生成过程主要是调用了aapt源码目录下resource.cpp文件中的buildResources()函数,该函数首先检查AndroidManifest.xml
的合法性,然后对res目录下的资源子目录进行处理,处理的函数为
makeFileResources(),处理的内容包括资源文件名的合法性检查,向资源表添加条目等,处理完成后调用compileResourceFile(函数编译res与asserts (aserites)目录下的资源并生成resources.arsc文件,compileResourceFile()函数位于aapt源码目录的ResourceTable.cpp文件中,该函数最后会调用parseAndAddEntry()函数生成R.java文件,完成资源编译后,接下来调用compileXmlFile()函数对res目录子目录下的XML文件分别进行编译,这样处理过的XML文件就简单地被“加密”了,最后将所有的资源与编译生成的resources.arsc文件以及“加密”过的AndroidManifest.xml文件打包压缩成resources.ap文件(使用Ant工具命令行编译则会生成与build.xml中"project name”指定的属性同名的ap 文件)。
2)第二步:处理aidl文件,生成相应的Java文件。对于没有使用到aidl的Android工程,这一步可以跳过。这一步使用到的工具为aidl,位于Android-sdk\platform-tools目录下,aidl工具解析接口定义文件(aidl为Android interface definition language的首字母缩写,即Android接口描述语言)并生成相应的Java代码供程序调用,有兴趣的读者可以查看它的源码,位于Android源码的frameworks\base\tools\aidl目录下。
3)第三步:编译工程源代码,生成相应的.class文件。这一步调用javac编译工程src目录下所有的Java源文件,生成的.class文件位于工程的bin\classes目录下,上图中假定编译工程源代码时程序是基于Android SDK开发的,实际开发过程中,也有可能会使用Android NDK来编译native代码,因此,如果可能,这一步还需要使用AndroidNDK编译C/C++代码,当然,编译C/C++代码的步骤也可以提前到第一步或第二步。
4)第四步︰转换所有的.class文件,生成classes.dex文件。Android系统Dalvik虚报机的可执行文件为dex格式,程序运行所需的classes.dex就是在这一步生成的,使用的工具为dx,它位于Android-sdk patform-tools目录下,dx工具主要的工作Java字节码转换为Dalvik字节码、压缩常量池、消除冗余信息等。
5)第五步:打包生成APK文件。打包的工具为apkbuilder,它位于Android-sdk\tools目录下,apkbuilder为一个脚本文件,实际调用的是Android-
sdk\tools\lib\sdklib.jar文件中的com.Android.sdklib.build.ApkBuilderMain类。它的实现代码位于Android系统源码的sdk \sdkmanager\libs\sdklib\src\com\Android\sdklib \build\ApkBuilderMain.java文件中,代码构建了一个apkbuilder类,然后以包含resources.arsc的文件为基础生成
APK文件,这个文件
一般为以ap_结尾的文件,接着调用addSourceFolder()函数添加工程的资源,addSourceFolder()会调用processFileForResource(函数向APK文件中添加资源,处理的内容包括res目录与assets目录中的文件,添加完资源后调用addResourcesFromJar ()函数向APK文件中写入依赖库,接着调用addNativeLibraries(函数添加工程libs目录下的Native库(通过Android NDK编译生成的so或bin文件),最后调用sealApk()关闭APK文件。
6)第六步:对APK文件进行签名。Android的应用程序需要签名才能在Android设备上安装,签名APK文件有两种情况
一种是在调试程序时进行签名,使用Eclipse开发Android程序时,在编译调试程序时会自己使用一个debug.keystore 对APK文件进行签名;
另一种是打包发布时对程序进行签名,这种情况下需要提供一个符合Android开发文档中要求的签名文件。
签名的方法也有两种:
一种是使用JDK中提供的jarsigner工具签名;
另一种是使用Android源码中提供的signapk 工具,它的代码位于Android 系统源码的build\ tools\signapk目录下。
7)第七步:对签名后的APK文件进行对齐处理。这一步需要使用到的工具为zipalign,它位于Android-sdk\tools目录下,源码位于Android系统源码的
build\tools\zipalign目录下,它的主要工作是将APK包进行对齐处理,使APK包中的所有资源文件距离文件起始偏移为4字节的整数倍,这样通过内存映射访问APK文件时的速度会更快,验证APK文件是否对齐过的工作由ZipAlign.cpp文件的verify()函数完成,处理对齐的工作则由process()函数完成。这些知识点都跟之前介绍的四层架构以及文件结构息息相关,下面介绍Android系统是如何识别APK文件并安装的。

三、安卓程序的安装流程

(1)系统程序安装:开机时安装,这类安装没有安装界面。
(2)通过Android市场安装∶直接通过Android市场进行网络安装,这类安装没有安装界面。
(3)ADB工具安装:使用ADB工具进行安装,这类安装没有安装界面。
(4)手机自带安装:通过SD卡里的APK文件安装,这类安装有安装界面。

第一种方式是由开机时启动的PackageManagerService服务完成的,这个服务在启动时会扫描系统程序目录/system/App 并重新安装所有程序
第二种方式直接通过Android市场下载APK文件进行安装,目前国内大多数Android 手机没有集成GooglePlay商店,用户多数情况下是使用其他Android市场来安装APK程序的,这样,安装方式与第4种基本一样;第三种方式比较简单

四、总结

在进行安卓渗透的学习之前需要先对安卓的APK包的组成与生成步骤有一定的了解,只有了解之后在今后的渗透学习中才能更好地掌握与吸收

# 网络安全技术
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者