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

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

1.java加法程序:

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

.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文件:
用smali写一个java加法程序和HelloWorld程序_第1张图片
导入Android设备:
用smali写一个java加法程序和HelloWorld程序_第2张图片
最后,运行.dex文件:
用smali写一个java加法程序和HelloWorld程序_第3张图片
可以看到:向main()方法输入两个参数5、5,最后得到结果10。

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

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

.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文件:
用smali写一个java加法程序和HelloWorld程序_第4张图片
将.dex文件导入Android手机:
用smali写一个java加法程序和HelloWorld程序_第5张图片
运行.dex文件:
用smali写一个java加法程序和HelloWorld程序_第6张图片
这样,所有步骤就都完成了,需要注意的是,向Android设备中导入文件,需要获得所操作文件夹的读写权限。

你可能感兴趣的:(apk逆向)