初识APK
0x01.什么是APK
概念
APK是AndroidPackage的缩写,即Android安装包(apk)。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。apk文件和sis一样,把android sdk编译的工程打包成一个安装程序文件,格式为apk。 APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是DalvikVM executes的简称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。Android在运行一个程序时首先需要UnZip,然后类似Symbian那样直接,和Windows Mobile中的PE文件有区别。
组成
解压缩apk后,一般包含如下文件结构
1.assets文件夹
- 资源目录:存放网页,图片,JSON等资源
- 静态资源文件,不需要生成索引
- Java代码中需要用AssetManager来访问
- 视频、音频等资源放在此目录
2.lib文件夹
- so库存放位置,一般由NDK编译所得到,常见于使用游戏引擎或JNI native调用过程中
3.META-INF文件夹
- 存放工程的属性文件,签名信息,用来保证apk包的完整性和系统的安全。编译器编译成功apk包时,会对所有要打的包的文件做个校验计算,并把计算结果放到META-INF目录下,这就保证了apk包里的文件不能随意被替换。
4.res文件夹
- 资源目录:存放资源文件,包括图片,字符串
- 编译后会生成索引R.java,在Java代码中用R.xxx.yyy来索引
5.AndroidMainifest.xml文件
- Androdi工程配置的基础文件,它描述了应用的名字,版本,权限,应用的库文件等信息。
- apk中的AndroidMainifest.xml是被压缩过的
6.classes.dex文件
- Java代码编译后最终生成的Dalvik字节码文件
- Android使用的Dalvik虚拟机标准与Java虚拟机标准不兼容
7.resources.arsc文件
- 编译后的二进制资源文件,对res目录资源的一个索引文件,保存了原工程中的文件,例如strings.xml等文件内容,
8.其他文件夹
0x02.什么是Dalvik
1.Dalvik虚拟机
Dalvik虚拟机,是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即“Dalvik Executable”)格式的Java应用程序的运行。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。
2.与Java虚拟机区别
- Dalvik虚拟机是基于寄存器,而JVM虚拟机是基于栈,
- Dalvik有专属文件执行格式dex(dalvik executable),JVM执行的是Java字节码。
- Dalvik VM速度比JVM更快,占用空间更少
3.修改Dalvik的字节码
- 通过Dalvik的字节码不能直接看到原来的逻辑代码,需要借助第三方工具,例如Apktool或dex2jar+jd-gui工具来帮助查看。
- 如果想修改apk则需要操作的文件是.smali文件,而不是导出来的Java文件重新编译
0x03.什么是Smail
- Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种.dex格式文件的汇编器,反汇编器。其语法是一种宽松式的Jasmin/dedexer语法,而且它实现了.dex格式所有功能,对apk反编译之后,便会生成此类文件,其中在dalvik字节码中,寄存器都是32位的,可以支持任何类型,64位类型要用2个寄存器表示,其中Dalvik字节码有两种类型:原始类型和`引用类型(包括对象和数组)
- 具体语法请参考此篇文章:Android逆向之smali语法宝典