0x4.smali語法介紹
本文主要從理論上介紹一下smali語法,以及smali語法的關(guān)鍵指令、smali語法的基本分析思路。提綱如下:
接下來我們逐一進(jìn)行介紹:
0x1.smali是什么
apk文件通過Android Killer反編譯后,java會被轉(zhuǎn)化為smali存放在smali文件夾。
smali語言是Davlik的寄存器語言,語法上和匯編語言相似,smali語言基于寄存器,在smali里的所有操作都必須經(jīng)過寄存器來進(jìn)行。
0x2.關(guān)鍵指令
在我看來,smali的關(guān)鍵指令有三個(gè),分別是 const、if、invoke。
(各指令均可在文章開篇共享的中文文檔中找到,下面只做簡單介紹,具體請參考文檔)
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
含義請大家自己理解。
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
含義請大家自己理解。
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ù)的虛擬方法 。
請結(jié)合smali中文文檔理解各種調(diào)用的含義。
0x3.邏輯分析
常用在邏輯分析中的語句為if語句和goto(直接跳轉(zhuǎn))語句。此處我們以實(shí)例來講解:
如圖所示,在判斷v0是否等于0之后會進(jìn)行跳轉(zhuǎn),我們可以根據(jù)情況修改v0或者改變判斷函數(shù),
比如在判斷前 const v0,0 或者 將判斷變更為 if-nez 亦或者直接進(jìn)行g(shù)oto直接跳轉(zhuǎn)。
----------請大家在實(shí)際的smali分析中,多分析實(shí)際語句含義和邏輯,不要只是看,邏輯理清楚后,我們才能更清晰的去破解實(shí)現(xiàn)我們需要的功能。