首页 > 编程学习 > smali语法基础详解

一、介绍

apk文件通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件。
smali语言是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行。

二、类型

Java中的基本数据类型与Dalvik字节码类型的对应关系

DalvikJava
Bbyte
Cchar
Ddouble
Ffloat
Iint
Sshort
Vvoid
Jlong
Zboolean

*注意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/

本文链接:https://www.ngui.cc/el/3376896.html
Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000