Android工程師,如何簡單高效的學會smali語法

注意:本篇是一個以方法論為導向的文章。

Q1:Smali是什么。

Smali是一種寬松式的Jasmin/dedexer語法.

簡單來說就是我們用java寫的代碼編譯成class打包成dex文件后使用baksmali程序逆向回來的一種語法。

Q2:為什么要學習Smali。
首先,提到smali就不得不說逆向。早在還沒有android之前,各大平臺和語言上就有對應的逆向一說。那么到目前為止,逆向一個apk通常是安全工程師(逆向工程師)和做破解等惡意分子因為某些利益在做(apk二次打包插入廣告、破解收費應用、惡意代碼植入、剽竊api等)。

技術是一把雙刃劍,怎么用在人。而不在技術本身上。那么我們說為什么應用層開發者也要學smali呢?我能想到以下幾點供參考。

1.借鑒 當我們發現其他應用有一個很牛逼功能,而我們想不明白如何實現的時候。拿不到源碼可以選擇逆向。
2.安全 我們寫的app需要考慮安全性,但是我們可能只知道混淆和第三方加固,需要明白別人是怎么破解我們的應用。
3.適配 當我們發現api在某些手機上被棄用,而其他應用或系統應用又能實現該功能的時候。關于這點我之前寫過一篇逆向小米做適配的文章

喂,差不多夠了吧?還不能打動你學嗎?給你升職加薪怎么樣? :)

噗,壞蛋!!!,我學 我學,還不行嗎?

Q3:Smali難不難?
不難。也許你很早之前看過一些文章。或者也常用一些工具去打開反編譯后的代碼。看著一團麻的指令和一些你從未見過的關鍵字、代碼格式風格,賴不住性子就潦草的關掉了。但實際上是你沒有找對方法來學習它。

Q4:怎么學
我一向的風格都是不愛把知識生拉硬套的往腦子里塞,我更加習慣從實踐中去分析,而后反過來做總結。現在給大家推薦一款好用的Smali學習工具插件。我們打開AndroidStudio找到插件安裝的位置。如下圖


打開 Browse Repositories,輸入java2smali安裝重啟即可。


github地址在這里:intellij-java2smali

這個步驟以后,我們就可以愉快的將任何java代碼在androidStudio中直接轉換成smali來學習里。步驟如下。
1.編寫一個最簡單的java文件。比如下面這樣的。

然后我們點擊Build->Compile to smali

稍等幾秒鐘后就會得到smali文件。

接下來我們就可以對照著java代碼來逐行分析這個smali文件。如果是第一次看我們可能會被一些沒見過關鍵字干擾到。其實這里有個很簡單的辦法。注意.line關鍵字就是用來描述當前代碼在java源文件中的行數。然后你可以通過對照兩組代碼的方法進行反推。這樣就可以很輕松的學會看smali文件。

好下面是一個示例代碼,供參考。

示例代碼:

原java代碼

    public AA methodAReturn(AA mAA, AA sAA) {
        return mAA;
    }
AA aa= new AA();
//調用
  methodAReturn(aa, aa);

Smali代碼

.method public methodAReturn(Lcom/bolex/AA;Lcom/bolex/AA;)Lcom/bolex/AA;
    .registers 3
    .param p1, "mAA"    # Lcom/bolex/AA;
    .param p2, "sAA"    # Lcom/bolex/AA;

    .prologue
    .line 34
    return-object p1
.end method

  .line 21
    new-instance v0, Lcom/bolex/AA;
    invoke-direct {v0}, Lcom/bolex/AA;-><init>()V
    .line 22
    invoke-virtual {p0, v0, v0}, Lcom/bolex/seamAct;->methodAReturn(Lcom/bolex/AA;Lcom/bolex/AA;)Lcom/bolex/AA;

.line

  .line 34

表示當前代碼在源java文件中的行數。

method

.method public methodAReturn(Lcom/bolex/AA;Lcom/bolex/AA;)Lcom/bolex/AA;

表示來自公共方法methodAReturn返回值是一個對象com.bolex.AA

registers

.registers 3

表示該函數上需要使用3個寄存器

param

    .param p1, "mAA"    # Lcom/bolex/AA;
    .param p2, "sAA"    # Lcom/bolex/AA;

表示接收兩個入參都是AA對象,并標記寄存器p1和p2

.prologue

    .prologue

表示函數內執行的起始標記。直譯為開場白的意思。

.line

   .line 34

表示在源代碼中的第34行。

return-object

  return-object p1

表示 返回寄存器上p1對象

.end method

.end method

表示函數結束標記

new-instance

 new-instance v0, Lcom/bolex/AA;

創建一個AA對象

invoke-direct

 invoke-direct {v0}, Lcom/bolex/AA;-><init>()V

表示使用無參構造方法直接調用

invoke-virtual

 invoke-virtual {p0, v0, v0}, Lcom/bolex/seamAct;->methodAReturn(Lcom/bolex/AA;Lcom/bolex/AA;)Lcom/bolex/AA;

表示為虛擬方法


就是這個樣子的,有沒有很簡單呢?

以上只舉例了部分關鍵字,更多的關鍵字可以自行依賴兩組文件反推。其實有時候更加講究的是一個方法。我覺得這個方法就挺不錯的,所以就分享給大家咯,咱也不需要刻意去背下來。熟能生巧,玩多了豈能不是老司機?

關于smali的知識還有很多本文并未詳細闡述,如寄存器、類型(原始類型、對象類型)、數組方法的表示形式。如讀者還需要進一步深入挖。可以參考官方文檔。里面有詳細的解釋,已翻譯成中文版了。
https://source.android.com/devices/tech/dalvik/dex-format


如何下次找到我?

本文首發香脆的大雞排 原創文章轉載請先取得聯系。

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

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,576評論 25 707
  • 今天來介紹有關Davilk虛擬機相關的知識,首先便是介紹我們最關心的Davilk字節碼相關知識,進而深入到Andr...
    涅槃1992閱讀 3,358評論 1 22
  • 曾經的繁花似錦,如今的浮華一夢。 年少輕狂許下的豪言壯語,在一次次任性的決定后顯得蒼白無力,我從不后悔自己的決定,...
    烏木momo閱讀 476評論 0 1
  • 取燈棍,就是火柴,也叫洋火。 火柴漸漸淡出人們的生活,可它帶來的快樂與記憶卻難以磨滅。 兒時,是個物質匱乏的年代,...
    老牛321閱讀 378評論 0 1
  • 在新聞聯播里看到了河長制,知道每條河現在都有河長了,有問題可以直接找河長處理。 我就想找河長,因為我們門口的河出現...
    開心的靈通閱讀 1,295評論 5 0