一.什么是Smali?
Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种dex格式文件的汇编器,反汇编器。其语法是一种宽松式的Jasmin/dedexer语法,而且它实现了.dex格式所有功能(注解,调试信息,线路信息等)
二.smali的语法
1.原始类型
- B---byte
- C---char
- D---double
- F---float
- I---int
- J---long
- S---short
- V---void
- Z---boolean
- [XXX---array
- Lxxx/yyy---object
解析下最后两项,数组的表示方式是:
- 在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F;
- 对象的表示则以L作为开头,格式LpackageName/objectName;(注意必须有个分号跟在最后),例如String对象在smali中为:Ljava/lang/String;,其中java/lang对应java.lang包,String就是定义在该包中的一个对象。
2.方法的定义
格式:Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type
注意:参数和参数间没有任何分隔符,
1.hello()v
就是void hello()
2.hello(lll)Z
就是boolean hello(int,int,int)
3.hello(Z[l[lLjava/lang/String;J)Ljava/lang/String
就是String hello(boolean,int[],int[],String,long)
3.基本语法
- .field private isFlag:z 定义变量
- .method 方法
- .parameter 方法参数
- .prologue 方法开始
- .line 123 此方法位于第123行
- invoke-super 调用父函数
- const/high16 v0, 0x7fo3 把0x7fo3赋值给v0
- invoke-direct 调用函数
- return-void 函数返回void
- .end method 函数结束
- new-instance 创建实例
- iput-object 对象赋值
- iget-object 调用对象
- invoke-static 调用静态函数
4.条件跳转分支:
"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_**