smali學(xué)習(xí)
-
數(shù)據(jù)類型
dalvik字節(jié)碼有兩種數(shù)據(jù)類型,原始類型和引用類型垢村。對(duì)象和數(shù)組是引用類型割疾,其他都是原始類型。 smali數(shù)據(jù)類型都是用一個(gè)字母表示嘉栓,除了boolean類型以外宏榕,smali數(shù)據(jù)類型的字母其實(shí)是Java基本數(shù)據(jù)類型首字母的大寫,在smali中用大寫的“Z”表示boolean類型侵佃。
V | Void,只能用于返回值類型 |
---|---|
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long(64bits) |
F | float |
D | double(64bits) |
-
對(duì)象
對(duì)象以
Lpackage/name/ObjectName;
的形式表示麻昼。L表示這是一個(gè)對(duì)象類型,package/name/
是該對(duì)象所在的包名馋辈,ObjectName
是對(duì)象的名字抚芦,“;”表示對(duì)象名稱的結(jié)束。例如:Ljava/lang/String
相當(dāng)于java.lang.String
。 -
數(shù)據(jù)表示形式
[I
–表示一個(gè)整型一維數(shù)組叉抡,相當(dāng)于java中的int[]
尔崔。 對(duì)于多維數(shù)組,只要增加[就行了褥民。[[I
相當(dāng)于int[][]
季春,[[[I
相當(dāng)于int[][][]
。注意每一維的最多255個(gè)消返。 -
方法
方法的表示形式:
Lpackage/name/Objectname;->MethodName(III)Z
這個(gè)例子中载弄,Lpackage/name/ObjectName
表示類型,MethodName是方法名撵颊,III是三個(gè)整型參數(shù)侦锯,Z是返回類型Boolean型。一個(gè)更復(fù)雜的例子:
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文件對(duì)比java文件
.class :類名 .super :父類 .source :源文件名 .implements :繼承的接口 .field :類成員變量 .method :類方法 .parameter :函數(shù)參數(shù) p1,p2... .locals x :局部變量(個(gè)數(shù)) 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函數(shù)參數(shù) 從p0 開(kāi)始) sub-int v0, p1, p2 :v0 = p1 + p2(普通成員函數(shù)參數(shù)從 p1 開(kāi)始) 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; :關(guān)聯(lián)成員變量 sput v0, Lcom/xyz/smali/SmaliActivity;->OK:I :sput 給static變量賦值 sput-wide v0, Lcom/xyz/smali/SmaliActivity;->dou:D :sput-wide 給static的寬字節(jié)變量賦值 sput-object v0, Lcom/xyz/smali/SmaliActivity;->sss:Ljava/lang/String; sget v1, Lcom/xyz/smali/SmaliActivity;->OK:I :關(guān)聯(lián)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 :調(diào)用靜態(tài)函數(shù) add(p1, p2) invoke-virtual {v0, p0}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V :調(diào)用虛函數(shù) move-result v0 :前面調(diào)用函數(shù)后尺碰,把結(jié)果放到 v0 move-result-object v0 :前面調(diào)用函數(shù)返回的對(duì)象給 v0 check-cast v0, Landroid/widget/Button; :強(qiáng)制類型轉(zhuǎn)換 mBtn = (Button) findViewById(R.id.btn); return-void :return ;
-
smali跳轉(zhuǎn)語(yǔ)句
“if-eq vA, vB, :cond_**” 如果vA等于vB則跳轉(zhuǎn)到: cond
“if-ne vA, vB, :cond_**” 如果vA不等于vB則跳轉(zhuǎn)到:cond
“if-lt vA, vB, :cond_**” 如果vA小于vB則跳轉(zhuǎn)到:cond
“if-ge vA, vB, :cond_**” 如果vA大于等于vB則跳轉(zhuǎn)到:cond
“if-gt vA, vB, :cond_**” 如果vA大于vB則跳轉(zhuǎn)到:cond
“if-le vA, vB, :cond_**” 如果vA小于等于vB則跳轉(zhuǎn)到:cond
“if-eqz vA, :cond_**” 如果vA等于0則跳轉(zhuǎn)到:cond
“if-nez vA, :cond_**” 如果vA不等于0則跳轉(zhuǎn)到:cond
“if-ltz vA, :cond_**” 如果vA小于0則跳轉(zhuǎn)到:cond
“if-gez vA, :cond_**” 如果vA大于等于0則跳轉(zhuǎn)到:cond
“if-gtz vA, :cond_**” 如果vA大于0則跳轉(zhuǎn)到:cond
“if-lez vA, :cond_**” 如果vA小于等于0則跳轉(zhuǎn)到:cond
參考資料:http://blog.csdn.net/sjim_/article/details/50443860
? https://liuzhichao.com/p/912.html
? http://blog.csdn.net/loganyang123/article/details/38958875