开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4582|回复: 10
收起左侧

[原创视频分享] 【APP逆向】APK的文件结构详解

[复制链接]
结帖率:80% (33/41)
发表于 2018-7-16 13:58:25 | 显示全部楼层 |阅读模式   广东省东莞市
本帖最后由 宇智波·佐助 于 2018-7-17 10:07 编辑

01APK基本结构

作者:小胖



Android应用是用高级编程语言大部分是使用“Java”编写的,它利用Android SDK编译代码,并且把所有资源文件和数据统一打包成APKApplication Package)文件,其实APK没大家想象中的那么神奇,它只是一个压缩包,和我们日常见的ZIP,RAR的压缩文件没什么不同,我们可以用压缩软件打开一个APK。下面我们用360压缩打开APK,看看APK中有何玄机~

图片1.png

在上图中,我们可以看到,我们用360压缩打开的APK拥有“assets,lib,META-INF,res”目录和“AndroidManifest.xml,classes.dex,resources.arsc”文件。下文,我们来讲解下这些文件(文件夹)是干什么的。
Assets目录
存放需要打包到APK的静态文件
Lib目录
程序依赖的native
META-INF目录
存放应用程序签名和证书的目录
Res目录
存放应用程序的资源
AndroidManifest.xml
应用程序的配置文件
Classes.dex
Dex可执行文件
Resources.arsc
资源配置文件

1)assets目录:存放需要打包到APK的静态文件,该目录与res目录不同之处在于,assets目录支持任意深度的子目录,我们的开发者可以根据自己的需求来任意部署文件夹的架构,而且res目录下的文件会在.R文件中生成与其对应的资源ID,,assets不会自动生成对应的id,访问的时候需要AssetManager类。
2)Lib目录:该目录用来存放应用程序所依赖的native库文件,native库一般是用C/C++进行编写的,这里的lib库可能包含4种不同类型,根据CPU型号的不同,我们大体可以分为ARMARM-v7aMIPSX86,分别对应着ARM架构,ARM-V7架构,MIPS架构和X86架构,这些so库在apk包中构成如下图:
2.png
其中,不同的CPU架构对应着不同的目录,每个目录中可以存放非常多的对应版本的so库,而且这个目录的结构固定,用户只能按照这个目录来存放自己的so库。目前市场上使用的移动终端大多是基于ARM或者ARM-v7a架构的。从厂家上来分是有三种,armx86MIPSarm 系列是绝大多数手机上使用的,x86 主要是运用在平板上,而 MIPS ,我基本上就没见过。
3)Res目录:resresource的缩写,这个目录存放的东西是资源文件,存放这个文件夹下的所有文件都会和上文所说的,映射到Android工程中的.R文件中,生成对应的资源ID,访问的时候直接使用资源ID,即R.ID.FILENAMEres文件夹下可以包含多个文件夹;anim是存放动画文件的;drawable目录存放图形资源;layout目录存放布局文件;values目录存放一些特征值;colors.xml存放color的颜色值等等
4)META-INF目录:保存应用程序的签名信息,签名信息可以验证APK文件的完整性。当AndroidSDK在打包APK文件时会计算APK包中的所有文件信息的完整性,并且把这些完整性保存到META-INF文件夹下,应用程序在安装的时候首先会更具META-INF文件夹校验APK的完整性。通过这种手段,我们就可以在一定程度上保证APK中的每一个文件不被篡改。以此来确保我们的APK应用程序不被恶意修改或者被病毒文件感染,这有利于确保Android应用的完整性和系统的安全性。META-INF目录中包含的文件有CERT.RSACERT.DSACERT.SFMANIFEST.MF。其中CERT.RSA是开发者利用私钥对APK进行签名的签名文件,CERT.SFMANIFEST.MF记录了文件中文件的SHA-1哈希值。
5)AndroidManifest.xml:这是Android应用程序的配置文件,是一个用来描述Android应用“整体咨询”的设定文件,简单的说,这相对于Android应用向Android系统的“自我介绍”配置文件,Android系统可以根据Androidmanifest.xml文件来完整的了解这个APK应用程序的咨询。不难想到,每个Android应用程序都必须包含一个Androidmanifest.xml文件,并且它的名字是固定的,是禁止修改的。
6)classes.dex:传统的Java程序,首先先把文件编译成class文件,字节码都保存在了class文件中,Java虚拟机可以通过解释且执行这些class文件。然而Dalvik虚拟机是在Java虚拟机进行了优化,执行的是Dalvik字节码,而这些Dalvik字节码就是由Java字节码转换而来的。一般来说,Android应用在打包的时候通过AndroidSDK中的dx工具将Java字节码转换为Dalvik字节码。Dx工具可以对多个class文件进行合并,重组和优化,通过这些操作,可以达到减小体积,缩短运行时间的目的。
7)Resources.arsc:用来记录资源文件和资源ID之间的映射关系,用来根据资源ID寻找资源。Android的开发是分模块的,res目录专门用来存放资源文件,当在代码中需要调用资源文件时,只需要调用方法“findviewbyid()”就可以得到资源文件,每当在res文件夹下放一个文件,aapt就会自动生成对应的ID保存在.R文件,我们调用这个ID就可以,但是只有这个ID还不够,.R文件只是保证编译程序不报错,实际上在程序运行时,系统要根据ID去寻找对应的资源路径,而resources.arsc文件就是用来记录这些ID和资源文件位置对应关系的文件。



评分

参与人数 1精币 +1 收起 理由
aimee400 + 1 感谢分享,很给力!~

查看全部评分


签到天数: 1 天

发表于 2018-12-22 00:53:22 | 显示全部楼层   广东省佛山市
回复 支持 反对

使用道具 举报

发表于 2018-8-30 14:07:58 | 显示全部楼层   河南省信阳市
刚好适合。
回复 支持 反对

使用道具 举报

发表于 2018-8-27 22:50:56 | 显示全部楼层   湖南省永州市
感谢楼主的分享....
回复 支持 反对

使用道具 举报

发表于 2018-8-6 18:05:33 | 显示全部楼层   江西省南昌市
感谢楼主  小白还在学习中
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2018-7-29 12:06:00 | 显示全部楼层   江西省南昌市
学习了,感谢楼主!
回复 支持 反对

使用道具 举报

结帖率:82% (28/34)
发表于 2018-7-26 10:44:03 | 显示全部楼层   湖南省永州市
好东西 收藏了
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)
发表于 2018-7-23 19:22:16 | 显示全部楼层   广西壮族自治区北海市
正好需要零基础的,感谢分享
回复 支持 反对

使用道具 举报

发表于 2018-7-19 10:21:06 | 显示全部楼层   四川省成都市
支持楼主分享
回复 支持 反对

使用道具 举报

结帖率:63% (5/8)
发表于 2018-7-17 17:46:47 | 显示全部楼层   广东省*
支持楼主分享
回复 支持 反对

使用道具 举报

发表于 2018-7-17 10:08:37 | 显示全部楼层   四川省成都市
虽然很基础,但是必须感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表