Dalvik指令集练习(smali文件的编写)

本文介绍了如何编写和执行Dalvik虚拟机的smali文件,涉及HelloXidian和数学运算的smali代码示例。内容包括smali文件结构、Dalvik指令集、编译及执行过程,以及Java到smali的转换步骤。
摘要由CSDN通过智能技术生成

移动智能终端安全

(作者: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值