1.了解dalvik寄存器
dalvik中的寄存器都是32位
2.寄存器之v命名法与p命名法
参数寄存器 P0-Pn
局部变量寄存器 V0-Vn
3.dex文件反汇编工具
smali.jar\ddx.jar
4.类型
smali==>Java
V void
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L java类
[ 数组
5.字段
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
6.方法
Lpackage/name/ObjectName;->MethodName (III) Z
基础字节码-名称后缀/字节码后缀 目的寄存器 源寄存器
名称后缀是wide,表示数据宽度为64位
字节码后缀是from16,表示源寄存器为16位
空操作指令
nop
数据操作指令
move(-wide/-object/-result/-result-object/-result-wide/- exception)
move(-wide/-object)/from16
move(-object)/16
返回指令(重点)
return-void(表示方法的放回值为空)
return(表示方法的反回值为32位非对象类型的值)
return-wide(表示方法的反回值为64位非对象类型的值)
return-object(表示方法的反回值为对象类型的值)
数据定义指令(重点)
const(-wide/-string/-class)
const/4
const(-wide)/16
const(-wide)/32
const(-wide)/high16
实例操作指令
check-cast(类型转换)
instance-of(检查)
new-instance(新建)
数组操作指令
array-length(获取数组长度)
new-array(新建数组)
filled-new-array(定义数组并初始化)
filled-new-array/range(定义数组并初始化/指定取值范围)
filled-array-data(数组元素取值与赋值)
异常指令(throw)
跳转指令(重点)
goto 紧跟一个标签直接跳转到标签所在位置
packed-switch(有规律)、sparse-switch(无规律)
if-eq(等于)/if-ne(不等于)
if-lt(小于)/if-le(小于等于)
if-gt(大于)/if-ge(大于等于)
比较指令(cmp)
大于(1)/等于(0)/小于(-1)=>cmpg、cmp
大于(-1)/等于(0)/小于(1)=>cmpl
字段操作指令
普通字段=>iget(读)/iput(写)
静态字段=>sget(读)/sput(写)
方法调用指令(重点)
invoke-virtual(调用实例的虚方法) Java当中的普通方法
invoke-super(调用实例的父类/基类方法)
invoke-direct(调用实例的直接方法) 调用java当中的构造方法
invoke-static(调用实例的静态方法)
invoke-interface(调用实例的接口方法)
数据转换指令
neg-数据类型=>求补
not-数据类型=>求反
数据类型1-to-数据类型2=>将数据类型1转换为数据类型2
数据运算指令
add/sub/mul/div/rem 加/减/乘/除/模
and/or/xor 与/或/非
sh1/shr/ushr 有符号左移/有符号右移/无符号右移
smali文件:
无论是普通类、抽象类、接口类或者内部类,在反编译出的代码中,它 们都以单独的smali 文件来存放。每个 smali 文件都由若干条语句组成, 所有的语句都遵循着一套语法规范。
1.描述类的信息
.class < 访问权限> [ 修饰关键字] < 类名>
.super < 父类名>
.source <源文件名>
2. 静态字段
# static fields
.field < 访问权限> static [ 修饰关键字] < 字段名>:< 字段类型>
3.实例字段
# instance fields
.field < 访问权限> [ 修饰关键字] < 字段名>:< 字段类型>
4.直接方法
# direct methods
.method <访问权限> [ 修饰关键字] < 方法原型>
<.locals> “.locals ”指定了使用的局部变量的个数
[.param] “.param”指定了方法的参数
[.prologue] “.prologue ”指定了代码的开始处
[.line] “.line ”指定了该处指令在源代码中的行号
<代码体>
.end method
5. 虚方法的声明与直接方法相同,只是起始处的注释为“virtual methods”。
6.接口
# interfaces
.implements < 接口名>“.implements ”是接口关键字,后面的接口
名是 DexClassDef 结构中 interfacesOff 字段指定的内容。
7.注解
# annotations
.annotation [ 注解属性] < 注解类名>
[ 注解字段 = 值]
.end annotation
注解的作用范围可以是类、方法或字段。如果注解的作用范围是类, “.annotation ”指令会直接定义在 smali 文件中,如果是方法或字段,“.annotation ”指令则会包含在方法或字段定义中。