Android逆向學習——Smali代碼

Smali代碼的數據類型

B---byte
C---char
D---double
F---float
J---long
I---int
S---short
V---void
Z---boolean
[XXX---array
LXXX/YYY---object
L代表這個數據類型是一個類,如
Ljava/lang/String代表一個String類

Smali的函數定義

Func-Name (Para-Type1Para-Type2Para-Type3...) Return-Type
例子:
1)Hello()V
void Hello();
2)Hello(IIC)V
void Hello(int,int,char);
3)Hello(Z[S[ILjava/Lang/String;[[J)Ljava/Lang/String
String Hello(boolean,short,int,String,long[][]);

基本語法

.field private isFlag:Z 定義變量
.method 方法
.parameter/param 方法參數(用P寄存器來代替傳入的參數)
.prologue 方法開始
.line 123 方法位於第123行
invoke-supper 調用父函數
const/height16 v0,0x7f03 把0x7f03賦值給v0
invoke-direct 調用函數
return-void 函數返回void
.end method 函數結束
new-instance 創建實例
input-object 對象賦值
iget-object 調用對象
invoke-static 調用靜態函數
.loacls 使用V類型寄存器的個數
.annotation 內部類的表示

注意以上語法中所有前面帶有"."的類型都可以理解爲註釋,在這種類型上下斷點程序是無法中斷的。
在調用函數的時候如果沒有static關鍵字,p0都代表this指針。
使用put的賦值順序是從左向右,而使用get語法的賦值是從右向左。
條件跳轉

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_**

其他的方法可以使用AndroidKiller進行學習,只要將鼠標懸停在對應的Smali彙編上就可以看到具體的含義。
寄存器
本地寄存器用V開頭數字結尾,如v0、v1等,參數寄存器則使用p開頭,如p0、p1等。特別注意p0不一定是第一個參數。在非靜態函數中p0代表this。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章