一、介绍
apk文件通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件。
smali语言是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行。
二、类型
Java中的基本数据类型与Dalvik字节码类型的对应关系
Dalvik | Java |
---|---|
B | byte |
C | char |
D | double |
F | float |
I | int |
S | short |
V | void |
J | long |
Z | boolean |
*注意J、Z两个不是对应类型的首字母;在dalvik字节码中,寄存器都是32位的,能够支持任何类型,Long和Double类型是64位的,需要2个寄存器;V 只能用于返回值类型;
三、描述类的信息
在打开smali文件的时候,它的头三行描述了当前类的一些信息
.class < 访问权限> [ 修饰关键字] < 类名>
.super < 父类名>
.source <源文件名>
.class指令表示当前的类名,类的访问权限是public,类名为LHelloWorld,类开头的L表示后面跟随的字符串是一个类。
.super指定了当前类所继承的父类,后面指的就是这个父类的类名,L表示后面跟的字符串是一个类.
例:
.class public Lcom/tt/android/xigua/detail/c/a$1;
.super Ljava/lang/Object;
.source "SourceFile"
四、静态字段
#static fields
.field < 访问权限> static [ 修饰关键字]< 字段名>:< 字段类型>
baksmali在生成smali文件时,会在静态字段声明的起始处添加注释”static fields”,注释是以#开头。
访问权限包括:private、protected、public修饰关键字为字段其他属性。
例:
# static fields
.field public static a:Lcom/meituan/robust/ChangeQuickRedirect;
五、实例字段
#instance fields
.field < 访问权限> [ 修饰关键字] < 字段名>:< 字段类型>
例:
# instance fields
.field final synthetic b:Lcom/tt/android/xigua/detail/c/a;
六、直接方法
直接方法指的是该类中定义的方法。
#direct methods
.method <访问权限> [ 修饰关键字] < 方法原型>、
<.registers>、<.locals> [.param][.prologue][.line]<代码体>
.end method
例:
.method public f()Ljava/lang/String;.locals 4.prologue.line 196608const/4 v0, 0x0…………………….line 196609
.end method
#direct methods 是注释,是baksmali添加的,访问权限和修饰关键字 跟字段是一样的。方法原型 描述了
方法的名称、参数与返回值。
.registers 指令指定了方法中寄存器的总数,这个数量是参数和本地变量总和。
.param 表明了方法的参数,每个.param指令表示一个参数,方法使用了几个参数就有几个.parameter指令。
.prologue 指定了代码的开始处,混淆过的代码可能去掉了该指令。
.line 指明了该处代码在源代码中的行号,同样,混淆后的代码可能去掉了行号。
.local 使用这个指定表明方法中非参寄存器
七、虚方法
虚方法指的是从父类中继承的方法或者实现的接口的方法,它的声明跟直接方法相同,
只是起始的初始为“virtual methods”。
#virtual methods
.method <访问权限> [ 修饰关键字] < 方法原型>
<.registers><.locals> [.param] [.prologue] [.line] <代码体>
.end method
八、接口
如果一个类实现了一个接口,那么会在smali文件中用.implements指令指出。
#interfaces
.implements < 接口名>
#interfaces是注释,
.implements 是接口关键字,后面的接口名是 DexClassDef 结构中 interfacesOff 字段指定的内容
# interfaces
.implements Lcom/tt/floatwindow/video/a/d;
console.log("公众号:虫术")
Blog:http://404nofoundx.top/