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

来源:互联网 发布:淘宝网首页制作 编辑:程序博客网 时间:2024/06/03 21:28

最近看完丰虫大大的《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设备中导入文件,需要获得所操作文件夹的读写权限。

原创粉丝点击