转自:http://bbs.pediy.com/showthread.php?t=151769
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
dalvik字节码有两种类型,原始类型和引用类型。对象和数组是引用类型,其它都是原始类型。
Vvoid,只能用于返回值类型
Zboolean
Bbyte
Sshort
Cchar
Iint
Jlong(64位)
Ffloat
Ddouble(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中则为:
Stringmethod(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第一个localregister
v1第二个localregister
v2p0第一个parameterregister
v3p1第二个parameterregister
v4p2第三个parameterregister
你可以用任何一种方式来引用参数寄存器——他们没有任何差别。
注意:baksmali默认对参数寄存器使用P命名方式。如果想使用V命名方式,可以使用-pl—no-parameter-registers选项。
使用P命名方式是为了防止以后如果要在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点。
Long/Double值
Long和double类型是64位的,需要2个寄存器(切记切记)。
例如,对于非静态方法LMyObject;->MyMethod(IJZ)V,参数分别是LMyObject;,int,long,bool。故该方法需要5个寄存器来存储参数。
p0this
p1I
p2,p3J
p4Z
|
补充:#staticfields定义静态变量的标记#instancefields定义实例变量的标记#directmethods定义静态方法的标记#virtualmethods定义非静态方法的标记构造函数的返回类型为V,名字为<init>。if-eqp1,v0,:cond_8表示如果p1和v0相等,则执行cond_8的流程::cond_8invoke-direct{p0},Lcom/paul/test/a;->d()V调用com.paul.test.a的d()方法if-nep1,v0,:cond_b表示不相等则执行cond_b的流程::cond_bconst/4v0,0x0invoke-virtual{p0,v0},Lcom/paul/test/a;->setPressed(Z)Vinvoke-super{p0,p1,p2},Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Zmove-resultv0大概意思就是调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法,最后returnv0
举两个例子:
sget-objectv5,Lcom/google/youngandroid/runtime;->Lit227:Lgnu/mapping/SimpleSymbol;
获取com.google.youngandroid.runtime中的Lit227字段存入v5寄存器,相当于
gnu.mapping.SimpleSymbollocalVariable=com.google.youngandroid.runtime.Lit227;
sput-objectv0,Lcom/google/youngandroid/runtime;->Lit78:Lkawa/lang/SyntaxTemplate;
Likewise,thisissettingthevalueofastaticfield.i.e.
设置com.google.youngandroid.runtime.Lit78的值为v0寄存器中的kawa.lang.SyntaxTemplate类型变量的值。相当于com.google.youngandroid.runtime.Lit78=kawa.lang.SyntaxTemplatelocalVariable;
剩下的比较简单你应该能明白了。
分享到:
相关推荐
### Smali语法详解 #### 一、概述 Smali是一种基于文本的人可读中间语言,用于Dalvik虚拟机(DVM)字节码。它与Java的字节码类似但并非完全相同,主要应用于Android应用的逆向工程、调试及修改。本文档将详细介绍...
标题中的"smali语法高亮"指的是在Notepad++中为smali代码设置特定的颜色和样式,使得关键字、常量、变量和注释等各部分有明显的区分,提高代码的视觉效果,帮助开发者快速识别和解析语句结构。这在处理大量smali代码...
**smali语法中文详解** smali是一种用于解析和构建Android应用程序DEX文件的汇编语言,它是Dalvik虚拟机(Dalvik VM)字节码的表示形式。Dalvik虚拟机是Google专为Android平台设计的,它使用DEX(Dalvik Executable...
在本文档中,我们将总结 Smali 代码的基本概念、数据类型、语法结构和跳转语句等知识点。 一、基本概念 Smali 代码是 Android Dalvik 虚拟机执行的语言,用于描述 Android 应用程序的实现细节。在反编译 APK 文件...
Smali语法简洁,与Java相比,虽然更接近机器语言,但仍然具有较高的可读性。 **2. BakSmali的作用** BakSmali是Smali的反编译器,它将.dex文件转换为Smali代码。这个过程被称为“反汇编”(disassembly)。BakSmali...
因此,Smali代码可以视为Java代码的底层表示,尽管两者在语法上存在显著差异,但它们之间存在着一一对应的关系。Smali2Java就是建立这种关系的桥梁,将晦涩难懂的Smali还原为易于理解的Java代码。 三、Smali2Java的...
J2S2J1.3.zip可能是一个工具,用于将smali代码转换为Java源代码,使得那些不熟悉smali语法的人也能理解和修改反编译后的代码。这种转换工具对于没有汇编语言背景的开发者来说非常实用,可以提升分析效率。 5. **...
Smali语言使用特定的语法来展示类定义、方法、字段以及其他组件。 当涉及到HTC SENSE的经典界面全屏来电大头贴时,步骤包含了:解开apk文件、提取资源文件与classes.dex文件、使用反编译工具将dex文件转换为smali...
- **smali目录**:反编译后的Dalvik字节码(DEX文件)被转换成Smali语法,这是一种人类可读的Dalvik汇编语言。 - **classes.dex**:原始的Dalvik执行文件,包含了应用的Java类和方法。 4. **修改与重新打包**: ...
1. **Smali语法**:类似于汇编,但具有更清晰的结构,每行代表一条Dalvik指令。 2. **反编译与编译**:使用工具如dex2jar和JD-GUI可以将.dex文件反编译为Java源代码,再通过Smali将Java代码转回.dex,形成一个完整的...
在Android系统中,`odex`...这个过程涉及到对Android系统、Dalvik虚拟机、Smali语法以及文件系统的深入理解。通过这样的修改,可以增强`uiautomator`的健壮性,使其能更好地应对自动化测试中的各种字符挑战。
smali是一种汇编语言,与Java语法类似。转换命令如下: ```bash # 将.jar文件中的.class转换为.smali jad -rfv your_output.jar > your_output.txt baksmali disassemble your_output.jar -o your_smali_directory ...
3. 对于更底层的分析,可以用baksmali将.dex文件反编译为Smali代码,然后用Smali语法进行分析。 4. 使用 jadx 或其他工具将.dex 文件反编译为更易于理解的Java源代码。 5. 通过分析资源文件(如XML布局、字符串资源...
Apktool支持Android的Dalvik字节码到Smali语法的反编译,以及Smali到Dalvik的再编译。 二、Apktool的工作流程 1. **解压APK**:Apktool首先将APK文件解压缩为一个工作目录,包含所有原始文件和资源。 2. **解析资源...
总结,baksmali-2.5.2.jar作为Android开发中的一个重要工具,为开发者提供了深入理解APK内部运作的途径。通过反编译Dalvik字节码,它打开了Android应用的“黑箱”,在调试、逆向工程和安全分析中发挥着重要作用。...
baksmali是由Jake Wharton开发的一个开源项目,它属于dex2jar工具链的一部分,专门用于将Dalvik字节码反编译成Smali语言,这是一种汇编级别的语言,与Java语法类似但更为底层。版本2.1.3是baksmali的一个稳定版本,...
在遇到问题时,要仔细检查文件编码、XML结构以及Smali语法,确保每个细节都符合Android应用的规范。 总结来说,Android手机软件汉化涉及对APK的解包、资源文件的修改、Smali代码的查找和替换,以及重新打包和签名。...
Apktool的工作原理主要包括对APK的ZIP结构进行解压,然后使用Smali语法解析Dalvik字节码,将其转换为人类可读的Smali代码。 其次,“dex2jar”是另一个关键工具,它的作用是将Android应用程序中的“classes.dex”...
- **Smali/baksmali**:用于反汇编和汇编.dex文件,以Smali语法呈现,比Java字节码更底层。 ### 五、注意事项与安全风险 虽然`dex2jar`提供了便利的分析手段,但请注意,未经许可的反编译可能侵犯软件版权。在商业...
Smali是一种与Java类似的汇编语言,尽管语法复杂,但至少比原始字节码更易于理解。通过smali.jar,开发者可以查看并分析应用的函数调用、变量操作等细节,这对于调试、优化或者安全分析都是很有帮助的。 **baksmali...