smali语法笔记

数据类型

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值