smali語法及移植簡介_第1頁
smali語法及移植簡介_第2頁
smali語法及移植簡介_第3頁
smali語法及移植簡介_第4頁
smali語法及移植簡介_第5頁
免費預(yù)覽已結(jié)束,剩余40頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

2Smali語法1Smali定義及文件獲取3Smali移植4參考資料1IBM?

2012

IBMCorporationSmali的定義及文件提取定義smali是dalvik虛擬機執(zhí)行的代碼。文件提取通過ApkTool反編譯apk

或者jar

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

2012

IBMCorporation2Smali語法1Smali定義及文件獲取3Smali移植4參考資料3IBM?

2012

IBMCorporationSmali語法寄存器的長度在dalvik字節(jié)碼中,寄存器都是32位的,能夠支持任何類型。64位的數(shù)據(jù)類型(Long和Double型)需要用2個寄存器

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

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

methoad運行時,需要有部分序列偏小的寄存器(如V0)來

此method的調(diào)用者對象句柄。4IBM?

2012

IBMCorporationSmali語法注釋#注釋語句如:#

static

fileds5IBM?

2012

IBMCorporationSmali語法數(shù)據(jù)類型之原始類型Smali語法表示Java語法表示Vvoid(只能用在method

返回值)ZbooleanBbyteSshortCcharIintJlong(64位)FfloatDdouble

(64位)6IBM?

2012

IBMCorporationSmali語法數(shù)據(jù)類型之類型Smali語法表示Java語法表示Landroid/content/Context

;Android.content.Context對象以Lpackage/name/ObjectName;的形式表示。前面的L表示這是一個對象類型,package/name/是該對象所在的包,ObjectName是對象的名字,“;”表示對象名稱的結(jié)束。相當(dāng)于java中的.ObjectName。7IBM?

2012

IBMCorporationSmali語法數(shù)據(jù)類型之?dāng)?shù)組類型Smali語法表示Java語法表示[Iint[](表示一個int類型的一維數(shù)組)[[Iint[][](表示一個int類型的二維數(shù)組)[[[Sshort[][](表示一個short類型的三維數(shù)組)[Ljava/lang/String;String[](表示一個String對象類型的一維數(shù)組)注意:

每一維的元素個數(shù)最多是255個。8IBM?

2012

IBMCorporationSmali語法類的成員變量定義與初始化.field

(可見性修飾符)

(靜態(tài)修飾符)

(類型修飾符)名稱:類型

=初始化值如:.field

public

static

final

SYSTEM_NAME:Ljava/lang/String;

=

"Android"9IBM?

2012

IBMCorporationSmali語法類的方法體定義.method(

修飾符)

(靜態(tài)修飾符)

方法名(參數(shù)1

參數(shù)2

)

返回值.Locals

需要的寄存器數(shù)量.end

method如:.method

public

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

6.end

method總共5個參數(shù),1個寄存器存放此方法的caller對象

。10IBM?

2012

IBMCorporationSmali語法指令的根據(jù)Smalii指令的不同,可以有16,256或64K寄存器可以

。同時,對long和double值的操作使用兩個寄存器,例如使用V0寄存器long型數(shù)據(jù),實際使用了兩個寄存器(V0,V1)。11IBM?

2012

IBMCorporationSmali語法指令類型:數(shù)據(jù)移動方法返回值存放常量定義數(shù)組goto跳轉(zhuǎn)switch跳轉(zhuǎn)if跳轉(zhuǎn)數(shù)據(jù)比較數(shù)組元素操作對象成員變量操作。寄存器偏移量式數(shù)據(jù)拷貝類靜態(tài)成員變量操作方法調(diào)用其他12IBM?

2012

IBMCorporationSmali語法指令之常量定義指令格式指令意義示例示例解釋const

vx,lit32把int常量(32位)

在vx寄存器中。const

v0,#12345678把整數(shù)12345678

在v0寄存器中。const/16vx,lit16同上,數(shù)據(jù)是16位的。const/16

v0,#int

10把整數(shù)10存放在v0寄存器中。const/4vx,lit4同上,數(shù)據(jù)是4位的。const/4

v1,#int2同上,整數(shù)是2。const/high16v0,

lit16同上,數(shù)據(jù) 在v0寄存器高端位const/high16v0,

#float

10.0同上,數(shù)據(jù)是float的整數(shù)部分。const-wide/16

vx,lit16同上,數(shù)據(jù)是16位的,會轉(zhuǎn)換成long,,且存儲在vx,v(x+1)const-wide/16v0,

#long

10同上,數(shù)據(jù)

在v0,

v1const-wide/32

vx,lit32同上,數(shù)據(jù)是32位,

會轉(zhuǎn)換成

long。

在vx,

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

#long12345678同上,數(shù)據(jù)

在v2,v313IBM?

2012

IBMCorporationSmali語法指令之?dāng)?shù)組指令格式指令意義示例示例解釋array-lengthvx,vy統(tǒng)計vy指向數(shù)組的元素個數(shù),并把結(jié)果在vx寄存器中。array-length

v1,v1計算v1指向數(shù)組元素個數(shù)并把結(jié)果存在在v1寄存器中。new-instancevx,type初始化type一個新的對象實例,并把

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

v0java.io.FileInputStream新建一個FileInputStream對象實例,并把其存放在v0寄存器中。new-arrayvx,vy,type_id創(chuàng)建vy寄存器表示個數(shù)的type_id對象,并把數(shù)組

存放在vx寄存器。new-array

v2,

v1,char[]創(chuàng)建v1個char[],并把數(shù)組存放在v2寄存器。filled-new-array{parameters},type_id創(chuàng)建type_id類型的數(shù)組,個數(shù)與{parameters}等價,數(shù)組初始化值由{parameters}指定。同時該創(chuàng)建的對象可以通過立即執(zhí)行move

result-object獲取到filled-new-array{v0,v0},[I創(chuàng)建2個int[]數(shù)組,數(shù)組元素均用v0寄存器數(shù)據(jù)填充。filled-new-array-range{vx..vy},type_id同上,不過parameter使用序列表示的。filled-new-array/range{v19..v21},

[B創(chuàng)建3個元素的boolean[]數(shù)組,每個元素分別用v19,v20,v21的寄存器數(shù)據(jù)賦值。14IBM?

2012

IBMCorporationSmali語法指令之?dāng)?shù)組指令格式指令意義示例示例解釋fill-array-data用靜態(tài)數(shù)據(jù)填充vx指向的數(shù)組元素。靜態(tài)數(shù)fill-array-data

v6,用當(dāng)前地址+25H處靜態(tài)vx,array_data據(jù)地址是當(dāng)前指令地址+array_data_offset00e6數(shù)據(jù)來填充v6指向數(shù)組元_offset素。靜態(tài)數(shù)據(jù)格式:0003:表格類型:靜態(tài)數(shù)據(jù)0400:用4個字節(jié)來填充一個數(shù)組元素0300

0000:數(shù)據(jù)個數(shù)30100

0000:元素10200

0000:元素20300

0000:元素315IBM?

2012

IBMCorporationSmali語法指令之?dāng)?shù)據(jù)移動指令格式指令意義示例示例解釋move

vx

vy把寄存器Vy

數(shù)據(jù)移動到Vx的寄存器,且Vx,Vy僅僅限于0~255號寄存器move

v0

v1把v1中數(shù)據(jù)移動到v0move/from16

vx,vy同上,vy可以是16k范圍內(nèi)的寄存器move/from16

v0,

v25把v25中數(shù)據(jù)移動到v0move-wide/from16

vx,vy同上,數(shù)據(jù)是long/double,

使用兩個寄存器

。move-wide/from16

v22,v0把v0中數(shù)據(jù)移動到v22move-object

vx,vy同上,數(shù)據(jù)是object

。move-object

v1,

v8把v8中數(shù)據(jù)移動到v1move-object/from16

vx,vy同上,vy可以是16范圍內(nèi)的寄存器。move-object/from16

v1,v21把v21中數(shù)據(jù)移動到v116IBM?

2012

IBMCorporationSmali語法指令之?dāng)?shù)據(jù)移動指令格式指令意義示例示例解釋move-resultvx把前一個方法調(diào)用的結(jié)果值存放在寄存器vx中move-result

v0把前一個方法調(diào)用返回值存放到v0中。move-result-wide

vx同上,存放的數(shù)據(jù)long/doublemove/from16

v0,v25把前一個方法調(diào)用返回值存放到v25中。move-result-object

vx同上,存放的數(shù)據(jù)是Objectmove-result-object

v0把前一個方法調(diào)用返回值存放到v0中。move-exception

vx把方法調(diào)用中產(chǎn)生的異常對象

存放到寄存器vxmove-exceptionv25把異常對象

存放到寄存器v2517IBM?

2012

IBMCorporationSmali語法指令之方法返回值存放指令格式指令意義示例示例解釋return-void此方法沒有返回值。return-void此方法沒有返回值。return

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

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

–wide

v0同上,數(shù)據(jù)存放在v0,v1。return-objectvx同上,返回值是對象return-object

v0同上,數(shù)據(jù)是對象

。18IBM?

2012

IBMCorporationSmali語法指令之goto跳轉(zhuǎn)指令格式指令意義示例示例解釋goto無條件跳轉(zhuǎn)goto

0005無條件跳轉(zhuǎn)到005

label處goto/16同上goto/16

002f無條件跳轉(zhuǎn)到002F

label處goto/32同上19IBM?

2012

IBMCorporationSmali語法指令之switch跳轉(zhuǎn)指令格式指令意義示例示例解釋packed-switchvx,table構(gòu)建一個swiitch語句,從當(dāng)前指令

+

table偏移量取得case

表,如果某項與vx寄存器數(shù)值對應(yīng),則執(zhí)行對應(yīng)的指令packed-switchv2,

000c到當(dāng)前指令地址+0cH偏移處,取得case

表,與v2寄存器值對比執(zhí)行。Case

常量表個數(shù)如下:0001://類型:switch

case表格0300//元素數(shù)量0000

0000//元素基值0500

0000

//

case

0://

case

1:

+

000000700900

0000

//

case

2:

+

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

000c到當(dāng)前指令地址+0cH偏移處,取得case

表,與v2寄存器值對比執(zhí)行。查找表格式如下:0002://類型:spareswitch表格0300//元素數(shù)量9cff

ffff

//

case

1:

-100Fa00

0000

//

case

2:

250E803

0000

//

case

3:

10000500

0000//case

1

偏移://case

2

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

2012

IBMCorporationSmali語法指令之if

跳轉(zhuǎn)指令格式指令意義示例示例解釋if-eqvx,vy,如果vx,vy寄存器的int值相等,則跳轉(zhuǎn)到處if-eq

v3,

v11,0080如果v3,v11寄存器數(shù)據(jù)相等,則跳轉(zhuǎn)到label

0080if-nevx,vy,vx

!=

vyif-ne

v3,

v10,002c如果v3,v10寄存器數(shù)據(jù)不相等,則跳轉(zhuǎn)到label002cif-levx,vy,vx

<=

vyif-le

v6,

v5,

0144如果v6寄存器數(shù)據(jù)小于等于v5,則跳轉(zhuǎn)到label0023if-ltvx,vy,vx<

vyif-lt

v2,

v3,

0023如果v2寄存器數(shù)據(jù)小于v3,則跳轉(zhuǎn)到label

0023if-ge

vx,vy,vx>=

vyif-ge

v0,

v1,

002b如果v0寄存器數(shù)據(jù)大于等于v1,則跳轉(zhuǎn)到label002bif-gtvx,vy,vx

>

vyif-ge

v0,

v1,002b如果v0寄存器數(shù)據(jù)大于v1,則跳轉(zhuǎn)到label

002b21IBM?

2012

IBMCorporationSmali語法指令之if

跳轉(zhuǎn)指令格式指令意義示例示例解釋if-eqz

vx,vx

==0if-eqz

v2,

0038如果v2寄存器數(shù)據(jù)是0,則跳轉(zhuǎn)到對應(yīng)的labelif-nez

vx,vx

!=

0if-nez

v2,

0014如果v2寄存器數(shù)據(jù)不是0,則跳轉(zhuǎn)到對應(yīng)的labelif-ltz

vx,vx

<

0if-ltz

v0,

002d如果v0寄存器數(shù)據(jù)小于0,則跳轉(zhuǎn)到對應(yīng)的labelIf-lez

vx,vx

<=

0if-gez

v0,

002d如果v0寄存器數(shù)據(jù)小于等于0,則跳轉(zhuǎn)到對應(yīng)的labelif-gtz

vx,vx

>0if-gtz

v0,

004a如果v0寄存器數(shù)據(jù)大于0,則跳轉(zhuǎn)到對應(yīng)的labelif-gez

vx,vx

>=0if-gez

v0,

002d如果v0寄存器數(shù)據(jù)大于等于0,則跳轉(zhuǎn)到對應(yīng)的label22IBM?

2012

IBMCorporationSmali語法指令之?dāng)?shù)據(jù)比較指令格式指令意義示例示例解釋cmpg-float

vx,

vy,vzfloat數(shù)據(jù)對比cmpg-float

v0,

v6,v7對比v6,v7寄存器結(jié)果,并把結(jié)果存放到v0寄存器。cmpl-doublevx,vy,vzDouble數(shù)據(jù)對比cmpg-double

v0,v8,

v10同上cmp-long

vx,

vy,

vzLong數(shù)據(jù)對比23IBM?

2012

IBMCorporationSmali語法指令之?dāng)?shù)組元素操作aget

(- )

Vx,

Vy,

Vz從Vy標(biāo)示的數(shù)組中提取Vz位置的元素到Vx寄存器。其中-

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

v0,

v0,

v124IBM?

2012

IBMCorporationSmali語法指令之?dāng)?shù)組元素操作aput

(- )

Vx,

Vy,

Vz把Vx寄存器中數(shù)據(jù)

到Vy標(biāo)示的數(shù)組中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寄存器的數(shù)據(jù)賦值到Vy指向的對象域成員變量field_id。其中-

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

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

v0,

v2,

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

2012

IBMCorporationSmali語法指令之類靜態(tài)成員變量操作sget(- )

vx,field_id類靜態(tài)變量field_id值到Vx寄存器。。其中-

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

v1,

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

2012

IBMCorporationSmali語法指令之類靜態(tài)成員變量操作sput(- )

vx,field_id把Vx寄存器數(shù)據(jù)賦值到類靜態(tài)域變量field_id。其中-

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

v0,

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

2012

IBMCorporationSmali語法指令之寄存器偏移量式數(shù)據(jù)拷貝iget-( )quick

Vx

Vy

offset把Vy寄存器值+offset處數(shù)據(jù)到Vx。其中-

是可選的,

可以是:wide,

object如:iput-quick

v1,

v2,

[obj]30IBM?

2012

IBMCorporationSmali語法指令之寄存器偏移量式數(shù)據(jù)拷貝Iput-( )quick

Vx

Vy

offset把Vx寄存器數(shù)據(jù)

到Vy寄存器值

+

offset處。其中-

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

v1,

v2,

[obj]31IBM?

2012

IBMCorporationSmali語法指令之方法調(diào)用指令格式指令意義示例示例解釋invoke-super(/range){parameter},methodtocall帶參數(shù)調(diào)用一個虛方法invoke-virtual

{

v4,

v0,

v1,

v2,

v3},Test2.method5:(IIII)Vv4是調(diào)用caller句柄,v0~v3是傳入?yún)?shù)。invoke-super(/range){parameter},methodtocal帶參數(shù)調(diào)用super方法invoke-super{v1},java.io.FilterOutputStream.close:()Vv1是caller句柄。invoke-direct(/range)

{parameters

},methodtocall帶參數(shù)直接調(diào)用一個方法invoke-direct

{v1},java.lang.Object.<init>:()Vv1是caller句柄。invoke-static(/range){parameters},methodtocall帶參數(shù)調(diào)用一個靜態(tài)方法invoke-static

{v4},java.lang.Integer.parseInt:(Ljava/lang/String;)Iv4是caller句柄。invoke-interface(-range){parameters},methodtocall帶參數(shù)調(diào)用一個接口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寄存器數(shù)據(jù)做

*

(-1)操作,并把結(jié)果

在Vx。如:neg

–double

v2,

v033IBM?

2012

IBMCorporationSmali語法指令類型轉(zhuǎn)換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寄存器數(shù)據(jù)取出并強制轉(zhuǎn)換第二種對應(yīng)格式,存放到Vx寄存器。如:double-to-float

v0,

v434IBM?

2012

IBMCorporationSmali語法指令之運算這里的運算包括算數(shù)運算,邏輯運算,位運算。支持的類型有3寄存器,2寄存器類型。3寄存器類型格式:運算符-數(shù)據(jù)類型(/直接數(shù)標(biāo)示)

結(jié)果寄存器,

左操作數(shù)寄存器,右操作寄存器(直接數(shù)標(biāo)示)如正常情況:add-int

vx,vy,vz:表示Vy+Vz==>Vx也可以使用直接數(shù):add-int

/lit16

vx,vy,#int

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

vx,vy,#int

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

2012

IBMCorporationSmali語法指令之運算2寄存器類型格式:運算符-數(shù)據(jù)類型/2addr左操作數(shù)寄存器,右操作寄存器如正常情況:add-int

/2addr

vx,vy://表示Vx+Vy==>Vx運算支持的數(shù)據(jù)類型有:int

,

long,

float,

double,算數(shù)運算類型:add(加),sub(減),mul(乘),div(除),rem(取余)邏輯運算類型:and(與),or(或),xor(異或)位運算類型:shl(左移),shr(右移),ushr(無符號數(shù)右移)36IBM?

2012

IBMCorporationSmali語法指令之其他指令格式指令意義示例示例解釋monitor-entervx獲取vx寄存器

對象的monitormonitor-enter

v3獲取v3寄存器指

象的monitormonitor-exitvx寄存器

對象的monitormonitor-exitv3v3寄存器指

象的monitorcheck-cast

vx,type_id檢查vx寄存器指向的對象

是否是type_id類型對象實例,如果不是拋出異常ClassCastException

,否則繼續(xù)指向check-cast

v4,Test3檢查v4寄存器指向的對象是否是Text3類型對象instance-ofvx,vy,type_id檢查vy所指向的對象是否是type_id類型對象,如果是則把非零整數(shù)

在vx,否則是0instance-of

v0,v4,

Test3查看v4所指

象是否是Test3類型對象,并把結(jié)果放置在v0

器。throw

vx拋出一個異常對象,并把其

在vx寄存器。throw

v0拋出異常對象,并把其對象

在v0中。37IBM?

2012

IBMCorporation2Smali語法1Smali定義及文件獲取3Smali移植4參考資料38IBM?

2012

IBMCorporationSmali移植移植的目的把OPPO相對于Android原生的代碼修改邏輯在Smali文件層級注入到目標(biāo)廠家目標(biāo)機型刷機包Smali文件中。39IBM?

2012

IBMCorporationSmali移植移植的步驟通過對比Android原生編譯產(chǎn)生的輸出和合入OPPO修改后的輸出(如

framework.jar,service.jar,android.policy.jar,framework-res.apk等),確定OPPO修改量(基于Smali文件層級)。把目標(biāo)廠家目標(biāo)機型刷機包需要修改的文件建立基線。各領(lǐng)域開始移植。各領(lǐng)域依次移植自己修改的文件,

首先找到目標(biāo)機型中文件

和文件。如果OPPO是(新增類,類方法,類變量)新增修改,直接合入。如果OPPO是基于已有類或者方法,變量的修改,此時需要首先查找目標(biāo)機型Smali文件在此處相對于Android原生此處是否有修改:如果沒有,則直接合入OPPO修改。如果有修改,則需要根據(jù)解決OPPO修改,目標(biāo)廠家修改產(chǎn)生的

。此處非新增的差異性修改,需要進行后續(xù)工作如:Smali代碼進行本地化(修改變量,跳轉(zhuǎn)符號,邏輯判斷符號,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論