123下一页
返回列表 发新帖

教你读懂Smali代码(二)

    [复制链接]

319

主题

4374

回帖

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
120398
好评
1132
信誉
201

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

QQ
发表于 2018-5-1 22:20:43 | 显示全部楼层 | 阅读模式  来自 江苏
教你读懂Smali代码(一)

类型

在Java中类型分为基本类型和引用类型

基本类型共有9个,它们在Smali中的对应关系是:
Java Smali
voidV
booleanZ
byteB
shortS
charC
intI
longJ
floatF
doubleD

其中除了boolean对应Z,long对应J,其它都是对应首个字母大写,还是很好记的

对于引用类型,我在上一篇文章中也提到过,在Smali中都是用L包名路径/类名;表示,例如Android中的TextView类,它的包名是android.widget,如果你要在Smali中表示这个类,就要写成Landroid/widget/TextView;

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

方法

Smali中定义方法的语法是:
.method 描述符 方法名(参数类型)返回类型
    方法代码...
.end method

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

方法代码是最复杂的部分,将在后面的文章中慢慢介绍

调用方法

Smali中必须以非常详细的形式指定要调用的方法,包括类名、方法名、参数类型和返回类型,其具体形式是:类名->方法名(参数类型)返回类型

例如
System.out.println("Hello world");
其中outSystem的一个静态字段,它的类型是PrintStreamprintlnPrintStream中的一个方法

所以在上一篇的例子中,最后调用println方法是通过:
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
后面那部分正是方法println的完整表达形式

字段

Smali中定义方法的语法是:
.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

引用字段

和调用方法类似,在引用一个字段时,同样需要用非常详细的形式指定字段,其具体形式是:类名->字段名:字段类名

例如
System.out.println("Hello world")
在调用println方法前需要现将System类的字段out放到寄存器v0

也就是下面这句代码:
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
后面那部分正是字段out的完整表达形式

教你读懂Smali代码(三)
已有6人评分好评 金币 理由
306320779 + 1
djzhao + 1 超级棒!!
xiumao + 1
风雨入屠苏 + 1 很给力!
小小粉刷匠 + 1
玄武国首席刺客 + 1

查看全部评分 总评分:好评 +2  金币 +4 

回复

使用道具 举报

14

主题

1038

回帖

4391

积分

大学生

滑稽

Rank: 5Rank: 5

金币
1696
好评
16
信誉
112
QQ
发表于 2018-5-1 22:26:55 来自手机  | 显示全部楼层  来自 吉林–吉林
前排     
回复

使用道具 举报

7

主题

239

回帖

1253

积分

高中生

Rank: 4

金币
548
好评
0
信誉
100
发表于 2018-5-1 22:48:57 来自手机  | 显示全部楼层  来自 广东
我没学过汇编语言,smali语法和汇编很像吗?
回复

使用道具 举报

319

主题

4374

回帖

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
120398
好评
1132
信誉
201

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

QQ
发表于 2018-5-1 22:58:13 | 显示全部楼层  来自 江苏
I_NV 发表于 2018-5-1 22:48
我没学过汇编语言,smali语法和汇编很像吗?

Smali比汇编简单多了,又比Java难点,但学会Smali后对Java会有更深刻的理解
回复

使用道具 举报

48

主题

907

回帖

3348

积分

大学生

Rank: 5Rank: 5

金币
298
好评
21
信誉
100
发表于 2018-5-1 23:43:31 来自手机  | 显示全部楼层  来自 云南
地板到了该排到什么,瓷砖吗
回复

使用道具 举报

10

主题

519

回帖

1326

积分

高中生

Rank: 4

金币
563
好评
4
信誉
100
发表于 2018-5-4 21:59:21 来自手机  | 显示全部楼层  来自 浙江
找到学习的方向了
回复

使用道具 举报

1

主题

103

回帖

542

积分

初中生

Rank: 3Rank: 3

金币
284
好评
0
信誉
100
发表于 2018-5-5 22:51:16 来自手机  | 显示全部楼层  来自 重庆
收藏了,
回复

使用道具 举报

20

主题

105

回帖

311

积分

初中生

Rank: 3Rank: 3

金币
100
好评
0
信誉
100
发表于 2018-7-15 09:28:57 来自手机  | 显示全部楼层  来自 河南
哇,太diao了,可以我看不懂。
回复

使用道具 举报

0

主题

8

回帖

29

积分

小学生

Rank: 2

金币
17
好评
0
信誉
100
发表于 2018-8-2 18:06:12 | 显示全部楼层  来自 福建
楼主写的太好了~支持~顶
回复

使用道具 举报

6

主题

67

回帖

320

积分

初中生

Rank: 3Rank: 3

金币
89
好评
0
信誉
100
发表于 2018-8-9 09:54:02 来自手机  | 显示全部楼层  来自 广东
看不懂啊
回复

使用道具 举报

20

主题

1144

回帖

2577

积分

大学生

Rank: 5Rank: 5

金币
619
好评
3
信誉
100
QQ
发表于 2018-9-2 13:29:34 | 显示全部楼层  来自 河北
Bin 发表于 2018-5-1 22:58
Smali比汇编简单多了,又比Java难点,但学会Smali后对Java会有更深刻的理解

这么说来java很简单吗
回复

使用道具 举报

63

主题

3007

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4430
好评
32
信誉
104

2018国庆快乐MT论坛大神MT论坛最佳新人2018国庆节MT论坛帅哥2019-5.1节快乐考神MT论坛活跃会员MT论坛新人

发表于 2018-9-27 07:11:01 来自手机  | 显示全部楼层  来自 福建
人肉顶帖,不要让好东西沉底。
回复

使用道具 举报

5

主题

939

回帖

2264

积分

大学生

Rank: 5Rank: 5

金币
774
好评
3
信誉
101
QQ
发表于 2018-10-12 21:22:00 来自手机  | 显示全部楼层  来自 湖北
收藏学习,慢慢看
回复

使用道具 举报

0

主题

6

回帖

20

积分

小学生

Rank: 2

金币
5
好评
0
信誉
100
发表于 2018-10-31 23:27:15 | 显示全部楼层  来自 广东
真心的感谢楼主做了一个系列
回复

使用道具 举报

4

主题

785

回帖

2602

积分

禁止发言

金币
982
好评
0
信誉
101
发表于 2018-11-4 16:26:36 来自手机  | 显示全部楼层  来自 山东
谢谢楼主分享。完全不懂
回复

使用道具 举报

发表回复

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

本版积分规则

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