在開始逆向開發之前,先給大家介紹幾個概念
什麼是smali語言? smali語言是是Dalvik的反彙編語言,是最終虛擬機識別的語言。也就是說無論App怎麼混淆,怎麼加密,smali語言都是不能改變的,我們可以改smali從而實現改源碼的功能!
下面給大家介紹一下Smali的基本語法:
Smali JAVA
V void
Z boolean
B byte
S short
C char
I int
J long
F float
D double
引用類型
L 對象
[ 數組
語法:
.field 定義變量
.method 方法
.parameter 方法參數
.prologue 方法開始
.line 12 此方法位於第12行
invoke-super 調用父函數
const/high16 v0, 0x7fo3 把0x7fo3賦值給v0
invoke-direct 調用函數
return-void 函數返回void
.end method 函數結束
new-instance 創建實例
iput-object 對象賦值
iget-object 調用對象
invoke-static 調用靜態函數
smali跳轉語句
“if-eq vA, vB, :cond_**” 如果vA等於vB則跳轉到:cond_**
“if-ne vA, vB, :cond_**” 如果vA不等於vB則跳轉到:cond_**
“if-lt 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-ltz 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_**
DEMO:
java代碼
private boolean show(){
boolean tempFlag = ((3-2)==1)? true : false;
if (tempFlag) {
return true;
}else{
return false;
}
}
轉換smali代碼
.method private show()Z
.locals 2
.prologue //方法開始
.line 22
const/4 v0, 0x1 // v0賦值爲1
.line 24
.local v0, tempFlag:Z
if-eqz v0, :cond_0 // 判斷v0是否等於0, 不符合條件向下走, 符合條件執行cond_0分支
.line 25
const/4 v1, 0x1 // 符合條件分支
.line 27
:goto_0
return v1
:cond_0
const/4 v1, 0x0 // cond_0分支
goto :goto_0
.end method