




下載本文檔
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保公司人事管理制度
- 現(xiàn)場人員健康管理制度
- 現(xiàn)場巡查人員管理制度
- 珠寶公司會議管理制度
- 班級宿舍量化管理制度
- 班級桌子擺放管理制度
- 班組作業(yè)許可管理制度
- 瑣碎物品發(fā)放管理制度
- 琴行設(shè)施設(shè)備管理制度
- 甘肅花椒施肥管理制度
- GB/T 8478-2020鋁合金門窗
- GB/T 11363-2008釬焊接頭強度試驗方法
- GB 12995-2006機動輪椅車
- 40篇短文搞定高考英語3500詞
- 【山東】國際足球運動小鎮(zhèn)概念規(guī)劃方案
- 海氏(hay)職位分析法-介紹、實踐與評價合集課件
- 有趣的英漢互譯-課件
- (參考)菲達公司國內(nèi)電除塵器業(yè)績表
- 步進式加熱爐耐材砌筑施工方案
- GB-T12232-2005- 通用閥門 法蘭連接鐵制閘閥
- 2022年中國電信店長技能四級認證教材
評論
0/150
提交評論