grey 发表于 2015-10-21 19:15:41

smali 自定义log注入简单用法

上班没事干,给新手朋友一点帮助:)
smali 自定义 log 注入下面要用smali代码 解决2个问题
1.Logg类怎么写
2.注入类logg 如何调用不会写smali 怎么办,不用怕 有IDE
先看 工程结构
file:///C:/Users/user/Documents/My%20Knowledge/temp/0e4a469c-07ef-4c72-80c3-ec34e4340c87_5_files/39bf8ad9-38c6-498e-953b-5e539b8eb002.png需要注入的Logg 放入根目录下编译,在AK里面可以看到smali,
这里大家可能会问为什么吧 Logg放入更目录勒,等会再回答。Loggjava 代码public class Logg {
    public static void log(String str){
      Log.e("info.....", str);
    }
}

smali 代码.class public LLogg;
.super Ljava/lang/Object;
.source "Logg.java"
# direct methods
.method public constructor <init>()V
    .locals 0
    .prologue
    .line 12
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    return-void
.end method
.method public static log(Ljava/lang/String;)V
    .locals 1
    .param p0, "str"    # Ljava/lang/String;
    .prologue
    .line 14
    const-string v0, "info....."
    invoke-static {v0, p0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
    .line 16
    return-void
.end method

入口类mainActivitypublic class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      String str = show();

    }
    public String show(){
      return "abcdefg";
    }

}

这里需要注意,因为Logg类没有包名,java代码调用会找不到Logg类,所以会报错。那么问题来了如何调用了, 呵呵 看下面
file:///C:/Users/user/Documents/My%20Knowledge/temp/0e4a469c-07ef-4c72-80c3-ec34e4340c87_5_files/680e7fd9-38b7-4a26-a22a-7899cf78fdf5.png@Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      String str = show();
      Logg.log(str);

    }

这里会问了为什么不找这么干,别慌 等会解释
在看 smali 代码.class public Lcom/example/smalilog/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"
# direct methods
.method public constructor <init>()V
    .locals 0
    .prologue
    .line 7
    invoke-direct {p0}, Landroid/app/Activity;-><init>()V
    return-void
.end method
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
    .locals 2
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;
    .prologue
    .line 11
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
    .line 12
    const/high16 v1, 0x7f030000
    invoke-virtual {p0, v1}, Lcom/example/smalilog/MainActivity;->setContentView(I)V
    .line 14
    invoke-virtual {p0}, Lcom/example/smalilog/MainActivity;->show()Ljava/lang/String;
    move-result-object v0

    .line 16
    .local v0, "str":Ljava/lang/String;
    invoke-static {v0}, Lcom/example/smalilog/Logg;->log(Ljava/lang/String;)V
    return-void
.end method
.method public show()Ljava/lang/String;
    .locals 1
    .prologue
    .line 18
    const-string v0, "abcdefg"
    return-object v0
.end method

这里只看 关键 调用方法
.line 16
    .local v0, "str":Ljava/lang/String;
    invoke-static {v0}, Lcom/example/smalilog/Logg;->log(Ljava/lang/String;)V

在看Llog 类 头.class public Lcom/example/smalilog/Logg;
.super Ljava/lang/Object;
.source "Logg.java"

这里可以看到大概调用结构,因为调用的是静态方法只需要传参数。invoke-static{v0},L包名 类名;->log(Ljava/lang/String;)V
这么每个注入点 添加 包名 会很麻烦
在看文章开头的log类 smali 头.class public LLogg;
.super Ljava/lang/Object;
.source "Logg.java"

这里文章开头可以解释了.生成的smali ,放入要注入的smali 根目录, 因为没有包名可以任意调用 。。
当然,放里面也行,把生成好的smali头的包名去掉。也就是 log方法的类型。调用方法invoke-static {v0}, LLogg;->log(Ljava/lang/String;)V

在说明下在java中怎样在有名包中引用无名包中的类
除非都是没有包名而且在同一个文件夹下的类才能互相引用
不符合这个条件的必须有包名才能被引用
聪明的你应该想到了 为什么smali 可以调用勒 ????
其他自定义log 可参考
http://www.52pojie.cn/thread-255754-1-1.html

grey 发表于 2015-10-21 19:22:43

习惯用Markdown 这格式 {:5_127:}

chenjingyes 发表于 2015-10-23 23:14:55

xx1分享!!{:4_86:}
页: [1]
查看完整版本: smali 自定义log注入简单用法