雖說是老生常談的東西了,稍微記錄一下。
我覺得最重要的就是寄存器的問題了,如果需要額外的寄存器,要在smali函數的最前面將寄存器數量增加到需要的數量。
在smali代碼中,寄存器有兩種表示方式,一種是v命名法,一種是p命名法。在v命名法中,從v0開始依次表示局部變量和參數。在p命名法中,從p0開始表示參數,從v0開始表示局部變量。以p命名法為例,在smali函數的開頭,.locals n則表示可以使用v0到vn-1表示局部變量,因此如果插樁的時候需要額外的寄存器,則將.locals n 表示為.locals n+1就可以在插樁的代碼中使用vn了。
我自己寫了一個用來log的smali代碼,將其放入backsmali后的代碼中,並在需要Log的地方調用相應的代碼,最后重新打包,運行后就能看到加入的log信息了。
.class public Liie/wah/smlinject;
.super Ljava/lang/Object;
.source "smlinject.java"
.method public constructor <init>()V
.registers 1
.prologue
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static logString(Ljava/lang/String;)V
.locals 1
.prologue
const-string v0, "WAH"
invoke-static {v0, p0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
return-void
.end method
.method public static logBool(Ljava/lang/Boolean;)V
.locals 2
.prologue
const-string v0, "WAH"
invoke-static {p0}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I
return-void
.end method
.method public static logInt(I)V
.locals 2
.prologue
const-string v0, "WAH"
invoke-static {p0}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
return-void
.end method
在需要加入log的地方,如下調用就可以了。



