1.dalvik寄存器:32位,所有类型,<=32 一个寄存器 64:使用两个相邻寄存器
2.寄存器的命名法:v :局部变量寄存器 v0-vn 参数寄存器 vn-vn+m
p:参数寄存器p0 -pn 变量寄存器 v0-vn
第一种
第二种
流程 :java编译成.class在编译成.dex 最后反编译得到samli文件
.java →.class → .dex → smali
dx.jar: .class打包.dex
dx --dex --output=Decrypt.dex com/yijinda/demo/Decrypt.class
Baksmali.jar: . dex反编译成smali
java -jar baksmali.jar -o smali_out/ classes.dex
Samli.jar : .smali打包成.dex
java -jar smali.jar smali_out/ -o classes.dex
Dalvik → java
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
Z | boolean |
V | void |
L | java类类型 |
[ | 数组类型 |
.field private isFlag:z 定义变量
.method 方法
.parameter 方法参数
.prologue 方法开始
.line 12 此方法位于第12行
invoke-super 调用父函数
const/high16 v0, 0x7fo3 把0x7fo3赋值给v0
invoke-direct 调用函数
return-void 函数返回void
.end method 函数结束
new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
条件跳转分支:
"if-eq vA, vB, :cond_**" 如果vA等于vB则跳转到:cond_**
"if-ne vA, vB, :cond_**" 如果vA不等于vB则跳转到:cond_**
"if-lt vA, vB, :cond_**" 如果vA小于vB则跳转到:cond_**
"if-ge vA, vB, :cond_**" 如果vA大于等于vB则跳转到:cond_**
"if-gt vA, vB, :cond_**" 如果vA大于vB则跳转到:cond_**
"if-le vA, vB, :cond_**" 如果vA小于等于vB则跳转到:cond_**
"if-eqz vA, :cond_**" 如果vA等于0则跳转到:cond_**
"if-nez vA, :cond_**" 如果vA不等于0则跳转到:cond_**
"if-ltz vA, :cond_**" 如果vA小于0则跳转到:cond_**
"if-gez vA, :cond_**" 如果vA大于等于0则跳转到:cond_**
"if-gtz vA, :cond_**" 如果vA大于0则跳转到:cond_**
"if-lez vA, :cond_**" 如果vA小于等于0则跳转到:cond_**