type
status
date
slug
summary
tags
category
icon
password
一、介绍
apk文件通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件。 smali语言是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行。
二、类型
Java中的基本数据类型与Dalvik字节码类型的对应关系
- 注意J、Z两个不是对应类型的首字母;在dalvik字节码中,寄存器都是32位的,能够支持任何类型,Long和Double类型是64位的,需要2个寄存器;V 只能用于返回值类型;
三、描述类的信息
在打开smali文件的时候,它的头三行描述了当前类的一些信息 .class < 访问权限> [ 修饰关键字] < 类名> .super < 父类名> .source <源文件名> .class指令表示当前的类名,类的访问权限是public,类名为LHelloWorld,类开头的L表示后面跟随的字符串是一个类。 .super指定了当前类所继承的父类,后面指的就是这个父类的类名,L表示后面跟的字符串是一个类. 例:
四、静态字段
static fields
.field < 访问权限> static [ 修饰关键字]< 字段名>:< 字段类型> baksmali在生成smali文件时,会在静态字段声明的起始处添加注释”static fields”,注释是以#开头。 访问权限包括:private、protected、public修饰关键字为字段其他属性。 例:
五、实例字段
instance fields
.field < 访问权限> [ 修饰关键字] < 字段名>:< 字段类型> 例:
六、直接方法
直接方法指的是该类中定义的方法。
direct methods
.method <访问权限> [ 修饰关键字] < 方法原型>、 <.registers>、<.locals> [.param][.prologue][.line]<代码体> .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 字段指定的内容
- 作者:404False
- 链接:https://blog.404nofoundx.top//article/787ab7e4-61cb-497d-80b2-4d03d17761e8
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。