付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026 综合岗事业编面试高频题集 含答案
- HTML开发就业前景解析
- 肺功能AI诊断技术
- 小学英语教资面试语法真题演练 2026下半年
- 2026年运城市烟草专卖局人员招聘笔试参考题库及答案详解
- 2026年天津国有资本投资运营有限公司人员招聘参考题库及答案详解
- 软考系统集成项目管理工程师论文题库
- 2026年三门峡市烟草专卖局人员招聘考试题库及答案详解
- 水痘诊疗专家共识(2026版)
- 物业设施年度维保计划方案
- 2026秋人教版(新教材)一年级数学(上)第四单元学情测试卷含参考答案
- 中国慢性肾脏病筛查、诊断及治疗临床实践指南(2026版)
- 室内装修改造工程安全风险评估报告
- 2026年湖北省武汉市中考数学试卷(含答案及详解)
- 【沪教版必修第一册】高一数学第4章幂函数、指数函数与对数函数(单元复习课件)
- 2026年小学生心理健康教育课件
- 《JBT 15061-2025提耙式刮泥机》专题研究报告
- 2.5+中国现当代音乐(1)课件-高一音乐湘教版(2019)必修1+音乐鉴赏
- 数字遗产保护法律框架研究课题申报书
- GD2016《2016典管》火力发电厂汽水管道零件及部件典型设计(取替GD2000)-601-700
- 2026中国资源循环集团有限公司校园招聘备考题库附答案
评论
0/150
提交评论