1. 程式人生 > >Android逆向之smali學習

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”  

過長時需要加上jumbo,const-class v1 La/b/TargetClass  將Class常量a.b.TargetClass賦值給v1

呼叫函式:invoke-[kind()] {引數表}, 函式名@BBBB

invoke-virtual      :用於呼叫一般的,非private、非static、非final、非構造函式的方法,它的第一個引數往往會傳p0,也就是this指標
invoke-super       :用於呼叫父類中的方法,其他和invoke-virtual保持一致
invoke-direct

       :用於呼叫private修飾的方法,或者構造方法
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 類型別

  • [ 陣列型別