smali学习
-
数据类型
dalvik字节码有两种数据类型,原始类型和引用类型。对象和数组是引用类型,其他都是原始类型。 smali数据类型都是用一个字母表示,除了boolean类型以外,smali数据类型的字母其实是Java基本数据类型首字母的大写,在smali中用大写的“Z”表示boolean类型。
V | Void,只能用于返回值类型 |
---|---|
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long(64bits) |
F | float |
D | double(64bits) |
-
对象
对象以
Lpackage/name/ObjectName;
的形式表示。L表示这是一个对象类型,package/name/
是该对象所在的包名,ObjectName
是对象的名字,“;”表示对象名称的结束。例如:Ljava/lang/String
相当于java.lang.String
。 -
数据表示形式
[I
–表示一个整型一维数组,相当于java中的int[]
。 对于多维数组,只要增加[就行了。[[I
相当于int[][]
,[[[I
相当于int[][][]
。注意每一维的最多255个。 -
方法
方法的表示形式:
Lpackage/name/Objectname;->MethodName(III)Z
这个例子中,Lpackage/name/ObjectName
表示类型,MethodName是方法名,III是三个整型参数,Z是返回类型Boolean型。一个更复杂的例子:
method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
在java中则为:
String method(int, int[][], int, String, Object[])
-
字段
表示形式:
Lpackage/name/ObjectName;-> FieldName:Ljava/lang/String;
即包名,字段名和各字段类型 -
smail文件对比java文件
.class :类名 .super :父类 .source :源文件名 .implements :继承的接口 .field :类成员变量 .method :类方法 .parameter :函数参数 p1,p2... .locals x :局部变量(个数) const/16 v0, 0x64 :int v0 = 0x64 const/high16 v0, 0x7f03 :高16赋值 const-wide v0, 0x4024051eb851eb85L const-string v0, "1111" :字符串 add-int v0, p0, p1 :v0 = p0 + p1(static函数参数 从p0 开始) sub-int v0, p1, p2 :v0 = p1 + p2(普通成员函数参数从 p1 开始) mul-int v0, p1, p2 :v0 = p1 * p2 div-int v0, p1, p2 :v0 = p1 / p2 add-int/2addr v0, v1 :v0+v1放到 v0所在的地址 sub-int/2addr v0, p2 :v0-p2放到 v0所在的地址 iput-object v0, p0, Lcom/xyz/smali/SmaliActivity;->string:Ljava/lang/String; :成员变量 v0 = string; iget-object v0, p0, Lcom/xyz/smali/SmaliActivity;->mBtn:Landroid/widget/Button; :关联成员变量 sput v0, Lcom/xyz/smali/SmaliActivity;->OK:I :sput 给static变量赋值 sput-wide v0, Lcom/xyz/smali/SmaliActivity;->dou:D :sput-wide 给static的宽字节变量赋值 sput-object v0, Lcom/xyz/smali/SmaliActivity;->sss:Ljava/lang/String; sget v1, Lcom/xyz/smali/SmaliActivity;->OK:I :关联static变量 invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V : this.super.onCreate(); invoke-static {p1, p2}, Lcom/xyz/smali/SmaliActivity;->add(II)I :调用静态函数 add(p1, p2) invoke-virtual {v0, p0}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V :调用虚函数 move-result v0 :前面调用函数后,把结果放到 v0 move-result-object v0 :前面调用函数返回的对象给 v0 check-cast v0, Landroid/widget/Button; :强制类型转换 mBtn = (Button) findViewById(R.id.btn); return-void :return ;
-
smali跳转语句
“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
参考资料:http://blog.csdn.net/sjim_/article/details/50443860
https://liuzhichao.com/p/912.html
http://blog.csdn.net/loganyang123/article/details/38958875