数据类型
smali中数据有两种类型
原始类型和引用类型
原始类型包含8种
boolean Z
byte B
shot S
char C
int I
long J
float F
double D
还有一个特别一点的
void V
实际需要记的只有long和boolean,特别一些,分别用J和Z表示,其余的都是首字母大写
此外还需要知道long和double占用64位,需要两个寄存器储存
引用类型
[I 代表 int[]数组
[C 代表 char[]数组
依次类推
二维数组[[I代表int[][]
对象用 包名+name; 的方式表示
举个最常见的例子就是Ljava/lang/String; 代表String类型
String[]数组的表示方法就是[Ljava/lang/String;
方法表示
java代码的
Void helloWorld(int,int,String[])
在smali中对应
helloWorld(II[Ljava/lang/String;)V
函数调用
smali中函数分两种,一种是
direct method 表示 private method
另一种
virtual method 表示 proteced method,public method
调用方法
invoke-direct,invoke-virtual
此外还分static函数
调用方法
invoke-static{}
条件跳转
“if-eq VA,VB,:cond_xx “ 如果VA=VB则跳转到cond_xx
“if-ne VA,VB,:cond_xx “ 如果VA!=VB则跳转到cond_xx
“if-lt VA,VB,:cond_xx “ 如果VA<VB则跳转到cond_xx
“if-ge VA,VB,:cond_xx “ 如果VA>=VB则跳转到cond_xx
“if-gt VA,VB,:cond_xx “ 如果VA>VB则跳转到cond_xx
“if-le VA,VB,:cond_xx “ 如果VA<=VB则跳转到cond_xx
“if-eqz VA,:cond_xx “ 如果VA=0则跳转到cond_xx
“if-nez VA,:cond_xx “ 如果VA!=0则跳转到cond_xx
“if-ltz VA,:cond_xx “ 如果VA<0则跳转到cond_xx
“if-gez VA,:cond_xx “ 如果VA>=0则跳转到cond_xx
“if-gtz VA,:cond_xx “ 如果VA>0则跳转到cond_xx
“if-lez VA,:cond_xx “ 如果VA<=0则跳转到cond_xx
基本语法
示例:
.method private getMacFromFile()Ljava/lang/String;
#使用了5个本地寄存器
.locals 5
#将字符串常量"02:00:00:00:00:00"存入寄存器v0中
const-string v0, "02:00:00:00:00:00"
#处于源码第600行位置
.line 600
#java的trycatch语句
:try_start_0
#创建一个BufferedReader的对象,并将该对象的引入存入寄存器v1中
new-instance v1, Ljava/io/BufferedReader;
new-instance v2, Ljava/io/FileReader;
new-instance v3, Ljava/io/File;
const-string v4, "/sys/class/net/wlan0/address"
#调用File的构造函数 参数为v3,v4 返回void 其中v3是自身的引用
invoke-direct {v3, v4}, Ljava/io/File;-><init>(Ljava/lang/String;)V
invoke-direct {v2, v3}, Ljava/io/FileReader;-><init>(Ljava/io/File;)V
invoke-direct {v1, v2}, Ljava/io/BufferedReader;-><init>(Ljava/io/Reader;)V
#调用v1.readLine()
invoke-virtual {v1}, Ljava/io/BufferedReader;->readLine()Ljava/lang/String;
#返回值存入寄存器v0中
move-result-object v0
:try_end_0
.catch Ljava/io/IOException; {:try_start_0 .. :try_end_0} :catch_0
#无异常跳转到goto_0标签位置
goto :goto_0
#有异常
:catch_0
#将抛出的异常存入v1寄存器
move-exception v1
.line 602
#调用方法v1.printStackTrace() 返回void
invoke-virtual {v1}, Ljava/io/IOException;->printStackTrace()V
:goto_0
#函数返回v0
return-object v0
.end method