发新帖

smali 自定义log注入简单用法

[复制链接]
9946 2
上班没事干,给新手朋友一点帮助:)
smali 自定义 log 注入

下面要用smali代码 解决2个问题
1.Logg类怎么写
2.注入类logg 如何调用

不会写smali 怎么办,不用怕 有IDE
先看 工程结构

http://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放入更目录勒,等会再回答。

Logg

java 代码

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

入口类

mainActivity

public 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类,所以会报错。

那么问题来了如何调用了, 呵呵 看下面


http://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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复

精彩评论2

grey    发表于 2015-10-21 19:22:43 | 显示全部楼层
习惯用Markdown 这格式

举报 使用道具

回复 支持 反对
chenjingyes    发表于 2015-10-23 23:14:55 | 显示全部楼层
xx1分享!!

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表