smali语法

基本类型

在Java中类型分为基本类型和引用类型,基本类型有九个

JavaSmail
voidV
booleanZ
byteB
shortS
charC
intI
longJ
floatF
doubleD
.field private isFlag:z  定义变量
.method  方法
.parameter方法参数
.prologue  方法开始
.line 12  此方法位于第12行
invoke-super  调用父函数
const/high16 v0, 0x7fo3  把0x7fo3赋值给v0
invoke-direct  调用函数
return-void  函数返回void
.end method  函数结束
new-instance  创建实例
iput-object  对象赋值
iget-object调用对象
invoke-static调用静态函数
.annotation注释
.end annotation注释结束

引用类型

在Smail语法中,引用类型都是通过L包名路径/类名来表示

例如Android中的TextView类,它的包名是android.widget,如果你要在Smali中表示这个类,就要写成Landroid/widget/TextView;

Smali中通过在类型前面加[来表示该类型的数组,例如[I表示int[],[Ljava/lang/String;表示String[],如果要表示多维数组,只需要增加[的数量,例如[[I表示二维数组int[][]

方法

Smail定义方法语法:

.method 描述符 方法名(参数类型)返回类型
   方法逻辑代码
.end method

其中参数类型可以有0个或多个,返回类型必须是一个,当要表达多个参数类型时,只需简单地将它们连接到一起,例如 (int, int, String) 表示为 (IILjava/lang/String;)

调用方法

Smali中必须以非常详细的形式指定要调用的方法,包括类名、方法名、参数类型和返回类型,其具体形式是:类名->方法名(参数类型)返回类型
例如
System.out.println("Hello world");其中outSystem的一个静态字段,它的类型是PrintStreamprintlnPrintStream中的一个方法,所以这条打印语句最终smail语法为

# 获取System类中的out字段,存到v0中
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
# 把"Hello World"存到v1中const-string v1, "Hello World"
# 调用虚方法println,传入参数v0, v1
# 相当于v0.println(v1)
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

字段

Java中,字段和属性的区别,字段1是Java类中的成员变量,用于承载数据,属性是指字

字段
.field 描述符 字段名:字段类型

例如Java代码中定义了text字段:

public String text;  

其对应的Smali代码是:

.field public text:Ljava/lang/String;  

当一个字段是static和final(即静态常量)且它的类型是基本类型时,可以直接为它赋值:
.field public static final ID:I = 0x7f0a0001

如果定义的字段包含注解,那么语法是:

.field XXXXX  
{注解列表}  
.end field

  1. 类成员/类成员变量

标签: none

添加新评论