您的位置:首页 > 编程语言 > Java开发

用smali写一个java加法程序和HelloWorld程序

2017-05-20 11:26 399 查看
最近看完丰虫大大的《Android软件安全与逆向分析》前三章,自己动手用smali写一个java加法程序和HelloWorld程序,也算对前期学习的一个总结。

1.java加法程序:

首先搭建好类文件的框架:

.class public Ltest2;
.super Ljava/lang/Object;
.source "test2.java"
# direct methods
.method public constructor <init>()V
.registers 1
.prologue
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static main([Ljava/lang/String;)V
.registers 5
.prologue

return-void
.end method


注意:return-void这行不要忘记写,否则之后把smali文件转换成dex文件时会报错。

之后添加main()方法的功能:

.method public static main([Ljava/lang/String;)V
.registers 5
.prologue
#V0 V1 清零
const/4 v0, 0x0
const/4 v1, 0x1
#接收传进来的2个参数
aget-object v0, p0, v0
aget-object v1, p0, v1
#把第一个参数转化成int类型,值存给vo
invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I
move-result v0
#把第二个参数转化成int类型,值存给v1
invoke-static {v1}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I
move-result v1
#两个参数相加,值存给vo
add-int/2addr v0, v1
#把vo中的结果转化成String类型,值存给vo
invoke-static {v0}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v0
#构造一个StringBuilder类型对象的新实例 把值赋给v2
new-instance v2, Ljava/lang/StringBuilder;
#调用实例的直接方法
invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V
#定义一个字符串常量
const-string v3, "The Sum is :"
#调用实例方法,把v3与v2里的字符串相加再给v2
invoke-virtual{v2,v3},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v2
#调用实例方法,把v0与v2里的字符串相加再给v2
invoke-virtual{v2,v0},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v2
invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v2
#赋给v1值System.out
sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
#输出结果
invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void
.end method


保存后,将其转换为dex文件:



导入Android设备:



最后,运行.dex文件:



可以看到:向main()方法输入两个参数5、5,最后得到结果10。

2.HelloWorld程序:这个程序功能非常简单,就是输出“HelloWorld”字符串。

首先建立类文件基本框架:

.class public LHelloWorld;
.super Ljava/lang/Object;
.source "HelloWorld.java"
.method public constructor <init>()V
.registers 1
.prologue
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static main([Ljava/lang/String;)V
.registers 4
.prologue

.end method


然后完善main()方法的功能:

.method public static main([Ljava/lang/String;)V
.registers 4
.prologue
nop
const/4 v0,0x0
const/4 v1,0x1
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello World"
invoke-virtual{v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void
.end method


将.smali文件转换为.dex文件:



将.dex文件导入Android手机:



运行.dex文件:



这样,所有步骤就都完成了,需要注意的是,向Android设备中导入文件,需要获得所操作文件夹的读写权限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android
相关文章推荐