Smali从入门到精通(一)之初步认识Smali

转载请声明出处:https://blog.csdn.net/YoYo_Newbie/article/details/90745115

官方吐槽:什么是Smali

smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。

修改Smali文件有什么作用?

通过修改使用工具将Apk反编译生成的smali文件,可以重新生成新的Apk进行使用。

怎么得到Smali文件?

通过反编译Java,生成Smali(可以使用apktool工具可进行反编译), 如xx.Test.java 反编译==> xx.Test.smali

实践分析

构建一个包名为csdn.yoyo_newbie.smalianalyzesampleTest.java文件

package csdn.yoyo_newbie.smalianalyzesample;
public class Test {
    public Test(){
        super();
    }
}

使用apktool进行反编译生成的Smali文件:

csdn\yoyo_newbie\smalianalyzesample\Test.smali

.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test;
.super Ljava/lang/Object;
.source "Test.java"


# direct methods
.method public constructor <init>()V
    .locals 0
****
    .prologue
    .line 5
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 6
    return-void
.end method

如下,第一行 ,代表声明一个public的class ,它的className为"csdn.yoyo_newbie.smalianalyzesample.Test.class",
其中L代表是对象类型

.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test

第二行,代表它继承的父类为 java.lang.Object.class

.super Ljava/lang/Object;

第三行,代表这个csdn.yoyo_newbie.smalianalyzesample.Test.class来自Test.java个文件

.source “Test.java”

为什么还要声明来自哪里,一定就是Test.java这个文件无疑,不是多此一举吗?一开始我也是这样想的,当我深思后才恍然大悟,不是有内部类吗?请看下面代码


package csdn.yoyo_newbie.smalianalyzesample;

public class Test {
    public Test(){
        super();
    }

    public static class Show{

    }
}

编译后,会生成2个文件

csdn\yoyo_newbie\smalianalyzesample\Test.smali

.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test;
.super Ljava/lang/Object;
.source "Test.java"
................... 此处省略其他代码

csdn\yoyo_newbie\smalianalyzesample\Test$Show.smali


.class public Lcsdn/yoyo_newbie/smalianalyzesample/Test$Show;
.super Ljava/lang/Object;
.source "Test.java"

...................  此处省略其他代码


有没有发现!内部类Show的.Source的值也是Test.java.

本次内容,就到这里,下面的代码暂时不讲解,将在下一篇分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章