安卓逆向入门教程(一)

时间:2024-03-04 21:14:33

初识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语法宝典