昨天大致上了解 了 基本smali 架構與形式 接下來會比較深入講解 方法的調用 與 寄存器的運作
.method 表示Java method定義 可以從中了解到 傳進來的參數 的資料型態是什麼與回傳值型式
.method public static add(II)I
在Smali 中 如果要調用的話 會使用 invoke- 這個指令 例如
invoke-static {v0, v1}, Lcom/example/simpleapp/MainActivity$calculator;->add(II)I
invoke- 後面可以接很多virtual, super, static, interface 等等
像是 invoke-super 呼叫父類的方法 , invoke-static 在不用instance 情況下 使用class的方法
invoke-vritual 會用來調用虛擬方法 也就是instance 方法 根據物件實際運行的情形 呼叫合適的methods
方法參數會透過Register 傳進去
const/4 v0, 0x1
const/4 v1, 0x2
invoke-static {v0, v1}, Lcom/example/simpleapp/MainActivity$calculator;->add(II)I
在java 中 classes 變數稱為fields
例如
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
Lcom/example/simpleapp/MainActivity;->clickCount:I
其中 Lpackage/name/ObjectName 是Classe Type, FieldName 為變數名而 :Ljava/lang/String; 就是指這個變數是 String 形式
Class 變數基本定義上 就會長的像這樣
.field private clickCount:I
Register 有就是寄存器 可以用來放Data
Register 在Dalvik Virtual Machine(DVM)中 Register 為32 bit
const v0, 5
如果要放超過64bit的Data 例如 long 或是double 會被分成2個Register 值去存放
0x100000000L 就會分成v0(低位置) 與 v1(高位置)
如果是Instance 的傳遞參數會多傳遞 一個object參考 也就是this 來表示當前物件 例如我們調用了一個實例方法
LMyObject;->MyMethod(IJZ)V
我們就會用到 5個register 值
p0 -> 傳遞該方法當前物件 this
p1 -> I
P2, p3 ->J long
p4 -> boolean
基本上 方法調用都會牽扯到寄存器 在Smali 中 會有兩個表示方法 p 與 v 如果是invoke-virtual 表示調用的是instant 的 method 第一個register p0 會放 this 接下來會放 v0~vn 的參數
const v0, 0x7f0801d4
invoke-virtual {p0, v0}, Lcom/example/simpleapp/MainActivity;->findViewById(I)Landroid/view/View;
如果是靜態方法的話
const/4 v0, 0x1
const/4 v1, 0x2
invoke-static {v0, v1}, Lcom/example/simpleapp/MainActivity$calculator;->add(II)I
以上是基本Smali 介紹 之後如果有Patch與修改程式 都會需要從Smali下手