Lazy loaded image
安卓逆向
smali语法基础详解
字数 1012阅读时长 3 分钟
2021-11-10
2024-7-5
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 字段指定的内容
上一篇
smali动态调式
下一篇
NDK开发小结

评论
Loading...