Android逆向之smali學習
Smali是Android虛擬機器Dalvik反彙編的結果。
Dalvik指令集
指令格式為:[op]-[type](可選)/[位寬,預設4位] [目標暫存器],[源暫存器](可選)
賦值:move* v1,v2
返回操作:return-[type] (void ,不帶, object,wide)
宣告常量: const(/4、/16、/hight16) v1 im 將常量賦值給v1暫存器,const-wide(/16、/32、/hight16) v1 im 將雙字型常量賦值給v1暫存器,const-string(/jumbo) v1 “str”
呼叫函式:invoke-[kind()] {引數表}, 函式名@BBBB
invoke-virtual :用於呼叫一般的,非private、非static、非final、非構造函式的方法,它的第一個引數往往會傳p0,也就是this指標
invoke-super :用於呼叫父類中的方法,其他和invoke-virtual保持一致
invoke-direct
invoke-static :用於呼叫靜態方法,比如一些工具類
invoke-interface :用於呼叫interface中的方法
判斷: if-* v1,v2 【less than - lt,greater than - gt,equal -eq, not -ne,le,ge】
比較:cmp* v1,v2,v3 等價於 v1 = (v3 - v2)%1
取值(get)和賦值(put): iget* 和 iput*
型別轉換 :如 float-to-int 將v2暫存器中的float型別值轉換為int型別,並賦值給v1暫存器
算術運算 :add-int/2addr v1, v2 將v1、v2暫存器中的值相加,並賦值給v1暫存器
注:lit8(limit)是對要加的常量的長度限制,如果不寫,則預設為4位,還可選擇lit16,即16bit
語法:
.field 定義變數 .method 方法 .parameter 方法引數 .prologue 方法開始 .line 12 此方法位於第12行
資料型別:
-
V void,只能用於返回值型別
-
Z boolean
-
B byte
-
S short
-
C charI intJ long(64 位)
-
F floatD double(64 位)
-
L Java 類型別
-
[ 陣列型別