Android逆向之smali語法寶典

前言

Android采用的是java語言進行開發,但是Android系統有自己的虛擬機Dalvik和ART,代碼編譯最終不是采用的java的class,而是使用的smali。我們反編譯得到的代碼,jar的話可能很多地方無法正確的解釋出來,如果我們反編譯的是smali則可以正確的理解程序的意思。因此,我們有必要熟悉smali語法。

關鍵字

.field private isFlag:z --- 定義變量
.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 --- 調用靜態函數

數據類型

java里面包含兩種數據類型,基本數據類型和引用類型(包括對象),同時映射到smali也是有這兩大類型。

基本數據類型

  • B --- byte
  • C --- char
  • D --- double (64 bits)
  • F --- float
  • I --- int
  • J --- long (64 bits)
  • S --- short
  • V --- void    只能用于返回值類型
  • Z --- boolean

對象類型

  • Lxxx/yyy/zzz; --- object

L表示這是一個對象類型
xxx/yyy是該對象所在的包
zzz是對象名稱
;標識對象名稱的結束

數組類型

  • [XXX --- array

[I表示一個int型的一維數組,相當于int[]
增加一個維度增加一個[,如[[I表示int[][]
數組每一個維度最多255個;
對象數組表示也是類似,如String數組的表示是[Ljava/lang/String

寄存器與變量

java中變量都是存放在內存中的,android為了提高性能,變量都是存放在寄存器中的,寄存器為32位,可以支持任何類型,其中long和double是64為的,需要使用兩個寄存器保存。
寄存器采用v和p來命名
v表示本地寄存器,p表示參數寄存器,關系如下
如果一個方法有兩個本地變量,有三個參數

v0第一個本地寄存器
v1第二個本地寄存器
v2 p0(this)
v3 p1第一個參數
v4 p2第二個參數
v5 p3第三個參數

當然,如果是靜態方法的話就只有5個寄存器了,不需要存this了。
.registers使用這個指令指定方法中寄存器的總數
.locals使用這個指定表明方法中非參寄存器的總數,放在方法的第一行。

方法和字段

方法簽名
methodName(III)Lpackage/name/ObjectName;
如果做過ndk開發的對于這樣的簽名應該很熟悉的,就是這樣來標識一個方法的。上面methodName標識方法名,III表示三個整形參數,Lpackage/name/ObjectName;表示返回值的類型。

方法的表示
Lpackage/name/ObjectName;——>methodName(III)Z
即 package.name.ObjectName中的 function boolean methondName(int a, int b, int c) 類似這樣子

字段的表示
Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;
即表示: 包名,字段名和各字段類型

方法的定義
比如下面的一個方法

private static int sum(int a, int b) {
        return a+b;
}

使用編譯后是這樣

.method private static sum(II)I
    .locals 4   #表示需要申請4個本地寄存器
    .parameter
    .parameter #這里表示有兩個參數
    .prologue
    .line 27 
    move v0, p0
    .local v0, a:I
    move v1, p1
    .local v1, b:I
    move v2, v0
    move v3, v1
    add-int/2addr v2, v3
    move v0, v2
    .end local v0           #a:I
    return v0
.end method

從上面可以看到函數聲明使用.method開始 .end method結束,java中的關鍵詞private,static 等都可以使用,同時使用簽名來表示唯一的方法,這里是sum(II)I。

聲明成員
.field private name:Lpackage/name/ObjectName;
比如:private TextView mTextView;表示就是
.field private mTextView:Landroid/widget/TextView;
private int mCount;
.field private mCount:I

指令執行

smali字節碼是類似于匯編的,如果你有匯編基礎,理解起來是非常容易的。
比如:
move v0, v3 #把v3寄存器的值移動到寄存器v0上.
const v0, 0x1 #把值0x1賦值到寄存器v0上。
invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I #執行方法sum(),v4,v5的值分別作為sum的參數。

條件跳轉分支

"if-eq vA, vB, :cond_x" --- 如果vA等于vB則跳轉到:cond_x
"if-ne vA, vB, :cond_x" --- 如果vA不等于vB則跳轉到:cond_x
"if-lt vA, vB, :cond_x" --- 如果vA小于vB則跳轉到:cond_x
"if-ge vA, vB, :cond_x" --- 如果vA大于等于vB則跳轉到:cond_x
"if-gt vA, vB, :cond_x" --- 如果vA大于vB則跳轉到:cond_x
"if-le vA, vB, :cond_x" --- 如果vA小于等于vB則跳轉到:cond_x
"if-eqz vA, :cond_x" --- 如果vA等于0則跳轉到:cond_x
"if-nez vA, :cond_x" --- 如果vA不等于0則跳轉到:cond_x
"if-ltz vA, :cond_x" --- 如果vA小于0則跳轉到:cond_x
"if-gez vA, :cond_x" --- 如果vA大于等于0則跳轉到:cond_x
"if-gtz vA, :cond_x" --- 如果vA大于0則跳轉到:cond_x
"if-lez vA, :cond_x" --- 如果vA小于等于0則跳轉到:cond_x

參考資料

最后附上一些參考資料:
http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
https://code.google.com/p/smali/w/list
http://blog.csdn.net/lpohvbe/article/details/7981386
http://blog.csdn.net/lpohvbe/article/details/7983907


特別感謝@Sam

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容