0x4.smali语法介绍

0x4.smali语法介绍


本文主要从理论上介绍一下smali语法,以及smali语法的关键指令、smali语法的基本分析思路。提纲如下:

先附上smali语法的中文文档,https://pan.baidu.com/s/1kWUahN5  密码: mghq
接下来我们逐一进行介绍:

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分析中,多分析实际语句含义和逻辑,不要只是看,逻辑理清楚后,我们才能更清晰的去破解实现我们需要的功能。