用smali寫一個java加法程序和HelloWorld程序

最近看完豐蟲大大的《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設備中導入文件,需要獲得所操作文件夾的讀寫權限。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章