Dalvik位元組碼和Smali基本語法
阿新 • • 發佈:2022-05-16
什麼是Dalvik位元組碼
Dalvik是Google專門為Android設計的一個虛擬機器。
Dalvik VM是基於暫存器的,而JVM是基於棧的,Dalvik有專屬的檔案執行格式dex(Dalvik executable),jvm使用的是java位元組碼。
Dalvik VM你jvm速度更快,佔用空間更少。
什麼是Smali
Smali,baksmali分貝時指安卓系統裡的java虛擬機器(Dalvik)所使用的一種。dex格式檔案的彙編器,反彙編器。
語法為一行寬鬆的Jasmin/dedeser語法,且實現了.dex格式的所用功能(註解,除錯資訊,線路資訊等)。
對apk檔案進行反彙編後,便會生成此類檔案。其中在Dalvik位元組碼中,暫存器都是32位的,能夠支援任何型別,64位型別(Long/Double)用2個暫存器表示。
Dalvik位元組碼有兩種型別:原始型別,引用型別。
原始型別: B --- byte C --- char D --- double F --- float I --- int J --- long S --- short V --- void Z --- boolean [XXX --- array //陣列表示方式:基本型別前加上“[”,eg:int型陣列表示為:[I LXXX/yyy --- object //物件表示以L開頭,格式為LpackageName/objectName;(分號必須有) //eg:String在Smali中為:LJava/lang.String; ,其中java/lang對應java.lang包,String就是定義在該包中的一個物件。 //內部類表示為:LpackName/objectNamesubObjectName;。即在內部類前面加“subObjectName;。即在內部類前面加“”符號。 方法定義:Func-Name(para-Type1para-Type2para-Type3...)Return-Type //引數之間沒有空格 eg:hello()v //void hello() hello(III)Z //boolean hello(int,int,int) hello(Z[I[ILjava/lang/String;J)Ljava/lang/String //String hello(boolean,int[],int[],String,long)
Smali基本語法
.field private isFlag:z 定義變數 .method 方法 .parameter 方法引數 .prologue 方法開始 .line 123 此方法位於第123行 invoke-super 呼叫父函式 const/high16 vO, 0x7fo3 把0x7fo3賦值給v0 invoke-direct 呼叫函式 return-void 函式返回void .end method 函式結束 new-instance 建立例項 iput-object 物件賦值 iget-object 呼叫物件 invoke-static 呼叫靜態函式 條件跳轉分支: "if-eq vA, vB, :con_**" 如果vA等於vB則跳轉到:cond_ ** "if-ne vA, vB, :cond_**" 如果vA不等於vB則跳轉到:cond_ ** "if-It 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-Itz 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 **