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