返回列表 发新帖

【图文教程】教你读懂Smali代码

    [复制链接]

319

主题

4374

回帖

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
120398
好评
1132
信誉
201

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

QQ
发表于 2018-5-1 20:55:20 | 显示全部楼层 | 阅读模式  来自 江苏
看这系列文章的前提:
懂Java!懂Java!懂Java!
网上关于Java的教程非常多!
不懂完全可以去自学!

Smali实质上就是Java字节码,一句Java代码会对应多句Smali代码(如果你不知道什么是字节码,那汇编总听过吧,两者有点类似,要是汇编也没听过,emmmm。。自个百度去)

例如最简单的Java代码:
System.out.println("Hello World");

把它写成Smali大概就是:
# 获取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代码会分解成几句较为复杂的Smali代码,你可能会问为什么搞这么复杂啊?因为Java是给人看的,Smali是给虚拟机执行的。

就像你叫一个人走过来,正常人他可以直接走过来,但如果是机器人,你就得告诉它先跨左脚,角度多少,然后右脚抬起后脚跟,重心往前......最后走完多少步停下,如果遇到转弯或者障碍的话就更复杂了。

没错教机器做事就是得这么麻烦,所以同理Smali也是在和机器对话,就比较麻烦。

好了开始正题。



Smali文件格式

在你可以在一个xxx.java中定义多个类(包括匿名内部类),但一个smali文件只能定义一个类,一般格式是:

.class 修饰符 类名
.super 父类的类名
.source 源文件名

{实现的接口}

{注解列表}

{字段列表}

{方法列表}

1、其中修饰符就是public、private、protected、static、final等,和Java中的差不多,另外对于类还有interface和enum来表示这个类是一个接口或者枚举类;

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

3、源文件名就是编译这个类的java文件名,如Main.java,仅用于debug删了也没影响;

4、接口的语法是:
.implements 接口类名
可以有0个或者多个,表示这个类实现了哪些接口;

5、注解的话就是Java代码中@XXX之类的代码,例如比较常见的@Override、@Nullable、@NonNull,它的Smali语法是:
.annotation xxxxxxx
    xxxxxx
.end annotation
如果你不知道注解是干嘛用的也没关系,反正一般情况也用不上,只要在Smali中看到annotation时知道它是注解就行了;

6、字段就是field,方法就是method,下次会详细讲讲。

这篇文章只是简单地开个头,让大家初步了解下Smali,后面我会慢慢介绍更多知识。

教你读懂Smali代码(二)
已有7人评分好评 金币 理由
dark under ligh + 1
306320779 + 1 + 1
负号 + 1 很给力!
ღ·睡。¸醒了 + 1 + 1
INT3 + 1 赞一个!
慕夜 + 1 赞一个!
CaliXz + 1 + 1 可爱的你

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

回复

使用道具 举报

37

主题

2348

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
2788
好评
31
信誉
101

MT论坛大神2018国庆快乐考神

发表于 2018-5-1 21:04:17 来自手机  | 显示全部楼层  来自 四川
顶大佬,学习了,要想用好mt管理器,这才是最基本的东西,光会改,不懂其中的意思,要绕太多的弯路了。
回复

使用道具 举报

4

主题

2378

回帖

6863

积分

硕士生

Rank: 6Rank: 6

金币
3507
好评
10
信誉
100

MT论坛帅哥考神

QQ
发表于 2018-5-1 21:15:12 来自手机  | 显示全部楼层  来自 江苏
坐等接下来的教程
回复

使用道具 举报

7

主题

239

回帖

1253

积分

高中生

Rank: 4

金币
548
好评
0
信誉
100
发表于 2018-5-1 23:20:45 来自手机  | 显示全部楼层  来自 广东
一个类中可以含有属性和方法,或许还有内部类,但是字段是什么来的?是内部类?还是属性?还是方法?
回复

使用道具 举报

48

主题

907

回帖

3348

积分

大学生

Rank: 5Rank: 5

金币
298
好评
21
信誉
100
发表于 2018-5-1 23:39:05 来自手机  | 显示全部楼层  来自 云南
其实有修改就有防修改,一些开发者也应该感到欣慰的,发现了自己的漏洞,怎么去防止,然而我们的爱好就是去找漏洞,这样互相才会有进步
回复

使用道具 举报

319

主题

4374

回帖

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
120398
好评
1132
信誉
201

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

QQ
发表于 2018-5-1 23:45:00 来自手机  | 显示全部楼层  来自 江苏
I_NV 发表于 2018-5-1 23:20
一个类中可以含有属性和方法,或许还有内部类,但是字段是什么来的?是内部类?还是属性?还是方法? ...

字段就是属性,有多种说法
回复

使用道具 举报

319

主题

4374

回帖

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
120398
好评
1132
信誉
201

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

QQ
发表于 2018-5-1 23:46:20 来自手机  | 显示全部楼层  来自 江苏
I_NV 发表于 2018-5-1 23:20
一个类中可以含有属性和方法,或许还有内部类,但是字段是什么来的?是内部类?还是属性?还是方法? ...

内部类在编译之后是一个独立的类,不属于原先那个类,不过持有它的引用
回复

使用道具 举报

1

主题

22

回帖

96

积分

小学生

Rank: 2

金币
72
好评
0
信誉
100
发表于 2018-5-1 23:57:04 来自手机  | 显示全部楼层  来自 山西
想学java但是不知道从何学起,朋友说没有java基础就别学了,可是我又很想学习,大家都说逻辑思维和英语在编程中很重要。我现在很困惑。忘林哥指导一下。
回复

使用道具 举报

48

主题

907

回帖

3348

积分

大学生

Rank: 5Rank: 5

金币
298
好评
21
信誉
100
发表于 2018-5-2 00:05:09 来自手机  | 显示全部楼层  来自 云南
༓̦̒༓̦久念 发表于 2018-5-1 23:57
想学java但是不知道从何学起,朋友说没有java基础就别学了,可是我又很想学习,大家都说逻辑思维和英语在编 ...

分享给你个吧,希望你能好好学,视频教学的,java的老师讲得贴别好,为了学mt的基础,斑猪不要在意啊https://pan.baidu.com/s/1NC583MglhGOUN6t94JeVNg
回复

使用道具 举报

1

主题

22

回帖

96

积分

小学生

Rank: 2

金币
72
好评
0
信誉
100
发表于 2018-5-2 00:09:03 来自手机  | 显示全部楼层  来自 山西
13170553007 发表于 2018-5-2 00:05
分享给你个吧,希望你能好好学,视频教学的,java的老师讲得贴别好,为了学mt的基础,斑猪不要在意啊http ...

我属于0基础那种
回复

使用道具 举报

48

主题

907

回帖

3348

积分

大学生

Rank: 5Rank: 5

金币
298
好评
21
信誉
100
发表于 2018-5-2 00:11:25 来自手机  | 显示全部楼层  来自 云南
༓̦̒༓̦久念 发表于 2018-5-2 00:09
我属于0基础那种

一看就懂,只要你认真学,很容易懂的,我是没时间精力
回复

使用道具 举报

319

主题

4374

回帖

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
120398
好评
1132
信誉
201

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

QQ
发表于 2018-5-2 00:11:44 来自手机  | 显示全部楼层  来自 江苏
༓̦̒༓̦久念 发表于 2018-5-1 23:57
想学java但是不知道从何学起,朋友说没有java基础就别学了,可是我又很想学习,大家都说逻辑思维和英语在编 ...

你朋友说没有基础就别学?他娘胎出来就有基础??逻辑思维比较重要,英语其实影响不大,因为也就那几个单词多写写就记住了。教程你可以去慕课网看看视频
回复

使用道具 举报

1

主题

22

回帖

96

积分

小学生

Rank: 2

金币
72
好评
0
信誉
100
发表于 2018-5-2 00:23:55 来自手机  | 显示全部楼层  来自 山西
Bin 发表于 2018-5-2 00:11
你朋友说没有基础就别学?他娘胎出来就有基础??逻辑思维比较重要,英语其实影响不大,因为也就那几个单 ...

那逻辑思维包括?
回复

使用道具 举报

319

主题

4374

回帖

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
120398
好评
1132
信誉
201

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

QQ
发表于 2018-5-2 00:33:39 来自手机  | 显示全部楼层  来自 江苏
༓̦̒༓̦久念 发表于 2018-5-2 00:23
那逻辑思维包括?

代码写多了就会了
回复

使用道具 举报

1

主题

22

回帖

96

积分

小学生

Rank: 2

金币
72
好评
0
信誉
100
发表于 2018-5-2 00:35:54 来自手机  | 显示全部楼层  来自 山西
Bin 发表于 2018-5-2 00:33
代码写多了就会了

好的,多谢林哥的讲解!
回复

使用道具 举报

发表回复

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

本版积分规则

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