1. Dalvik VM(DVM)和 和 Java VM(JVM) 的区别:
1) JVM 是运行 Java 字节码,DVM 是运行 Dalvik 字节码
2) Dalvik 可执行文件(.dex)的体积更小
3) 虚拟机架构不同:JVM 是基于栈,DVM 是基于寄存器
Java 代码:
反编译 int foo(int a, int b)函数的 Java 字节码:
反编译 int foo(int a, int b)函数的 Dalvik 字节码:
2. Dalvik 汇编语言介绍
v 命名法与 p 命名法:
类型描述符:
寄存器:
1) DVM 寄存器都是 32bit 的,与名称无关
2) J,D 类型,需要相邻 2 个寄存器
3) 对象类型:Ljava/lang/String; = java.lang.String
4) 数组:[I = int [],[[I = int [][]
方法:
1) 格式:Lpackage/name/ObjectName;->MethodName(III)Z
2) 例子:method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String
等价于:String method(int, int[][], int, String, Object[])
字段:
格式:Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
3. 程序编译与反编译
主要的反编译器:
1)jeb;
2)AndroidKiller
Dalvik 指令集:
1) 空操作指令:nop
2) 数据操作指令:move
move vA, vB:将 vB 寄存器的值赋给 vA 寄存器,源寄存器与目的寄存器都是 4 位
move-object/from 16 vAA, vBBBB:为对象赋值,源寄存器为 8 位,目的寄存器为 16
位
4. 汇编语言实现
对应的 Java 代码:
编译 smali 文件:
java –jar smali.jar –o classes.dex HelloWorld.smali
执行程序:
上传到手机:adb push classes.dex /data/local/
执行程序:adb shell dalvikvm –cp /data/local/classes.dex HelloWorld