0x4.smali語法介紹
本文主要從理論上介紹一下smali語法,,以及smali語法的關(guān)鍵指令,、smali語法的基本分析思路。提綱如下:
接下來我們逐一進(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)我們需要的功能。