samli文件_Android逆向分析:Smali 指令集及文件详解

本文详细介绍了Smali指令集的特点和规则,包括数据操作、数据定义、数据返回、数组操作、数据转换、数据运算、对象操作、跳转指令、比较指令、字段操作和方法调用等,帮助理解Android逆向工程中的Smali代码。
摘要由CSDN通过智能技术生成

指令集特点1 参数采用从目标到源的方式。

2 根据字节码的大小与类型不同,一些字节码添加了名称后缀以消除歧义32位常规类型的字节码未添加任何后缀

64常规类型的字节码添加 -wide 后缀

特殊类型的字节码根据具体类型添加后缀。它们可以是 -boolean、-byte、-char、-short、 -int、-long、-float、-double、-object、-string、-void之一。

3 根据字节码的布局与选项不同,一些字节码添加了字节码后缀以消除歧义。这些后缀通过在字节码主名称后缀添加斜杠“/”来分割开。

4 在指令集的描述中,宽度值中每个字幕表示宽度为4位。

举个例子: move-wide/from16 vAA, vBBBB

该指令表示:move为基础字节码,标识这是基本操作。wide为名称后缀,标识指令操作的数据宽度(64位)。from16为字节码后缀(opcode suffix),标识源为一个16位的寄存器引用变量。vAA为目的寄存器,它始终在源的前面,取值范围为v0~v255。vBBBB为源寄存器,取值范围为v0~v65535。 指令集中大多数指令用到了寄存器作为目的操作数或源操作数,其中 A/B/C/D/E/F/G/H 代表一个4位的数值, 可用来表示v0~v15的寄存器。 AA/BB/.../HH代表一个8位的数值。 AAAA/BBBB/.../HHHH 代表一个16位的数值数据操作指令

数据操作指令为move。move指令的原型为“move destination,source”,move指令根据字节码的大小与类型不同,后面会跟上不同的后缀。 eg:- “move vA, vB”:将vB寄存器的值赋给vA寄存器,源寄存器与目的寄存器都为4位。  - "move /from 16 VAA,VBBBB":将VBBBB寄存器的值赋给VAA寄存器,源寄存器为16位,目标寄存器为8位  - “move /from 16 VAAAA,VBBBB”:将VBBBB寄存器的值赋给VAAAA,源寄存器和目标寄存器都为16位  - “move-wide vA, vB”:为4位的寄存器对赋值。源寄存器与目的寄存器都为4位  - "move-object vA,vB":将vB寄存器中的对象引用赋值给vA寄存器,vA寄存器和vB寄存器都是4位  - "move-result vAA":将上一个“invoke”(方法调用)指令,操作的单字(32位)  - “move-result-wide vAA” :将上一个invoke指令操作的双字(64位)非对象结果赋值给vAA寄存器  - “mvoe-result-object vAA”:将上一个invoke指令操作的对象结果赋值给vAA寄存器  - “move-exception vAA”:保存上一个运行时发生的异常到vAA寄存器

数据定义指令

数据定义指令用来定义程序中用到的常量、字符串、类等数据。它的基础字节码为const。- const/4 vA,#+B 将数值符号扩展为32位后赋给寄存器 vA

- const/16 vAA,#+BBBB 将数值符号扩展为32位后赋给寄存器 vAA

- const vAA,#+BBBBBBBB 将数值赋给寄存器vAA

- const/high16 vAA,#+BBBB0000 将数值右边 0 扩展为32位后赋给寄存器vAA

- const-wide/16 vAA,#+BBBB 将数值符号扩展64位后赋给寄存器对vAA

- const-wide vAA,#+BBBBBBBBBBBBBBBB 将数值赋给寄存器对vAA

- const-wide/high16 vAA,#+BBBB000000000000 将数值右边 0 扩展为64位后付赋值给寄存器 vAA

- const-string vAA,string[@BBBB](https://my.oschina.net/u/205605) 通过字符串索引构造一个字符串并赋给寄存器对 vAA

- const-string/jumbo vAA,string[@BBBBBBBB](https://my.oschina.net/u/2326784) 通过字符串索引(较大) 构造一个字符串并赋值给寄存器对vAA

- const-class vAA,type[@BBBB](https://my.oschina.net/u/205605) 通过类型索引获取一个类引用并赋值给寄存器 vAA

- const-class/jumbo vAAAA,type[@BBBBBBBB](https://my.oschina.net/u/2326784) 通过给定的类型那个索引获取一个类索引并赋值给寄存器vAAAA(这条指令占用两个字节,值为0x00ff,是Android4.0中新增的指令)

数据返回指令

返回指令指的是函数结尾时运行的最后一条指令。它的基础字节码为return,共有以下四条返回指令:- "return-void":表示什么也不返回  - “return vAA”:表示函数返回一个32位非对象类型的值  - “return-wide vAA”:表示函数返回一个64位非对象类型的值  - “return-object vAA”:表示函数返回一个对象类型的值

数组操作指令

数组操作包括读取数组长度、新建数组、数组赋值、数组元素取值与赋值等操作。- array-length vA,vB 获取给定vB寄存器中数组的长度并将值赋给vA寄存器,数组长度指的是数组的条目个数。  - new-array vA,vB,type[@CCCC](https://my.oschina.net/u/157616) 构造指定类型(type@CCCC)与大小(vB)的数组,并将值赋给vA寄存器。  - new-array/jumbo vAAAA,vBBBB,type@CCCCCCCC 指令功能与上一条指令相同,只是寄存器与指令的索引取值范围更大(Android4.0中新增的指令)  - filled-new-array {vC,vD,vE,vF,vG},type@BBBB 构造指定类型(type@BBBB)与大小(vA)的数组并填充数组内容。v

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值