dalvik字节码有两种类型,原始类型和引用类型。对象和数组是引用类型,其它都是原始类型。
V void,只能用于返回值类型
Z boolean
B byte
S short
C char
I int
J long(64位)
F float
D double(64位)
对象以Lpackage/name/ObjectName;的形式表示。前面的L表示这是一个对象类型,package/name/是该对象所在的包,ObjectName是对象的名字,";"表示对象名称的结束。相当于java中的package.name.ObjectName。例如:Ljava/lang/String;相当于java.lang.String
数组的表示形式
[I——表示一个整型一维数组,相当于java中的int[]。
对于多维数组,只要增加[就行了。[[I相当于int[][],[[[I相当于int[][][]。注意每一维的最多255个。
对象数组的表示:[Ljava/lang/String;表示一个String对象数组。
方法
表示形式:Lpackage/name/ObjectName;->MethodName(III)Z
Lpackage/name/ObjectName;表示类型,MethodName是方法名。III为参数(在此是3个整型参数),Z是返回类型(bool型)。
方法的参数是一个接一个的,中间没有隔开。
一个更复杂的例子:
method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
在java中则为:
String method(int, int[][], int, String, Object[])
字段
表示形式:
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
即包名,字段名和各字段类型。
寄存器
在dalvik字节码中,寄存器都是32位的,能够支持任何类型。64位类型(Long和Double型)用2个寄存器表示。
有两种方式指定一个方法中有多少寄存器是可用的。.registers指令指定了方法中寄存器的总数。.locals指令表明了方法中非参寄存器的数量。
方法的传参
当一个方法被调用的时候,方法的参数被置于最后N个寄存器中。如果一个方法有2个参数,5个寄存器(v0-v4),那么参数将置于最后2个寄存器——v3和v4。
非静态方法中的第一个参数总是调用该方法的对象。
例如,非静态方法LMyObject;->callMe(II)V有2个整型参数,另外还有一个隐含的LMyObject;参数,所以总共有3个参数。假如在该方法中指定了5个寄存器(v0-v4),以.registers方式指定5个或以.locals方式指定2个(即2个local寄存器+3个参数寄存器)。当该方法被调用的时候,调用该方法的对象(即this引用)存放在v2中,第一个整型参数存放在v3中,第二个整型参数存放在v4中。
对于静态方法除了没有隐含的this参数外其它都一样。
寄存器的命名方式
有两种方式——V命名方式和P命名方式。P命名方式中的第一个寄存器就是方法中的第一个参数寄存器。在下表中我们用这两种命名方式来表示上一个例子中有5个寄存器和3个参数的方法。
v0 第一个local register
v1 第二个local register
v2 p0 第一个parameter register
v3 p1 第二个parameter register
v4 p2 第三个parameter register
你可以用任何一种方式来引用参数寄存器——他们没有任何差别。
注意:baksmali默认对参数寄存器使用P命名方式。如果想使用V命名方式,可以使用-pl—no-parameter-registers选项。
使用P命名方式是为了防止以后如果要在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点。
Long/Double值
Long和double类型是64位的,需要2个寄存器(切记切记)。
例如,对于非静态方法LMyObject;->MyMethod(IJZ)V,参数分别是LMyObject;,int,long,bool。故该方法需要5个寄存器来存储参数。
p0 this
p1 I
p2,p3 J
p4 Z
补充:
# static fields 定义静态变量的标记
# instance fields 定义实例变量的标记
# direct methods 定义静态方法的标记
# virtual methods 定义非静态方法的标记
构造函数的返回类型为V,名字为<init>。
if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程:
:cond_8
invoke-direct {p0}, Lcom/paul/test/a;->d()V
调用com.paul.test.a的d()方法
if-ne p1, v0, :cond_b 表示不相等则执行cond_b的流程:
:cond_b
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
move-result v0
举两个例子:
sget-object v5, Lcom/google/youngandroid/runtime;->Lit227:Lgnu/mapping/SimpleSymbol;
获取com.google.youngandroid.runtime中的Lit227字段存入v5寄存器,相当于
gnu.mapping.SimpleSymbol localVariable = com.google.youngandroid.runtime.Lit227;
sput-object v0, Lcom/google/youngandroid/runtime;->Lit78:Lkawa/lang/SyntaxTemplate;
Likewise, this is setting the value of a static field. i.e.
设置com.google.youngandroid.runtime.Lit78的值为v0寄存器中的kawa.lang.SyntaxTemplate类型变量的值。相当于com.google.youngandroid.runtime.Lit78 = kawa.lang.SyntaxTemplate localVariable;
剩下的比较简单你应该能明白了。
相关推荐
smali语法中文.pdf smali是一种基于栈的中间语言,用于Android应用程序的反编译和重组。了解smali语法是 Android应用程序逆向工程和安全测试的重要一步。本文将对smali语法进行详细的介绍,包括基本语法、数据类型...
本查看可以使UltraEdit得smali语法高亮. 具体用法: 下载本附件, 并拷贝到UltraEdit安装目录下的wordfiles文件中. 注意: 有可能你把该附件放到wordfiles目录后发现smali语法还是没有高亮. 那一种可能是wordfiles文件...
**SMALI语法详解** 在Android应用开发中,Java源代码经过编译后生成的是Dalvik Executable (DEX) 文件,而SMALI是dex文件的汇编语言形式,它是Android系统中的低级编程语言。SMALI对于理解Android应用程序的工作...
了解Smali语法对于理解APK的工作原理、调试或修改应用程序行为非常有帮助。 1. **Dalvik字节码** - 在Dalvik虚拟机中,每个寄存器都是32位的,可以存储任何类型的数据。64位类型的Long和Double则使用两个连续的...
### Smali中文语法详细说明 #### 一、概述 Smali是一种用于Dalvik虚拟机的汇编语言,它主要用于反编译DEX文件为人类可读的形式。本文将详细介绍Smali的基本语法及其各种操作码的使用方式,这对于理解Android应用...
本资料集合包含了“Android逆向Smali语法”的中文和英文版,对于任何想深入研究Android应用逆向工程的人来说都是不可或缺的资源。 Smali语法是理解和操作Android应用底层代码的关键。它由一系列指令组成,这些指令...
本资源提供了在EditPlus编辑器中对Smali语法的高亮显示支持,让开发者在处理Smali代码时能有更好的视觉体验和工作效率。 首先,我们要理解Smali语法的基本结构。Smali语法遵循Dalvik虚拟机的指令集,每个指令通常由...
editPlus smali 语法文件 editPlus smali 语法文件 editPlus smali 语法文件
### Smali语法详解 #### 一、概述 Smali是一种基于文本的人可读中间语言,用于Dalvik虚拟机(DVM)字节码。它与Java的字节码类似但并非完全相同,主要应用于Android应用的逆向工程、调试及修改。本文档将详细介绍...
### Android 反编译与smali语法:ROM适配的关键技术 #### 一、引言 在Android开发领域,反编译技术与smali语法的应用是进行深度定制、ROM适配以及逆向工程的重要手段。smali作为一种中间语言,与dalvik虚拟机紧密...
然而,Smali语法较为复杂,对于非专业逆向工程师来说,阅读和理解Smali代码是一项挑战。针对这一问题,"Android-通过精简Smali语法细节来增强反编译代码阅读性自定义了一种简单语法"的项目提出了一种解决方案。 该...
Notepad++ smali 语法 高亮, 使smali 源码显示更清晰 更清晰
内容概述:本指南旨在介绍安卓应用逆向工程中使用的SMALI语法,涵盖了SMALI语言的基本语法结构、指令集以及常见的逆向分析技巧。通过学习本指南,读者将能够理解和分析安卓应用程序的SMALI代码,从而进行逆向工程和...
"smali 语法高亮 for sublime text"是一个针对`Sublime Text`的插件,旨在为`smali`代码提供颜色突出显示,使得代码更易于阅读和理解。这个插件将`smali`的关键字、指令、注释等元素用不同的颜色显示,帮助开发者在...
标题中的"smali语法高亮"指的是在Notepad++中为smali代码设置特定的颜色和样式,使得关键字、常量、变量和注释等各部分有明显的区分,提高代码的视觉效果,帮助开发者快速识别和解析语句结构。这在处理大量smali代码...
《深入理解Smali语法》 Smali是一种汇编语言,它是Dalvik虚拟机(Android系统中的虚拟机)的字节码表示形式。了解Smali语法对于Android应用的逆向工程和调试至关重要。以下是对Smali语法核心部分的详细解析: 1. *...
看雪上看到的,转载之 dalvik字节码有两种类型,原始类型和引用类型。对象和数组是引用类型,其它都是原始类型。 V void,只能用于返回值类型 Z boolean B byte S short C char I int J long(64位) ...
表中的 vx、vy、vz 表示某个 Dalvik 寄存器。根据不同指令可以访问 16、256 或 ...boolean 型的值实际是转成 int 型的值进行操作。 所有例子的字节序都采用高位存储格式,例:0F00 0A00 的编译为 0F, 00, 0A, 00 存储。
Smali代码保留了Java源代码的基本结构和语法,但使用了不同的指令集,这对于逆向工程和安全分析非常有用。 **Java语言** Java是广泛使用的面向对象编程语言,以其"一次编写,到处运行"的理念著称。在Android开发中...
中文版的smali语言语法。是学习android反编译的必须文档。