關於smali插樁


    雖說是老生常談的東西了,稍微記錄一下。

    我覺得最重要的就是寄存器的問題了,如果需要額外的寄存器,要在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的地方,如下調用就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM