最近看完丰虫大大的《Android软件安全与逆向分析》前三章,自己动手用smali写一个java加法程序和HelloWorld程序,也算对前期学习的一个总结。
首先搭建好类文件的框架:
.class public Ltest2;
.super Ljava/lang/Object;
.source "test2.java"
# direct methods
.method public constructor ()V
.registers 1
.prologue
invoke-direct {p0}, Ljava/lang/Object;->()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;->()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。
首先建立类文件基本框架:
.class public LHelloWorld;
.super Ljava/lang/Object;
.source "HelloWorld.java"
.method public constructor ()V
.registers 1
.prologue
invoke-direct {p0}, Ljava/lang/Object;->()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设备中导入文件,需要获得所操作文件夹的读写权限。