移动智能终端安全
(作者:Baron_wu 禁止转载) | |
---|---|
**
一、 实验内容
- 编写smali文件,输出HelloXidian
- 编写smali文件,计算(7+5)*(7-5)
二、相关原理与知识
Smali文件编写原理:
文件头
.class <访问权限> [修饰关键字] <类名>
.super <父类名>
.source <源文件名>
上面的<访问权限>指类访问权限修饰符,<修饰关键字>是Dalvik字节码的一种约定,具体约定如下:
Dalvik字节码有两种类型,原始类型和引用类型,同时引用类型又包括对象和数组。
对于数组类型,则使用 [ 和上面的类型进行组合,比如下面
//int数组 int[]
[I
//String数组 String[]
[L java/lang/String
方法
#表示之后的内容为注释,是apktool为我们添加的
.line n 表示该内容在源码中的行数
.method和.end method 表示一个方法的开始和结束
方法又分为direct methods和virtual methods两种。
direct methods的声明格式为
.method <访问权限> [修饰关键字] <方法原型>
.locals <局部变量个数>
.param <方法的参数>
.prologue
.line
.end method
上面的<方法原型>包括方法的名称、参数和返回值(这里的返回值形式为类型的首字母大写[V表示void])。
上面的.prologue表示代码的开始。
成员变量
除了方法,还有成员变量,成员变量又分为静态成员变量和实例变量。
静态成员变量的声明格式
#static fields
.field private static count:I
.field <访问权限> static [修饰关键字] <字段名>:<字段类型>
实例成员变量的声明格式
#instance fields
.field private name:Ljava/lang/String;
.field <访问权限> [修饰关键字] <字段名>:<字段类型>
接口
接口的格式
.implements <接口名>
注解
注解的格式
.annotation [注解属性] <注解类名>
[注解字段 = 值]
.end annotation
Smali文件的编译与执行过程:
编译 smali 程序
将 .smali 文件编译为 .dex 文件:
java –jar smali.jar –o classes.dex Hello.smali
执行 smali 程序
打开虚拟机环境;
adb push Hello.zip /data/local
adb shell dalvikvm –cp /data/local/Hello.zip HelloXidian
java代码转smali代码原理:
把java代码转成smali代码共需要以下三个步骤
1、编译java代码为class文件:
javac -source 1.6 -target 1.6 (dex不支持jdk8)
2、把class文件转成dex文件
我们知道apk包里java代码最后生成的是class.dex文件,把class转化成dex文件就需要用到androi