0x4.smali語法介紹

0x4.smali語法介紹


本文主要從理論上介紹一下smali語法,以及smali語法的關(guān)鍵指令、smali語法的基本分析思路。提綱如下:

先附上smali語法的中文文檔,https://pan.baidu.com/s/1kWUahN5  密碼: mghq
接下來我們逐一進(jìn)行介紹:

0x1.smali是什么
apk文件通過Android Killer反編譯后,java會(huì)被轉(zhuǎn)化為smali存放在smali文件夾。
smali語言是Davlik的寄存器語言,語法上和匯編語言相似,smali語言基于寄存器,在smali里的所有操作都必須經(jīng)過寄存器來進(jìn)行。 

0x2.關(guān)鍵指令
在我看來,smali的關(guān)鍵指令有三個(gè),分別是 const、if、invoke。
(各指令均可在文章開篇共享的中文文檔中找到,下面只做簡(jiǎn)單介紹,具體請(qǐng)參考文檔)

2.1  const語句
const是常量的意思,所以const語句通常用來將常量的存入寄存器,我們可以理解為賦值。
- 如果是存入整型數(shù)據(jù),則使用 const v0,10
    此處v0為寄存器,也可以將數(shù)據(jù)存放于其他寄存器,10為整數(shù)型數(shù)據(jù)。
- 如果是存入字符串?dāng)?shù)據(jù),則使用 const v1,“smali”
    此處v1為寄存器,“smali”為字符串?dāng)?shù)據(jù)。

2.2  if語句
if是如果的意思,所以它是一個(gè)判斷語句,這是在smali中使用最多的一個(gè)判斷語句,被廣泛運(yùn)用在判斷及循環(huán)等情景中。

2.2.1  if-eq語句
這里eq的意思是equal,也就是相等的意思。
比如判斷兩個(gè)寄存器中的值,if-eq v0,v1 :cond 1
這句的意思是,如果v0等于v1,則跳轉(zhuǎn)到cond 1,否則繼續(xù)往下執(zhí)行。

2.2.2  if-ne語句
知道了eq的意思,那么ne的意思也就明白了,是not equal的意思,也就是不相等。
例句 if-ne v0,v1 :cond 1
含義請(qǐng)大家自己理解。

2.2.3  if-eqz語句
此處eqz的意思為 equal zero,就是說等于零。
例句 if-eqz v0 :cond 1
這句的意思是,如果v0等于0,則跳轉(zhuǎn)到cond 1,否則繼續(xù)往下執(zhí)行。

2.2.4  if-nez語句
nez的意思我們可以很容易的得出是not equal zero,不等于零。
例句 if-nez v0 :cond 1
含義請(qǐng)大家自己理解。

2.3  invoke語句
invoke是調(diào)用的意思,主要用于函數(shù)的調(diào)用。這里介紹兩種,invoke-direct 和 invoke-virtual。

2.3.1 invoke-direct   不解析直接調(diào)用帶參數(shù)的方法。
2.3.2 invoke-virtual   調(diào)用帶參數(shù)的虛擬方法 。



請(qǐng)結(jié)合smali中文文檔理解各種調(diào)用的含義。

0x3.邏輯分析
常用在邏輯分析中的語句為if語句和goto(直接跳轉(zhuǎn))語句。此處我們以實(shí)例來講解:



如圖所示,在判斷v0是否等于0之后會(huì)進(jìn)行跳轉(zhuǎn),我們可以根據(jù)情況修改v0或者改變判斷函數(shù),
比如在判斷前 const v0,0    或者  將判斷變更為 if-nez    亦或者直接進(jìn)行g(shù)oto直接跳轉(zhuǎn)。

----------請(qǐng)大家在實(shí)際的smali分析中,多分析實(shí)際語句含義和邏輯,不要只是看,邏輯理清楚后,我們才能更清晰的去破解實(shí)現(xiàn)我們需要的功能。

?