smali语法及移植简介_第1页
smali语法及移植简介_第2页
smali语法及移植简介_第3页
smali语法及移植简介_第4页
smali语法及移植简介_第5页
免费预览已结束,剩余40页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2Smali语法1Smali定义及文件获取3Smali移植4参考资料1IBM©

2012

IBMCorporationSmali的定义及文件提取定义smali是dalvik虚拟机执行的代码。文件提取通过ApkTool反编译apk

或者jar

可以得到Smali文件包。2IBM©

2012

IBMCorporation2Smali语法1Smali定义及文件获取3Smali移植4参考资料3IBM©

2012

IBMCorporationSmali语法寄存器的长度在dalvik字节码中,寄存器都是32位的,能够支持任何类型。64位的数据类型(Long和Double型)需要用2个寄存器

。寄存器名V命名法:V0表示第一个寄存器。P命名法:P0表示method上下文中第一个local寄存器,主要用于method中。在method的上下文中,

时候P0和V0并非完全指向同一个寄存器。因为method上下文中,在非static

methoad运行时,需要有部分序列偏小的寄存器(如V0)来

此method的调用者对象句柄。4IBM©

2012

IBMCorporationSmali语法注释#注释语句如:#

static

fileds5IBM©

2012

IBMCorporationSmali语法数据类型之原始类型Smali语法表示Java语法表示Vvoid(只能用在method

返回值)ZbooleanBbyteSshortCcharIintJlong(64位)FfloatDdouble

(64位)6IBM©

2012

IBMCorporationSmali语法数据类型之类型Smali语法表示Java语法表示Landroid/content/Context

;Android.content.Context对象以Lpackage/name/ObjectName;的形式表示。前面的L表示这是一个对象类型,package/name/是该对象所在的包,ObjectName是对象的名字,“;”表示对象名称的结束。相当于java中的.ObjectName。7IBM©

2012

IBMCorporationSmali语法数据类型之数组类型Smali语法表示Java语法表示[Iint[](表示一个int类型的一维数组)[[Iint[][](表示一个int类型的二维数组)[[[Sshort[][](表示一个short类型的三维数组)[Ljava/lang/String;String[](表示一个String对象类型的一维数组)注意:

每一维的元素个数最多是255个。8IBM©

2012

IBMCorporationSmali语法类的成员变量定义与初始化.field

(可见性修饰符)

(静态修饰符)

(类型修饰符)名称:类型

=初始化值如:.field

public

static

final

SYSTEM_NAME:Ljava/lang/String;

=

"Android"9IBM©

2012

IBMCorporationSmali语法类的方法体定义.method(

修饰符)

(静态修饰符)

方法名(参数1

参数2

)

返回值.Locals

需要的寄存器数量.end

method如:.method

public

staticgetBitmap(I[[IILjava/lang/String;[Ljava/lang/Object;)Landroid/graphics/Bitmap;.locals

6.end

method总共5个参数,1个寄存器存放此方法的caller对象

。10IBM©

2012

IBMCorporationSmali语法指令的根据Smalii指令的不同,可以有16,256或64K寄存器可以

。同时,对long和double值的操作使用两个寄存器,例如使用V0寄存器long型数据,实际使用了两个寄存器(V0,V1)。11IBM©

2012

IBMCorporationSmali语法指令类型:数据移动方法返回值存放常量定义数组goto跳转switch跳转if跳转数据比较数组元素操作对象成员变量操作。寄存器偏移量式数据拷贝类静态成员变量操作方法调用其他12IBM©

2012

IBMCorporationSmali语法指令之常量定义指令格式指令意义示例示例解释const

vx,lit32把int常量(32位)

在vx寄存器中。const

v0,#12345678把整数12345678

在v0寄存器中。const/16vx,lit16同上,数据是16位的。const/16

v0,#int

10把整数10存放在v0寄存器中。const/4vx,lit4同上,数据是4位的。const/4

v1,#int2同上,整数是2。const/high16v0,

lit16同上,数据 在v0寄存器高端位const/high16v0,

#float

10.0同上,数据是float的整数部分。const-wide/16

vx,lit16同上,数据是16位的,会转换成long,,且存储在vx,v(x+1)const-wide/16v0,

#long

10同上,数据

在v0,

v1const-wide/32

vx,lit32同上,数据是32位,

会转换成

long。

在vx,

v(x+1)const-wide/32v2,

#long12345678同上,数据

在v2,v313IBM©

2012

IBMCorporationSmali语法指令之数组指令格式指令意义示例示例解释array-lengthvx,vy统计vy指向数组的元素个数,并把结果在vx寄存器中。array-length

v1,v1计算v1指向数组元素个数并把结果存在在v1寄存器中。new-instancevx,type初始化type一个新的对象实例,并把

句柄存放在vx寄存器中。new-instance

v0java.io.FileInputStream新建一个FileInputStream对象实例,并把其存放在v0寄存器中。new-arrayvx,vy,type_id创建vy寄存器表示个数的type_id对象,并把数组

存放在vx寄存器。new-array

v2,

v1,char[]创建v1个char[],并把数组存放在v2寄存器。filled-new-array{parameters},type_id创建type_id类型的数组,个数与{parameters}等价,数组初始化值由{parameters}指定。同时该创建的对象可以通过立即执行move

result-object获取到filled-new-array{v0,v0},[I创建2个int[]数组,数组元素均用v0寄存器数据填充。filled-new-array-range{vx..vy},type_id同上,不过parameter使用序列表示的。filled-new-array/range{v19..v21},

[B创建3个元素的boolean[]数组,每个元素分别用v19,v20,v21的寄存器数据赋值。14IBM©

2012

IBMCorporationSmali语法指令之数组指令格式指令意义示例示例解释fill-array-data用静态数据填充vx指向的数组元素。静态数fill-array-data

v6,用当前地址+25H处静态vx,array_data据地址是当前指令地址+array_data_offset00e6数据来填充v6指向数组元_offset素。静态数据格式:0003:表格类型:静态数据0400:用4个字节来填充一个数组元素0300

0000:数据个数30100

0000:元素10200

0000:元素20300

0000:元素315IBM©

2012

IBMCorporationSmali语法指令之数据移动指令格式指令意义示例示例解释move

vx

vy把寄存器Vy

数据移动到Vx的寄存器,且Vx,Vy仅仅限于0~255号寄存器move

v0

v1把v1中数据移动到v0move/from16

vx,vy同上,vy可以是16k范围内的寄存器move/from16

v0,

v25把v25中数据移动到v0move-wide/from16

vx,vy同上,数据是long/double,

使用两个寄存器

。move-wide/from16

v22,v0把v0中数据移动到v22move-object

vx,vy同上,数据是object

。move-object

v1,

v8把v8中数据移动到v1move-object/from16

vx,vy同上,vy可以是16范围内的寄存器。move-object/from16

v1,v21把v21中数据移动到v116IBM©

2012

IBMCorporationSmali语法指令之数据移动指令格式指令意义示例示例解释move-resultvx把前一个方法调用的结果值存放在寄存器vx中move-result

v0把前一个方法调用返回值存放到v0中。move-result-wide

vx同上,存放的数据long/doublemove/from16

v0,v25把前一个方法调用返回值存放到v25中。move-result-object

vx同上,存放的数据是Objectmove-result-object

v0把前一个方法调用返回值存放到v0中。move-exception

vx把方法调用中产生的异常对象

存放到寄存器vxmove-exceptionv25把异常对象

存放到寄存器v2517IBM©

2012

IBMCorporationSmali语法指令之方法返回值存放指令格式指令意义示例示例解释return-void此方法没有返回值。return-void此方法没有返回值。return

vx把此方法返回值存放在vx寄存器return

v0把方法返回值存放在v0寄存器。return-widevx同上,返回值是long/doublereturn

–wide

v0同上,数据存放在v0,v1。return-objectvx同上,返回值是对象return-object

v0同上,数据是对象

。18IBM©

2012

IBMCorporationSmali语法指令之goto跳转指令格式指令意义示例示例解释goto无条件跳转goto

0005无条件跳转到005

label处goto/16同上goto/16

002f无条件跳转到002F

label处goto/32同上19IBM©

2012

IBMCorporationSmali语法指令之switch跳转指令格式指令意义示例示例解释packed-switchvx,table构建一个swiitch语句,从当前指令

+

table偏移量取得case

表,如果某项与vx寄存器数值对应,则执行对应的指令packed-switchv2,

000c到当前指令地址+0cH偏移处,取得case

表,与v2寄存器值对比执行。Case

常量表个数如下:0001://类型:switch

case表格0300//元素数量0000

0000//元素基值0500

0000

//

case

0://

case

1:

+

000000700900

0000

//

case

2:

+

00000090sparse-switchvx,table同上sparse-switchv2,

000c到当前指令地址+0cH偏移处,取得case

表,与v2寄存器值对比执行。查找表格式如下:0002://类型:spareswitch表格0300//元素数量9cff

ffff

//

case

1:

-100Fa00

0000

//

case

2:

250E803

0000

//

case

3:

10000500

0000//case

1

偏移://case

2

偏移://case3偏移:+920IBM©

2012

IBMCorporationSmali语法指令之if

跳转指令格式指令意义示例示例解释if-eqvx,vy,如果vx,vy寄存器的int值相等,则跳转到处if-eq

v3,

v11,0080如果v3,v11寄存器数据相等,则跳转到label

0080if-nevx,vy,vx

!=

vyif-ne

v3,

v10,002c如果v3,v10寄存器数据不相等,则跳转到label002cif-levx,vy,vx

<=

vyif-le

v6,

v5,

0144如果v6寄存器数据小于等于v5,则跳转到label0023if-ltvx,vy,vx<

vyif-lt

v2,

v3,

0023如果v2寄存器数据小于v3,则跳转到label

0023if-ge

vx,vy,vx>=

vyif-ge

v0,

v1,

002b如果v0寄存器数据大于等于v1,则跳转到label002bif-gtvx,vy,vx

>

vyif-ge

v0,

v1,002b如果v0寄存器数据大于v1,则跳转到label

002b21IBM©

2012

IBMCorporationSmali语法指令之if

跳转指令格式指令意义示例示例解释if-eqz

vx,vx

==0if-eqz

v2,

0038如果v2寄存器数据是0,则跳转到对应的labelif-nez

vx,vx

!=

0if-nez

v2,

0014如果v2寄存器数据不是0,则跳转到对应的labelif-ltz

vx,vx

<

0if-ltz

v0,

002d如果v0寄存器数据小于0,则跳转到对应的labelIf-lez

vx,vx

<=

0if-gez

v0,

002d如果v0寄存器数据小于等于0,则跳转到对应的labelif-gtz

vx,vx

>0if-gtz

v0,

004a如果v0寄存器数据大于0,则跳转到对应的labelif-gez

vx,vx

>=0if-gez

v0,

002d如果v0寄存器数据大于等于0,则跳转到对应的label22IBM©

2012

IBMCorporationSmali语法指令之数据比较指令格式指令意义示例示例解释cmpg-float

vx,

vy,vzfloat数据对比cmpg-float

v0,

v6,v7对比v6,v7寄存器结果,并把结果存放到v0寄存器。cmpl-doublevx,vy,vzDouble数据对比cmpg-double

v0,v8,

v10同上cmp-long

vx,

vy,

vzLong数据对比23IBM©

2012

IBMCorporationSmali语法指令之数组元素操作aget

(- )

Vx,

Vy,

Vz从Vy标示的数组中提取Vz位置的元素到Vx寄存器。其中-

是可选的,可以是:wide,object,boolean,byte,char,short,如:aget-boolean

v0,

v0,

v124IBM©

2012

IBMCorporationSmali语法指令之数组元素操作aput

(- )

Vx,

Vy,

Vz把Vx寄存器中数据

到Vy标示的数组中Vz位置的元素处。其中-

是可选的,可以是:wide,object,boolean,byte,char,short,如:aput-boolean

v0,

v0,

v125IBM©

2012

IBMCorporationSmali语法指令之对象成员变量操作Iget(- )

vx,

vy,

field_idVy寄存器

的对象成员变量field_id值到Vx寄存器。其中-

是可选的,可以是:wide,object,boolean,byte,char,short,如:iget-object

v1,

v2,

LineReader.fis:Ljava/io/FileInputStream;26IBM©

2012

IBMCorporationSmali语法指令之对象成员变量操作iput

(- )

vx,vy,

field_id把Vx寄存器的数据赋值到Vy指向的对象域成员变量field_id。其中-

是可选的,可以是:wide,object,

boolean,byte,char,short,如:iput-object

v0,

v2,

LineReader.bis:Ljava/io/BufferedInputStream;27IBM©

2012

IBMCorporationSmali语法指令之类静态成员变量操作sget(- )

vx,field_id类静态变量field_id值到Vx寄存器。。其中-

是可选的,可以是:wide,object,boolean,byte,char,short,如:sget-object

v1,

Test3.os1:Ljava/lang/Object;28IBM©

2012

IBMCorporationSmali语法指令之类静态成员变量操作sput(- )

vx,field_id把Vx寄存器数据赋值到类静态域变量field_id。其中-

是可选的,可以是:wide,object,boolean,byte,char,short,如:sput-object

v0,

Test3.os1:Ljava/lang/Object;29IBM©

2012

IBMCorporationSmali语法指令之寄存器偏移量式数据拷贝iget-( )quick

Vx

Vy

offset把Vy寄存器值+offset处数据到Vx。其中-

是可选的,

可以是:wide,

object如:iput-quick

v1,

v2,

[obj]30IBM©

2012

IBMCorporationSmali语法指令之寄存器偏移量式数据拷贝Iput-( )quick

Vx

Vy

offset把Vx寄存器数据

到Vy寄存器值

+

offset处。其中-

是可选的,可以是:wide,object如:iput-quick

v1,

v2,

[obj]31IBM©

2012

IBMCorporationSmali语法指令之方法调用指令格式指令意义示例示例解释invoke-super(/range){parameter},methodtocall带参数调用一个虚方法invoke-virtual

{

v4,

v0,

v1,

v2,

v3},Test2.method5:(IIII)Vv4是调用caller句柄,v0~v3是传入参数。invoke-super(/range){parameter},methodtocal带参数调用super方法invoke-super{v1},java.io.FilterOutputStream.close:()Vv1是caller句柄。invoke-direct(/range)

{parameters

},methodtocall带参数直接调用一个方法invoke-direct

{v1},java.lang.Object.<init>:()Vv1是caller句柄。invoke-static(/range){parameters},methodtocall带参数调用一个静态方法invoke-static

{v4},java.lang.Integer.parseInt:(Ljava/lang/String;)Iv4是caller句柄。invoke-interface(-range){parameters},methodtocall带参数调用一个接口invoke-interface

{v1,

v3,

v4,

v5},mwfw.IReceivingProtocolAdapter.receivePackage:(ILjava/lang/String;Ljava/io/InputStream;)Zv1是caller句柄。32IBM©

2012

IBMCorporationSmali语法指令之快捷运算neg -

int|long|long|float|double|

Vx

Vy把Vy寄存器数据做

*

(-1)操作,并把结果

在Vx。如:neg

–double

v2,

v033IBM©

2012

IBMCorporationSmali语法指令类型转换int-to-long

|

float

|

double

Vx

Vylong-to-int

|

float

|

double

Vx

Vyfloat-to-int

|

long

|

double

Vx

Vydouble-to-int

|

long

|

float

Vx

Vy把Vy寄存器数据取出并强制转换第二种对应格式,存放到Vx寄存器。如:double-to-float

v0,

v434IBM©

2012

IBMCorporationSmali语法指令之运算这里的运算包括算数运算,逻辑运算,位运算。支持的类型有3寄存器,2寄存器类型。3寄存器类型格式:运算符-数据类型(/直接数标示)

结果寄存器,

左操作数寄存器,右操作寄存器(直接数标示)如正常情况:add-int

vx,vy,vz:表示Vy+Vz==>Vx也可以使用直接数:add-int

/lit16

vx,vy,#int

1234//表示:1234+Vy==>VxAdd-int/lit8

vx,vy,#int

3//表示3+Vy==>Vx35IBM©

2012

IBMCorporationSmali语法指令之运算2寄存器类型格式:运算符-数据类型/2addr左操作数寄存器,右操作寄存器如正常情况:add-int

/2addr

vx,vy://表示Vx+Vy==>Vx运算支持的数据类型有:int

,

long,

float,

double,算数运算类型:add(加),sub(减),mul(乘),div(除),rem(取余)逻辑运算类型:and(与),or(或),xor(异或)位运算类型:shl(左移),shr(右移),ushr(无符号数右移)36IBM©

2012

IBMCorporationSmali语法指令之其他指令格式指令意义示例示例解释monitor-entervx获取vx寄存器

对象的monitormonitor-enter

v3获取v3寄存器指

象的monitormonitor-exitvx寄存器

对象的monitormonitor-exitv3v3寄存器指

象的monitorcheck-cast

vx,type_id检查vx寄存器指向的对象

是否是type_id类型对象实例,如果不是抛出异常ClassCastException

,否则继续指向check-cast

v4,Test3检查v4寄存器指向的对象是否是Text3类型对象instance-ofvx,vy,type_id检查vy所指向的对象是否是type_id类型对象,如果是则把非零整数

在vx,否则是0instance-of

v0,v4,

Test3查看v4所指

象是否是Test3类型对象,并把结果放置在v0

器。throw

vx抛出一个异常对象,并把其

在vx寄存器。throw

v0抛出异常对象,并把其对象

在v0中。37IBM©

2012

IBMCorporation2Smali语法1Smali定义及文件获取3Smali移植4参考资料38IBM©

2012

IBMCorporationSmali移植移植的目的把OPPO相对于Android原生的代码修改逻辑在Smali文件层级注入到目标厂家目标机型刷机包Smali文件中。39IBM©

2012

IBMCorporationSmali移植移植的步骤通过对比Android原生编译产生的输出和合入OPPO修改后的输出(如

framework.jar,service.jar,android.policy.jar,framework-res.apk等),确定OPPO修改量(基于Smali文件层级)。把目标厂家目标机型刷机包需要修改的文件建立基线。各领域开始移植。各领域依次移植自己修改的文件,

首先找到目标机型中文件

和文件。如果OPPO是(新增类,类方法,类变量)新增修改,直接合入。如果OPPO是基于已有类或者方法,变量的修改,此时需要首先查找目标机型Smali文件在此处相对于Android原生此处是否有修改:如果没有,则直接合入OPPO修改。如果有修改,则需要根据解决OPPO修改,目标厂家修改产生的

。此处非新增的差异性修改,需要进行后续工作如:Smali代码进行本地化(修改变量,跳转符号,逻辑判断符号,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论