JVM与Dalvik

Android APP主要是采用Java写的,但是其编译过程和一般的Java APP不一样。

Java编译过程

例如,一个测试程序Test.java:

1
2
3
4
5
6
7
8
9
10
public class Test {
public int add(int a, int b) {
return a + b;
}

public static void main(String[] argc) {
Test test = new Test();
System.out.println(test.add(1, 2));
}
}

使用javac Test.java 命令进行编译,得到字节码文件Test.class(使用javap -c Test.class可查看对应的字节码内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return

public int add(int, int);
Code:
0: iload_1
1: iload_2
2: iadd
3: ireturn

public static void main(java.lang.String[]);
Code:
0: new #2 // class Test
3: dup
4: invokespecial #3 // Method "<init>":()V
7: astore_1
8: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_1
12: iconst_1
13: iconst_2
14: invokevirtual #5 // Method add:(II)I
17: invokevirtual #6 // Method java/io/PrintStream.println:(I)V
20: return
}

得到字节码文件后即可以使用JVM(Java虚拟机)来运行:

image-20200723143249744

Dalvik编译过程

虽然Android APP是使用Java来编写的,但并不是使用标准的Java虚拟机来运行,而是通过自带的Dalvik虚拟机来运行。在JVM中,class文件是标准的字节码文件,而在Dalvik中,字节码文件为dex文件。class文件与dex文件对于其虚拟机来说可以理解为是一个可执行的文件。

通过使用Android系统的dx命令(位于\\sdk\\build-tools路径下)dx --dex --output=classes.dex Test.class将class文件和所有的jar包转换成符合Dalvik字节码格式的class.dex文件。在这里就不再展示class.dex文件的字节码内容。一个APP的核心代码都在这个文件中。

ART模式

从Android 4.4版本开始,谷歌在原有以Dalvik虚拟机方式运行APP的基础上,新增了ART(Android Runtime)模式。Dalvik使用的是JIT(Just In Time 即时)编译器,也就是说APP每次运行时都需要即时编译将dex文件字节码转换成机器码,这会拖慢每次启动运行的效率。而ART模式使用的是AOT(Ahead of Time)预编译技术,也就是说APP在第一次安装的时候,就会进行预编译,将字节码编译成机器码。AOT编译使得APP每次启动时,省去了机器码转换的工作,提高了运行效率。

相比起来,ART会占用更多得存储空间,APP安装时间更长,但是对应用来说启动速度、运行效率更快,对系统来说,占用更少的性能以及更少的耗电。

对比

image-20200723143445240

安全测试框架

信息资产分类

针对不同类型的APP,侧重的关键的信息资产不同。比如:

  • 单机游戏类App:业务相对单一,核心资产是代码、资源以及游戏运行时的内存数据。一旦代码和资源被篡改、窃取,内存数据被修改,就会导致游戏的完整性遭到破坏。
  • 社交类App:相对于代码、资源以及内存数据,用户社交关系和社交关系才是核心资产,具体包括聊天记录、接受文件、朋友关系、动态记录等信息。
  • 金融类App:核心资产包括用户账单、交易记录等数据资产,也包括转账支付、产品交易、资金出入等业务功能。

一般来说,与App相关的信息资产可以分为8类:

  1. App文件:如apk和dex等文件。
  2. 程序进程:App启动后进程一直存在,需防止对进程恶意关闭、劫持、注入等攻击。
  3. 内存数据:App运行后,程序代码和业务数据会加载到系统内存中。
  4. 前端界面:防止App界面被监听窃取数据或被劫持等。
  5. 本地存储:App产生的数据。
  6. 网络链路:App与云端服务器、第三方SDK等服务进行数据通信。防止不被监听、劫持和拦截等。
  7. 交互接口:App与本地安装的其他App进行通信以及互相调用,还有可能通过蓝牙、NFC与其他智能设备通信交互。
  8. 云端平台。

App安全测试框架

根据不同信息资产的相似攻击方法进行整合分类,形成一个App安全测试框架:

image-20200723143725672

在接下来的文章中会对每一个测试项进行介绍。