Android逆向之smali語法寶典

前言

Android采用的是java語言進(jìn)行開發(fā),但是Android系統(tǒng)有自己的虛擬機(jī)Dalvik和ART,代碼編譯最終不是采用的java的class,而是使用的smali吃溅。我們反編譯得到的代碼蠢莺,jar的話可能很多地方無法正確的解釋出來,如果我們反編譯的是smali則可以正確的理解程序的意思蝇闭。因此呻率,我們有必要熟悉smali語法。

關(guān)鍵字

.field private isFlag:z --- 定義變量
.method --- 方法
.parameter --- 方法參數(shù)
.prologue --- 方法開始
.line 12 --- 此方法位于第12行
invoke-super --- 調(diào)用父函數(shù)
const/high16 v0, 0x7fo3 --- 把0x7fo3賦值給v0
invoke-direct --- 調(diào)用函數(shù)
return-void --- 函數(shù)返回void
.end method --- 函數(shù)結(jié)束
new-instance --- 創(chuàng)建實(shí)例
iput-object --- 對(duì)象賦值
iget-object --- 調(diào)用對(duì)象
invoke-static --- 調(diào)用靜態(tài)函數(shù)

數(shù)據(jù)類型

java里面包含兩種數(shù)據(jù)類型呻引,基本數(shù)據(jù)類型和引用類型(包括對(duì)象)礼仗,同時(shí)映射到smali也是有這兩大類型。

基本數(shù)據(jù)類型

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

對(duì)象類型

  • Lxxx/yyy/zzz; --- object

L表示這是一個(gè)對(duì)象類型
xxx/yyy是該對(duì)象所在的包
zzz是對(duì)象名稱
;標(biāo)識(shí)對(duì)象名稱的結(jié)束

數(shù)組類型

  • [XXX --- array

[I表示一個(gè)int型的一維數(shù)組,相當(dāng)于int[]
增加一個(gè)維度增加一個(gè)[元践,如[[I表示int[][]
數(shù)組每一個(gè)維度最多255個(gè);
對(duì)象數(shù)組表示也是類似韭脊,如String數(shù)組的表示是[Ljava/lang/String

寄存器與變量

java中變量都是存放在內(nèi)存中的,android為了提高性能单旁,變量都是存放在寄存器中的沪羔,寄存器為32位,可以支持任何類型象浑,其中l(wèi)ong和double是64為的蔫饰,需要使用兩個(gè)寄存器保存。
寄存器采用v和p來命名
v表示本地寄存器愉豺,p表示參數(shù)寄存器篓吁,關(guān)系如下
如果一個(gè)方法有兩個(gè)本地變量,有三個(gè)參數(shù)

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

當(dāng)然蚪拦,如果是靜態(tài)方法的話就只有5個(gè)寄存器了杖剪,不需要存this了。
.registers使用這個(gè)指令指定方法中寄存器的總數(shù)
.locals使用這個(gè)指定表明方法中非參寄存器的總數(shù)驰贷,放在方法的第一行盛嘿。

方法和字段

方法簽名
methodName(III)Lpackage/name/ObjectName;
如果做過ndk開發(fā)的對(duì)于這樣的簽名應(yīng)該很熟悉的,就是這樣來標(biāo)識(shí)一個(gè)方法的括袒。上面methodName標(biāo)識(shí)方法名次兆,III表示三個(gè)整形參數(shù),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;
即表示: 包名类垦,字段名和各字段類型

方法的定義
比如下面的一個(gè)方法

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

使用編譯后是這樣

.method private static sum(II)I
    .locals 4   #表示需要申請(qǐng)4個(gè)本地寄存器
    .parameter
    .parameter #這里表示有兩個(gè)參數(shù)
    .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

從上面可以看到函數(shù)聲明使用.method開始 .end method結(jié)束,java中的關(guān)鍵詞private,static 等都可以使用城须,同時(shí)使用簽名來表示唯一的方法蚤认,這里是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

指令執(zhí)行

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

條件跳轉(zhuǎn)分支

"if-eq vA, vB, :cond_x" --- 如果vA等于vB則跳轉(zhuǎn)到:cond_x
"if-ne vA, vB, :cond_x" --- 如果vA不等于vB則跳轉(zhuǎn)到:cond_x
"if-lt vA, vB, :cond_x" --- 如果vA小于vB則跳轉(zhuǎn)到:cond_x
"if-ge vA, vB, :cond_x" --- 如果vA大于等于vB則跳轉(zhuǎn)到:cond_x
"if-gt vA, vB, :cond_x" --- 如果vA大于vB則跳轉(zhuǎn)到:cond_x
"if-le vA, vB, :cond_x" --- 如果vA小于等于vB則跳轉(zhuǎn)到:cond_x
"if-eqz vA, :cond_x" --- 如果vA等于0則跳轉(zhuǎn)到:cond_x
"if-nez vA, :cond_x" --- 如果vA不等于0則跳轉(zhuǎn)到:cond_x
"if-ltz vA, :cond_x" --- 如果vA小于0則跳轉(zhuǎn)到:cond_x
"if-gez vA, :cond_x" --- 如果vA大于等于0則跳轉(zhuǎn)到:cond_x
"if-gtz vA, :cond_x" --- 如果vA大于0則跳轉(zhuǎn)到:cond_x
"if-lez vA, :cond_x" --- 如果vA小于等于0則跳轉(zhuǎn)到: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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末褥蚯,一起剝皮案震驚了整個(gè)濱河市挚冤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赞庶,老刑警劉巖训挡,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澳骤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡澜薄,警方通過查閱死者的電腦和手機(jī)为肮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肤京,“玉大人颊艳,你說我怎么就攤上這事⊥郑” “怎么了棋枕?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饭庞。 經(jīng)常有香客問我戒悠,道長(zhǎng),這世上最難降的妖魔是什么舟山? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮卤恳,結(jié)果婚禮上累盗,老公的妹妹穿的比我還像新娘。我一直安慰自己突琳,他們只是感情好若债,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拆融,像睡著了一般蠢琳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镜豹,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天傲须,我揣著相機(jī)與錄音,去河邊找鬼趟脂。 笑死泰讽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昔期。 我是一名探鬼主播已卸,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼硼一!你這毒婦竟也來了累澡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤般贼,失蹤者是張志新(化名)和其女友劉穎愧哟,沒想到半個(gè)月后惑申,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翅雏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年圈驼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片望几。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绩脆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橄抹,到底是詐尸還是另有隱情靴迫,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布楼誓,位于F島的核電站玉锌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏疟羹。R本人自食惡果不足惜主守,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望榄融。 院中可真熱鬧参淫,春花似錦、人聲如沸愧杯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽力九。三九已至耍铜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跌前,已是汗流浹背棕兼。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舒萎,地道東北人程储。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像臂寝,于是被迫代替她去往敵國(guó)和親章鲤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容