0x4.smali语法介绍
本文主要从理论上介绍一下smali语法,以及smali语法的关键指令、smali语法的基本分析思路。提纲如下:
接下来我们逐一进行介绍:
0x1.smali是什么
apk文件通过Android Killer反编译后,java会被转化为smali存放在smali文件夹。
smali语言是Davlik的寄存器语言,语法上和汇编语言相似,smali语言基于寄存器,在smali里的所有操作都必须经过寄存器来进行。
0x2.关键指令
在我看来,smali的关键指令有三个,分别是 const、if、invoke。
(各指令均可在文章开篇共享的中文文档中找到,下面只做简单介绍,具体请参考文档)
2.1 const语句
const是常量的意思,所以const语句通常用来将常量的存入寄存器,我们可以理解为赋值。
- 如果是存入整型数据,则使用 const v0,10
此处v0为寄存器,也可以将数据存放于其他寄存器,10为整数型数据。
- 如果是存入字符串数据,则使用 const v1,“smali”
此处v1为寄存器,“smali”为字符串数据。
2.2 if语句
if是如果的意思,所以它是一个判断语句,这是在smali中使用最多的一个判断语句,被广泛运用在判断及循环等情景中。
2.2.1 if-eq语句
这里eq的意思是equal,也就是相等的意思。
比如判断两个寄存器中的值,if-eq v0,v1 :cond 1
这句的意思是,如果v0等于v1,则跳转到cond 1,否则继续往下执行。
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,则跳转到cond 1,否则继续往下执行。
2.2.4 if-nez语句
nez的意思我们可以很容易的得出是not equal zero,不等于零。
例句 if-nez v0 :cond 1
含义请大家自己理解。
2.3 invoke语句
invoke是调用的意思,主要用于函数的调用。这里介绍两种,invoke-direct 和 invoke-virtual。
2.3.1
invoke-direct 不解析直接调用带参数的方法。
2.3.2
invoke-virtual 调用带参数的虚拟方法 。
请结合smali中文文档理解各种调用的含义。
0x3.逻辑分析
常用在逻辑分析中的语句为if语句和goto(直接跳转)语句。此处我们以实例来讲解:
如图所示,在判断v0是否等于0之后会进行跳转,我们可以根据情况修改v0或者改变判断函数,
比如在判断前 const v0,0 或者 将判断变更为 if-nez 亦或者直接进行goto直接跳转。
----------请大家在实际的smali分析中,多分析实际语句含义和逻辑,不要只是看,逻辑理清楚后,我们才能更清晰的去破解实现我们需要的功能。