123下一页
返回列表 发新帖

教你读懂Smali代码(三)

    [复制链接]

319

主题

4374

回帖

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
120198
好评
1132
信誉
201

MT论坛元老MT论坛优秀教师2018MT论坛优秀成员

QQ
发表于 2018-5-6 18:06:15 | 显示全部楼层 | 阅读模式  来自 江苏
教你读懂Smali代码(二)

寄存器

相信大家在看Smali时注意到了有很多v0v1v2p0p1p2之类的标识符,这些都代表了寄存器。
那么什么是寄存器呢?你可以把它认为是变量,或者是暂时存放东西的地方。

举个例子:

有一个静态方法abc(String),如果你要在Java方法中调用这个方法,直接输入abc("Hello");就行了。

而在Smali中,你不能直接把字符串参数传递给方法,你需要一个寄存器(比如v0),先把"Hello"放到v0中,然后再调用abc方法,并告诉它你需要的参数在v0里面,自己去拿吧。

# 定义一个字符串常量"Hello"放到v0中
const-string v0, "Hello"
# 调用abc方法,需要的参数放在v0中
invoke-static {v0}, LXX;->abc(Ljava/lang/String;)V

现在大家理解什么是寄存器了吧。

另外寄存器v0v1v2后面的数字也不是随便写的,需要在方法的开头用.registers N来指定寄存器的数量,然后才可以使用寄存器v0v(N-1)

参数寄存器

上面说的都是普通寄存器vN,另外Smali还特意定义了一种参数寄存器pN,用于存放这个方法传入的参数的值。

如果一个方法有n个寄存器,有m个参数,那么n必须大于等于m,并且n个寄存器的后面m个是参数寄存器,举个例子:

某个静态方法abc(int, int, int),它一共有3个参数,如果它一共有5个寄存器(通过.registers N定义,N不能小于3)。

普通寄存器 对应参数寄存器
v0
v1
v2 p0
v3 p1
v4 p2

当我调用abc(11, 22, 33)时,p0中的值初始化为11,p1中的值初始化为22,p2中的值初始化为33,v0v1不会初始化。

普通寄存器 参数寄存器 初始化
v0
v1
v2 p0 11
v3 p1 22
v4 p2 33

当我把寄存器数量改成6(.registers 6),寄存器就会变成下表所示:

普通寄存器 参数寄存器 初始化
v0
v1
v2
v3 p0 11
v4 p1 22
v5 p2 33

思考一下,如果不使用参数寄存器,代码中全部用vN,那么改变寄存器数量后,你还得改多少代码?

隐藏的参数

对于非静态方法,它的参数寄存器数量比实际参数多了一个,p0会固定用于表示当前类实例(Java中的this),从p1开始才是真正的参数,我们可以通过Java2Smali工具来验证一下,Java代码如下:



test1()和test2()的唯一区别就是一个是静态一个非静态

test1()的Smali代码:



test2()的Smali代码:



两个方法都是依次打印出两个参数,test1()中24行是打印第一个参数用的是p0,29行是打印第二个参数用的是p1;对照下test2()中则分别用的是p1和p2。

那test2()中的p0真的代表this吗?我们也可以修改代码验证下:





到这边讲的都是基础知识,大家不懂的可以随时回复提问,下一篇开始讲代码了。

教你读懂Smali代码(四)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
已有3人评分好评 金币 理由
Yhcs57120 + 1 + 1 感谢大佬的教程!
ㅤㅤㅤㅤ51519 + 1
谁的 + 1 其实我觉得给你金币也没什么用,.

查看全部评分 总评分:好评 +3  金币 +1 

回复

使用道具 举报

48

主题

907

回帖

3348

积分

大学生

Rank: 5Rank: 5

金币
298
好评
21
信誉
100
发表于 2018-5-6 18:16:01 来自手机  | 显示全部楼层  来自 云南
抢到沙发了
回复

使用道具 举报

7

主题

239

回帖

1253

积分

高中生

Rank: 4

金币
548
好评
0
信誉
100
发表于 2018-5-6 19:00:34 来自手机  | 显示全部楼层  来自 广东
进来,点个星号,退出,一气呵成
回复

使用道具 举报

0

主题

1460

回帖

4950

积分

大学生

Rank: 5Rank: 5

金币
4967
好评
0
信誉
100

考神MT论坛最佳新人

发表于 2018-5-6 21:58:25 来自手机  | 显示全部楼层  来自 四川
进来点个赞
回复

使用道具 举报

10

主题

519

回帖

1326

积分

高中生

Rank: 4

金币
563
好评
4
信誉
100
发表于 2018-5-7 09:38:32 来自手机  | 显示全部楼层  来自 浙江
认真学习中
回复

使用道具 举报

12

主题

438

回帖

2066

积分

大学生

Rank: 5Rank: 5

金币
1399
好评
0
信誉
100
发表于 2018-5-8 14:21:40 来自手机  | 显示全部楼层  来自 广东
真好,还能学点东西
回复

使用道具 举报

0

主题

1235

回帖

3524

积分

大学生

Rank: 5Rank: 5

金币
2153
好评
0
信誉
100
发表于 2018-5-8 18:09:41 来自手机  | 显示全部楼层  来自 四川
支持老大,发扬光大,6666
回复

使用道具 举报

15

主题

5708

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
10149
好评
1
信誉
100
发表于 2018-5-9 08:33:57 来自手机  | 显示全部楼层  来自 广东
进来认真学习
回复

使用道具 举报

1

主题

2

回帖

16

积分

幼儿园

Rank: 1

金币
15
好评
0
信誉
100
QQ
发表于 2018-5-9 08:45:14 来自手机  | 显示全部楼层  来自 辽宁
带我飞吧,你的哪个大学我以前也想考!
回复

使用道具 举报

2

主题

87

回帖

536

积分

初中生

Rank: 3Rank: 3

金币
288
好评
0
信誉
100
发表于 2018-5-10 23:31:33 来自手机  | 显示全部楼层  来自 海南
好东西
回复

使用道具 举报

171

主题

3612

回帖

1万

积分

博士生

Steve2280

Rank: 7Rank: 7Rank: 7

金币
84
好评
133
信誉
167

MT论坛最佳新人2018国庆节MT论坛帅哥MT论坛新人MT论坛灌水老大考神MT论坛侠客MT论坛活跃会员

发表于 2018-5-16 21:56:30 来自手机  | 显示全部楼层  来自 四川
这,这简直太……难了,我看不懂
回复

使用道具 举报

0

主题

141

回帖

467

积分

初中生

Rank: 3Rank: 3

金币
405
好评
0
信誉
100
发表于 2018-5-18 09:29:03 来自手机  | 显示全部楼层  来自 福建
努力学习中
回复

使用道具 举报

0

主题

31

回帖

84

积分

小学生

Rank: 2

金币
66
好评
0
信誉
100
发表于 2018-6-9 23:55:57 来自手机  | 显示全部楼层  来自 湖南
收藏慢慢学习谢谢楼主。
回复

使用道具 举报

7

主题

140

回帖

411

积分

禁止发言

金币
19
好评
1
信誉
100
QQ
发表于 2018-6-15 21:20:57 来自手机  | 显示全部楼层  来自 河南
谢谢,我已经快懂了
回复

使用道具 举报

0

主题

46

回帖

327

积分

初中生

Rank: 3Rank: 3

金币
138
好评
0
信誉
100
QQ
发表于 2018-8-16 15:40:39 | 显示全部楼层  来自 广东
顶一波,学习学习。又复习了一次基础知识。emmmm
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表