关于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的地方,如下调用就可以了。

posted @ 2015-12-23 23:11  简单地快乐  阅读(4104)  评论(0编辑  收藏  举报